7
votes

Obtenez GCC pour préserver un registre SSE dans une fonction qui utilise Inline ASM

J'écris un programme en C qui doit faire des calculs de mathématiques rapides. J'utilise les instructions d'assemblage SSE en ligne pour obtenir une action SIMD (à l'aide de numéros de points flottants à double précision emballés). Je compile avec GCC sur Linux.

Je suis dans une situation où j'ai besoin de boucler sur certaines données et j'utilise un facteur constant dans mes calculs. J'aimerais garder ce facteur niché dans un registre sûr pendant la boucle, je n'ai donc pas à le charger à chaque fois. P>

clarifier avec certains code: P> xxx pré>

J'ai essayé de faire quelque chose avec le mot-clé "registre". Mais si je ne me trompe pas, il semble que je ne puisse conserver qu'un pointeur em> à cette structure (dans un registre général). Cela devra être déférencé chaque itération, gaspiller de temps précieux. P>

register vect2_t hVect asm("xmm1") = {h, h};
/* Gives error: data type of 'hVect' isn't suitable for a register */

register vect2_t *hVect2 asm("rax");
*hVect2 = (vect2_t){h,h};
/* Seems to work, but not what I'm looking for */


0 commentaires

3 Réponses :


8
votes

Je pense que la solution ici consiste à sensibiliser GCC que votre Vec2_T code> est en fait un vecteur; Ensuite, vous pouvez simplement calculer la valeur de boucle-invariant et le traiter comme une variable normale (à l'exception du compilateur sait qu'il est un type de vecteur):

typedef double vec2_t __attribute__ ((vector_size (16)));

void function()
{
  /* get a specific value set up, e.g. */
  vec2_t invariant;
  asm( "some calculations, soring result in invariant."
       : "=x" (invariant) );

  for( int i = 0; i<N; i++ ){
    asm(
            "Some calculations;"
            "on an element of;"
            "a data set.;"
            "The value in xmm1;"
            "is needed;"
            : "x" (invariant) // and other SSE arguments
       );
   }
}


0 commentaires

3
votes

Je pense qu'il est préférable de quitter l'affectation du registre au compilateur. Cela peut probablement garder une meilleure trace que vous. GCC utilisera déjà les extensions SSE, mais si vous êtes sûr que vous sachiez mieux, utilisez les fonctions GCC __Builtine. Pour être honnête, je doute un peu que vous le ferez plus vite de cette façon.

meilleure des chances!

Ces sites sont probablement intéressants à regarder.

GCC X86 Fonctions intégrées

Utilisation de SIMD avec GCC


0 commentaires

3
votes

Je suis habitué à travailler avec l'assemblage et C et ce que je ferais ici, c'est que j'écrirais toute la fonction en montage. Si vous avez un système de fabrication flexible, je vous recommande d'assembler la fonction ASM séparément et de le relier à votre application. Le seul problème avec ceci est que la fonction ne peut pas être inlinée par le compilateur.

Fonction vide (nul); // c

fonction externe "c" (vide); // c ++


0 commentaires