Question

J'essaie d'écrire un code à forte intensité de calcul pour la cible Windows X64, avec SSE ou les nouvelles instructions AVX, en compilant dans GCC 4.5.2 et 4.6.1, MingW64 (TDM GCC Build et une construction personnalisée). Mes options de compilateur sont -O3 -mavx. (-m64 est implicite)

En bref, je veux effectuer un calcul long sur 4 vecteurs 3D de flotteurs emballés. Cela nécessite des registres 4x3 = 12 xmm ou ymm pour le stockage et 2 ou 3 registres pour les résultats temporaires. Cela devrait IMHO s'adapter parfaitement dans les 16 registres SSE (ou AVX) disponibles disponibles pour les cibles de 64 bits. Cependant, le CCC produit un code très sous-optimal avec un déversement de registre, en utilisant uniquement des registres xmm0-xmm10 et mélanger les données de et sur la pile. Ma question est:

Existe-t-il un moyen de convaincre GCC d'utiliser tous les registres xmm0-xmm15?

Pour corriger les idées, considérez le code SSE suivant (pour l'illustration uniquement):

void example(vect<__m128> q1, vect<__m128> q2, vect<__m128>& a1, vect<__m128>& a2) {
    for (int i=0; i < 10; i++) {
        vect<__m128> v = q2 - q1;
        a1 += v;
//      a2 -= v;

        q2 *= _mm_set1_ps(2.);
    }
}

Ici vect<__m128> est simplement un struct de 3 __m128, avec addition naturelle et multiplication par scalaire. Quand la ligne a2 -= v est commenté, c'est-à-dire que nous n'avons besoin que de registres 3x3 pour le stockage car nous ignorons a2, le code produit est en effet simple sans mouvements, tout est effectué dans les registres xmm0-xmm10. Quand je supprime le commentaire a2 -= v, le code est assez horrible avec beaucoup de mélange entre les registres et la pile. Même si le compilateur pourrait simplement utiliser des registres xmm11-xmm13 ou quelque chose.

En fait, je n'ai vu GCC utiliser aucun des registres xmm11-xmm15 n'importe où dans tout mon code pour le moment. Qu'est-ce que je fais mal? Je comprends que ce sont des registres sauvés à la callee, mais cette surcharge est complètement justifiée en simplifiant le code de boucle.

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top