2016-05-05 3 views
0

J'espère que quelqu'un sera en mesure d'aider avec ce problème, qui me dérange depuis plus d'une heure maintenant.Problèmes d'alignement de données de type multidimensionnel __m256i

Je possède ce code (il est en C):

#include <immintrin.h> 

void test_vectors(__m256i state[5][2]); 
void test() { 
    __m256i state[5][2]; 

    for (int i = 0; i < 5; i++) { 
     state[i][0] = _mm256_setzero_si256(); 
     state[i][1] = _mm256_setzero_si256(); 
    } 

    test_vectors(state); 
} 

void test_vectors(__m256i state[5][2]) { 
      __m256i some_new_vector = _mm256_xor_si256(state[0][0], state[0][1]); 
} 

Je ne peux pas construire, comme je reçois l'erreur:

"Error 'state': formal parameter with requested alignment of 32 won't be aligned"

Je suis incapable de voir, ce que la question est là. J'ai spécifié les dimensions du tableau, donc le compilateur devrait être capable de comprendre cela. En outre, je ne vois pas pourquoi la bibliothèque Intel Intrinsics devrait renvoyer une structure __m256i qui n'est pas alignée, car l'alignement est requis pour la plupart de ses fonctions de bibliothèque.

Je suis en mesure d'éviter l'erreur, en changeant la signature de la fonction d'être:

void schwabe_bitsliced_primate(__m256i *state[5]); 

Cependant, avec cela, dès que j'accéder au tableau, (ce que je fais dans la seule ligne ma méthode test_vector), j'obtiens une exception "struct at NULL". Cela fonctionne correctement si le paramètre de tableau d'état est unidimensionnel (c'est-à-dire uniquement l'état [5]).

+0

Pouvez-vous clarifier la solution de contournement que vous avez décrite, en modifiant la signature de la fonction, c'est-à-dire avec le code réel? Notez que comme la déclaration d'un paramètre de fonction, '__m256i state [5] [2]' est équivalent à '__m256i (* state) [2]', ce qui est entièrement différent de '__m256i * state [2]'. –

+0

En outre, votre code ne semble pas être un [mcve]. Il omet les déclarations et/ou les en-têtes pour les types de données non standard et les fonctions les manipulant. –

+0

Connexe: http://stackoverflow.com/questions/28488986/c-opengl-formal-parameter-with-declspecalign16-wont-be-aligned. –

Répondre

0

L'utilisation de "__m256i (* state) [2]" dans la signature au lieu des variations susmentionnées, a résolu mon problème d'alignement. John Bollinger a suggéré ceci dans un commentaire, ainsi les upvotes devraient d'abord aller à lui là.