J'ai écrit un code pour ajouter deux tableaux en utilisant des instructions KNC avec des vecteurs longs de 512 bits sur le coprocesseur Xeon Phi intel. Cependant, j'ai une partie de segmentation dans la partie d'assemblage en ligne.erreur de segmentation pour `vmovaps '
Ici, il est mon code:
int main(int argc, char* argv[])
{
int i;
const int length = 65536;
const int AVXLength = length/16;
float *A = (float*) aligned_malloc(length * sizeof(float), 64);
float *B = (float*) aligned_malloc(length * sizeof(float), 64);
float *C = (float*) aligned_malloc(length * sizeof(float), 64);
for(i=0; i<length; i++){
A[i] = 1;
B[i] = 2;
}
float * pA = A;
float * pB = B;
float * pC = C;
for(i=0; i<AVXLength; i++){
__asm__("vmovaps %1,%%zmm0\n"
"vmovaps %2,%%zmm1\n"
"vaddps %%zmm0,%%zmm0,%%zmm1\n"
"vmovaps %%zmm0,%0;"
: "=m" (pC) : "m" (pA), "m" (pB));
pA += 512;
pB += 512;
pC += 512;
}
return 0;
}
J'utilise le compilateur gcc (parce que je n'ai pas d'argent pour acheter compilateur intel). Et voici ma ligne de commande pour compiler ce code:
k1om-mpss-linux-gcc add.c -o add.out
Le problème était dans l'ensemble en ligne. L'assembly en ligne suivant l'a corrigé.
__asm__("vmovaps %1,%%zmm1\n"
"vmovaps %2,%%zmm2\n"
"vaddps %%zmm1,%%zmm2,%%zmm3\n"
"vmovaps %%zmm3,%0;"
: "=m" (*pC) : "m" (*pA), "m" (*pB));
Il existe de nombreux commutateurs de compilation qui contrôlent le point flottant. Et certains contrôlent avx. Pouvez-vous nous dire lesquels vous utilisez? –
Lorsque vous avez posté [une question presque identique récemment] (http://stackoverflow.com/questions/34114092/vector-sum-using-avx-inline-assembly-on-xeonphi), il vous a été signalé que le premier génération Xeon Phi (Knight's Corner) ne supporte pas AVX] (http://stackoverflow.com/a/34115089/253056). –
Pour 'KNCI', vous devez utiliser les registres' zmm' avec 'vaddps'. Notez également que les intrinsèques sont * beaucoup * plus faciles à utiliser pour cela que l'initialisation inline brute (comme noté également dans les commentaires sur votre question précédente). Voir aussi [cette réponse très pertinente] (http://stackoverflow.com/a/22719429/253056). –