GCC optimisation des accès mémoire [duplicate]
J'ai un morceau de code C qui a un inttableau - le code effectue plusieurs lectures dans le tableau. Lorsque je le compile avec l'assembly GCC to X86 en utilisant l'indicateur -O0, dans l'assembly tous les accès en lecture au tableau sont effectués à l'aide de l' movlinstruction - une charge de 32 bits. Cela a du sens car les ints sont 32 bits et donc les accès à leurs tableaux doivent utiliser des charges de 32 bits.
Cependant, lorsque je le compile à l'aide de l'indicateur -O3, plusieurs des movllectures 32 bits du tableau sont remplacées par des charges 64 bits dans les registres XMM à la place ... Je suppose que c'est une sorte d'optimisation, mais le désassemblage optimisé est très difficile à déchiffrer et je suis un peu perdu sur ce qui se passe.
Sans entrer trop dans les détails de mon travail, je dois utiliser l'indicateur O3, mais j'ai besoin de tous les accès à mon tableau int 32 bits pour utiliser les accès 32 bits.
Quelqu'un a-t-il un aperçu de ce qui pourrait se passer et comment je peux appliquer toutes les charges de mon tableau à 32 bits tout en utilisant toujours l'indicateur -O3?
Exemple à reproduire:
Voici le code C:
#include <stdlib.h>
int main() {
int* arr = malloc(sizeof(int) * 64);
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += arr [i] + arr[i+1];
}
if (sum == 0)
return 0;
else
return 1;
}
Pour le démontage non optimisé, compilez avec (notez les charges 32 bits dans le démontage):
gcc -S -fverbose-asm -o mb64BitLoadsNoOpt.s mb64BitLoads.c
Pour un démontage optimisé, compilez avec (notez que le registre XMM se charge 64 bits lors du démontage):
gcc -O3 -S -fverbose-asm -o mb64BitLoadsOpt mb64BitLoads.c
Réponses
Sans entrer trop dans les détails de mon travail, je dois utiliser l'
-O3indicateur, mais j'ai besoin de tous les accès à mon tableau int 32 bits pour utiliser les accès 32 bits.
C'est contradictoire. Consultez ce site Web de référence , le projet de norme C11 n1570 et le projet de norme C ++ 11 n3337 .
Ces normes n'exigent pas que tous les accès à votre tableau 32 bits utilisent des accès 32 bits.
Avec un GCC 10 récent , utilisez gcc -fverbose-asm -O3 -S foo.cpuis examinez foo.spour comprendre pourquoi votre compilateur optimise.
Vous pouvez essayer d'autres compilateurs,
comme Compcert ou Clang (ou même tinycc , ou nwcc , ou écrivez le vôtre à partir de Frama-C , ou même à partir de zéro ...). Demandez la permission à votre patron si sa licence convient à votre travail.
Vous pouvez également améliorer ces compilateurs selon vos besoins, ou écrire votre propre plugin GCC pour répondre à vos besoins.
Si vous insistez pour utiliser GCC, vous pouvez envisager d'utiliser diverses extensions liées à l'assembleur . Bien sûr, lisez sur l' invocation de GCC .
GCC est un logiciel libre , vous êtes autorisé à étudier son code source puis à l'améliorer.
Téléchargez le code source de GCC. Puis compilez et installez- le. Regardez en particulier dans son gestionnaire de passes . Vous pourrez certainement supprimer les optimisations qui vous ennuient. Vous pourriez probablement le faire avec votre plugin GCC. Demandez de l'aide et abonnez-vous à la [email protected] de diffusion .