Xeon Phi Intel コプロセッサで (512 ビット長のベクトル) を使用して KNC 命令を使用して 2 つの配列を追加するコードを作成しました。ただし、インライン アセンブリ パーツにセグメンテーション パーツがあります。
ここに私のコードがあります:
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;
}
gcc をコンパイラとして使用しています (Intel コンパイラを購入するお金がないため)。そして、これはこのコードをコンパイルするための私のコマンドラインです:
k1om-mpss-linux-gcc add.c -o add.out
問題はインライン アセンブリにありました。次のインラインアセンブリで修正されました。
__asm__("vmovaps %1,%%zmm1\n"
"vmovaps %2,%%zmm2\n"
"vaddps %%zmm1,%%zmm2,%%zmm3\n"
"vmovaps %%zmm3,%0;"
: "=m" (*pC) : "m" (*pA), "m" (*pB));