J'optimise un peu de code pour une micro-architecture Intel x86 Nehalem en utilisant l'intrinsèque SSE.Méthode la plus efficace pour stocker des produits 4 points dans un tableau contigu en C en utilisant les intrinsèques SSE
Une partie de mon programme calcule 4 produits points et ajoute chaque résultat aux valeurs précédentes dans un bloc contigu d'un tableau. Plus précisément,
tmp0 = _mm_dp_ps(A_0m, B_0m, 0xF1);
tmp1 = _mm_dp_ps(A_1m, B_0m, 0xF2);
tmp2 = _mm_dp_ps(A_2m, B_0m, 0xF4);
tmp3 = _mm_dp_ps(A_3m, B_0m, 0xF8);
tmp0 = _mm_add_ps(tmp0, tmp1);
tmp0 = _mm_add_ps(tmp0, tmp2);
tmp0 = _mm_add_ps(tmp0, tmp3);
tmp0 = _mm_add_ps(tmp0, C_0n);
_mm_storeu_ps(C_2, tmp0);
Notez que je m'y prends en utilisant 4 registres xmm temporaires pour conserver le résultat de chaque produit scalaire. Dans chaque registre XMM, le résultat est placé dans un 32 bits uniques par rapport aux autres registres XMM temporaires de telle sorte que le résultat final ressemble à ceci:
tmp0 = R0-zéro-zéro-zéro
tmp1 = zéro -R1-zéro-zéro
tmp2 = zéro-zéro-R2-zéro
TMP3 = zéro-zéro-zéro-R3
Je combine les valeurs contenues dans chaque variable tmp dans une variable de XMM par les résumer avec les instructions suivantes:
tmp0 = _mm_add_ps(tmp0, tmp1);
tmp0 = _mm_add_ps(tmp0, tmp2);
tmp0 = _mm_add_ps(tmp0, tmp3);
Enfin, j'ajouter le registre contenant les 4 résultats des produits de points à une partie contiguë d'un tableau de telle sorte que les indices du tableau sont incrémentés par un produit scalaire, comme si (C_0n sont les 4 valeurs actuellement en le tableau qui doit être mis à jour; C_2 est l'adresse pointant vers ces 4 valeurs):
tmp0 = _mm_add_ps(tmp0, C_0n);
_mm_storeu_ps(C_2, tmp0);
Je veux savoir s'il y a un moyen de prendre moins rond-point, plus efficace les résultats des produits de point et les ajouter au bloc contigu de le tableau. De cette façon, je fais 3 additions entre les registres qui ont seulement 1 valeur non nulle en eux. Il semble qu'il devrait y avoir un moyen plus efficace d'y parvenir.
J'apprécie toute aide. Je vous remercie.
Vous devez toujours ajouter l'ancienne valeur (C_0n) à chaque produit scalaire avant le magasin. Ils seraient tous indépendants, donc ce ne serait peut-être pas trop lent, mais ce n'est pas beaucoup plus joli :) – celion