Comment faire en sorte que GCC utilise plus de deux registres SIMD lors de l’utilisation d’intrinsèques?
Question
J'écris du code et j'essaie de l'accélérer à l'aide des composants intrinsèques SIMD SSE2 / 3. Mon code est d'une nature telle que je dois charger des données dans un registre XMM et y donner suite plusieurs fois. Quand je regarde le code assembleur généré, il semble que GCC continue à vider les données en mémoire, afin de recharger quelque chose d'autre dans XMM0 et XMM1. Je suis en train de compiler pour x86-64 alors j’ai 15 registres. Pourquoi GCC n'en utilise-t-il que deux et que puis-je faire pour lui demander d'en utiliser davantage? Existe-t-il un moyen que je peux "épingler"? une valeur dans un registre? J'ai ajouté le " register " mot-clé de ma définition de variable, mais le code d'assembly généré est identique.
La solution
Oui, vous pouvez. Reg Vars explicite explique la syntaxe à utiliser pour épingler une variable à un registre spécifique.
Autres conseils
Si vous en êtes au point de spécifier des registres individuels pour chaque élément intrinsèque, vous pouvez également simplement écrire le répertoire d'assemblage, en particulier compte tenu de la vilaine habitude de gcc de pessimiser les éléments intrinsèques inutilement dans de nombreux cas.