Code asm généré [ASM/Intrinsics] - ASM - Programmation
Marsh Posté le 19-11-2004 à 08:15:46
non, rares sont les instructions prenant exclusivement deux registres. La plupart acceptent une operande en mémoire (ce que l'on apelle le load&execute)
Citation : |
yes sir !
Marsh Posté le 19-11-2004 à 09:26:41
Merci pour tes explications.
Y'a tellement de point d'interrogation dans mon premier post que je ne sais pas à quoi correspond ton "non"
Si j'ai bien compris, le load & execute permet d'utiliser des opérandes en mémoire.
Que se passe t'il derrière ? Les opérandes sont chargées dans des registres sse afin que l'opération se fasse bien en même temps sur mes 8 valeurs ? ("non" ? ).
Si oui, est-ce une "bonne" méthode ou bien il est plus efficace de charger çà explicitement dans un registre sse ?
Si ca ne se fait pas comme çà, comment peut-on bénéficier de l'accélération SIMD de l'opération ?
C'est dommage de ne pas pouvoir contrôler "finement" l'utilisation des registres via les intrinsics, çà réduit leur champ d'application si on veut vraiment savoir ce qui se passe derrière. Par exemple pour améliorer "l'instruction pairing", ca ne me semble pas évident (lorsque j'ai effectué plusieurs _mm_add_ps_ entres des vecteurs indépendants, seul le registre xmm0 était utilisé). Me trompje où bien y'a t'il une façon d'utiliser les intrinsics "proprement" ?
Merci !
Marsh Posté le 19-11-2004 à 09:40:33
Evadream -jbd- a écrit : Merci pour tes explications. |
Non
c'est le CPU qui se demerde derriere
padds xmm0,xmm1;
padds xmm0,[eax + 20];
les 2 sont valids
Evadream -jbd- a écrit : |
Bin tu sais, si tu veux du plus fin fo faire de l'asm inline (les intrinsics te vire la gestion des regs, et c'est a peu pres tout)
Marsh Posté le 19-11-2004 à 10:20:30
chrisbk a écrit : |
Ok, merci pour toutes tes précisions !
Marsh Posté le 19-11-2004 à 04:36:55
Bonjour tout le monde,
Je m'intéresse en ce moment, plus par curiosité que par réel besoin, à l'utilisation des instrinsics pour avoir un accès "aisé" aux capacités SIMD des processeurs. Ayant un AthlonXP, j'ai fais qqs essais afin d'exploiter les instructions SSE. J'ai analysé le code asm généré par le compilateur, et cela soulève plusieurs interrogation. (J'ai compilé en Os parce que si je compile en O3, le compilo court circuite les instructions de la boucle et ne fait le "calcul" qu'une seule fois) :
Voici le bout de code et sa "variante" qui vont nous intéresser :
Version de base
Version de base - les lignes de code assembleur qui m'intéressent
Version bis
Version bis - les lignes de code assembleur qui m'intéressent
Les performances pour les deux versions sont les mêmes en -Os, de même en -O3 en introduisant du travail dans la boucle (en changeant la valeur du vecteur a par exemple). (environ 10 secondes de "calculs" ).
N'ayant aucune expérience en assembleur, je me demande comment fonctionne l'instruction addps. D'après ce que j'ai compris (c'est là ou ca coince ), elle prend en paramètre 2 registres sse afin de mettre le résultat dans un des deux (ici, xmm0, syntaxe AT/T). Or ici, b est un emplacement mémoire arbitraire dans cette version bis. Comme le programme fonctionne, que dois-je en conclure ? Il y a un movaps "caché" ? Y'a t'il quelque chose à savoir ou quelque chose qui ne va pas dans mon analyse ?
Question subsidiaire : Je n'ai pas l'impression que l'on puisse décider du registre sse à utiliser via les intrinsics, vous confirmez ?
Merci d'avance pour vos réponses ! @++
Edit : Il est dangereux de poster ce genre de sujet à 4h30 du matin . Je verrais bien ce que ca donne demain !
Message édité par Evadream -jbd- le 19-11-2004 à 05:17:57