Est-ce que j’obtiens une pénalité de performance lors du mélange d’instructions SSE integer / float SIMD

J’ai utilisé les instructions x86 SIMD (SSE1234) sous la forme d’insortingnsèques assez récemment. Ce que j’ai trouvé frustrant, c’est que le SSE ISA contient plusieurs instructions simples, disponibles uniquement pour les flottants ou uniquement pour les entiers, mais qui, en théorie, devraient fonctionner de la même manière pour les deux. Par exemple, les vecteurs float et double ont tous deux pour instruction de charger 64 bits supérieurs d’un vecteur 128 bits à partir d’une adresse ( movhps , movhpd ), mais il n’existe aucune instruction de ce type pour les vecteurs entiers.

Ma question:

Y a-t-il des raisons de s’attendre à un impact négatif sur les performances lors de l’utilisation d’instructions à virgule flottante sur des vecteurs entiers, par exemple, l’utilisation de movhps pour charger des données sur 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 très difficile d’écrire un test correct qui explore tous les cas critiques pour de telles choses, en particulier lorsque la planification des instructions est probablement impliquée ici.

Question connexe:

D’autres choses sortingvialement similaires ont également plusieurs instructions qui font fondamentalement la même chose. Par exemple, je peux faire des opérations au niveau des bits avec por , orps ou orpd . Quelqu’un peut-il expliquer le but de ces instructions supplémentaires? Je suppose que cela pourrait être lié à différents algorithmes de planification appliqués à chaque instruction.

D’un expert (évidemment pas moi: P): http://www.agner.org/optimize/optimizing_assembly.pdf [13.2 Utiliser des instructions vectorielles avec d’autres types de données que ceux auxquels ils sont destinés (pages 118-119)]:

L’utilisation d’un type d’instructions incorrect sur certains processeurs est pénalisée. En effet, le processeur peut avoir différents bus de données ou différentes unités d’exécution pour les données de nombre entier et à virgule flottante. Le déplacement de données entre les unités à nombre entier et à virgule flottante 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