Ai-je une pénalité de performance lors du mélange d'instructions SSE INTEGER / Float SIMD

StackOverflow https://stackoverflow.com/questions/4996384

Question

J'ai utilisé x86 instructions SIMD (SSE1234) sous la forme d'intrinsèques beaucoup ces derniers temps. Ce que j'ai trouvé frustrant, c'est que le SSE ISA a plusieurs instructions simples qui sont disponibles uniquement pour les flotteurs ou uniquement pour les entiers, mais en théorie, la théorie devrait fonctionner également pour les deux. Par exemple, les vecteurs flottants et doubles ont des instructions pour charger des 64bits plus élevés d'un vecteur 128 bits à partir d'une adresse (movhps, movhpd), mais il n'y a pas une telle instruction pour les vecteurs entiers.

Ma question:

Y a-t-il des raisons de s'attendre à un coup de performance lors de l'utilisation d'instructions de points flottants sur les vecteurs entiers, par exemple en utilisant movhps Pour charger des données à un vecteur entier?

J'ai écrit plusieurs tests pour vérifier cela, mais je suppose que leurs résultats ne sont pas crédibles. Il est vraiment difficile d'écrire un test correct qui explore tous les cas d'angle pour de telles choses, surtout lorsque la planification des instructions est très probablement impliquée ici.

Question connexe:

D'autres choses trivialement similaires ont également plusieurs instructions qui font essentiellement la même chose. Par exemple, je peux faire du bit ou avec por, orps ou ORPD. Quelqu'un peut-il expliquer quel est le but de ces instructions supplémentaires? Je suppose que cela pourrait être lié à différents algorithmes de planification appliqués à chaque instruction.

Était-ce utile?

La solution

D'un expert (évidemment pas moi: P): http://www.agner.org/optimize/optimize_assembly.pdf 13.2 Utilisation d'instructions vectorielles avec d'autres types de données que pour lesquelles ils sont destinés (pages 118-119)]:

Il y a une pénalité pour utiliser le mauvais type d'instructions sur certains processeurs. En effet Le déplacement des données entre les unités entières et les points flottants peut prendre un ou plusieurs cycles d'horloge en fonction du processeur, comme indiqué dans le tableau 13.2.

Processor                       Bypass delay, clock cycles 
  Intel Core 2 and earlier        1 
  Intel Nehalem                   2 
  Intel Sandy Bridge and later    0-1 
  Intel Atom                      0 
  AMD                             2 
  VIA Nano                        2-3 
Table 13.2. Data bypass delays between integer and floating point execution units 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top