J'ai appris que certaines CPU Intel/AMD peuvent se multiplier simultanément et ajouter avec SSE/AVX:
FLOPS per cycle for sandy-bridge and haswell SSE2/AVX/AVX2. J'aime savoir comment faire le mieux dans le code et je veux aussi savoir comment cela se fait en interne dans la CPU. Je veux dire avec l'architecture super-scalaire. Disons que je veux faire une longue somme comme la suivante dans l'ESS:Comment utiliser les instructions Fused Multiply-Add (FMA) avec SSE/AVX
//sum = a1*b1 + a2*b2 + a3*b3 +... where a is a scalar and b is a SIMD vector (e.g. from matrix multiplication)
sum = _mm_set1_ps(0.0f);
a1 = _mm_set1_ps(a[0]);
b1 = _mm_load_ps(&b[0]);
sum = _mm_add_ps(sum, _mm_mul_ps(a1, b1));
a2 = _mm_set1_ps(a[1]);
b2 = _mm_load_ps(&b[4]);
sum = _mm_add_ps(sum, _mm_mul_ps(a2, b2));
a3 = _mm_set1_ps(a[2]);
b3 = _mm_load_ps(&b[8]);
sum = _mm_add_ps(sum, _mm_mul_ps(a3, b3));
...
Ma question est de savoir comment cela se convertissent à multiplier simultanément et ajouter? Les données peuvent-elles être dépendantes? Je veux dire le CPU peut faire _mm_add_ps(sum, _mm_mul_ps(a1, b1))
simultanément ou les registres utilisés dans la multiplication et ajouter doivent être indépendants?
Enfin comment cela s'applique à FMA (avec Haswell)? _mm_add_ps(sum, _mm_mul_ps(a1, b1))
est-il automatiquement converti en une seule instruction FMA ou une micro-opération?
Merci, cela répond plus ou moins à ma question sur FMA. Je devrais vraiment passer du temps à apprendre quelques assemblages x86. Cela répondrait probablement à la plupart de mes questions. –
En ce qui concerne votre question de savoir si une multiplication et un ajout peut être fait simultanément (FMA). La réponse est non puisque l'addition utilise le résultat de la multiplication. Donc vous mangez la latence d'add + multiplier. Une instruction FMA fait les deux instructions ensemble - généralement avec la même latence qu'une muliply unique. Donc l'addition est gratuite. – Mysticial
Merci, c'est ce que je pensais. Maintenant, j'ai juste besoin de comprendre comment organiser mon code de sorte que la somme que je définis ci-dessus fasse des ajouts et des multiplications indépendants simultanément (donc j'évite les latences). –