2010-04-26 14 views
1

J'écris une fonction de transposition pour des vecteurs 8x16 bits avec des intrinsèques SSE2. Comme il y a 8 arguments pour cette fonction (une matrice de taille 8x8x16bit), je ne peux rien faire d'autre que de les passer par référence. Est-ce que cela sera optimisé par le compilateur (je veux dire, ces objets __m128i seront-ils passés dans les registres au lieu de pile)?est-ce que le fait de passer des objets __m128i en référence à la fonction inline provoque le déplacement de ces objets vers la pile?

Extrait de code:

inline void transpose (__m128i &a0, __m128i &a1, __m128i &a2, __m128i &a3, 
         __m128i &a4, __m128i &a5, __m128i &a6, __m128i &a7) { 
    .... 
    } 

Répondre

2

Les chances sont qu'ils ne seront pas poussés à la pile. Si la fonction est en ligne, le compilateur poussera les opérations (code) de la fonction appelée dans la fonction appelée au lieu de transmettre les données de l'appelant à l'appelé. Maintenant, inline est un indice, donc le compilateur peut décider de ne pas aligner l'appel et ensuite vous devrez suivre le conseil de Zan et vérifier réellement à quoi ressemble le code compilé.

3

Qui peut dire? Pourquoi ne pas le compiler et regarder le démontage?

C'est le seul moyen d'être sûr.

0

Notez que cette limitation s'applique uniquement à Windows et MSVC (++) (vous devriez probablement étiqueter votre question en conséquence).

Je n'ai pas essayé cela avec C++ et références, mais en utilisant MSVC et les pointeurs avec des lignes comme ceci, le compilateur semble optimiser l'indirection. Vraisemblablement, la même chose s'appliquera avec les références C++, mais comme une autre affiche l'a souligné, vous devriez regarder le code généré pour vérifier.

+0

Je n'utilise pas MSVC –

+0

@ ~ buratinas: OK, tout devrait bien se passer tant que vous utilisez un compilateur décent, c'est-à-dire gcc ou l'ICC d'Intel. –