2

XeonPhi Intel コプロセッサーを初めて使用します。AVX 512 ビット命令を使用して、単純なベクトル和のコードを書きたいと考えています。k1om-mpss-linux-gcc をコンパイラとして使用し、インライン アセンブリを記述したいと考えています。ここに私のコードがあります:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <assert.h>
#include <stdint.h>

void* aligned_malloc(size_t size, size_t alignment) {

    uintptr_t r = (uintptr_t)malloc(size + --alignment + sizeof(uintptr_t));
    uintptr_t t = r + sizeof(uintptr_t);
    uintptr_t o =(t + alignment) & ~(uintptr_t)alignment;
    if (!r) return NULL;
    ((uintptr_t*)o)[-1] = r;
    return (void*)o;
}

int main(int argc, char* argv[])
{
    printf("Starting calculation...\n");
    int i;
    const int length = 65536;

    unsigned *A = (unsigned*) aligned_malloc(length * sizeof(unsigned), 64);
    unsigned *B = (unsigned*) aligned_malloc(length * sizeof(unsigned), 64);
    unsigned *C = (unsigned*) aligned_malloc(length * sizeof(unsigned), 64);

    for(i=0; i<length; i++){
            A[i] = 1;
            B[i] = 2;
    }

    const int AVXLength = length / 16;
    unsigned char * pA = (unsigned char *) A;
    unsigned char * pB = (unsigned char *) B;
    unsigned char * pC = (unsigned char *) C;
    for(i=0; i<AVXLength; i++ ){
            __asm__("vmovdqa32 %1,%%zmm0\n"
                    "vmovdqa32 %2,%%zmm1\n"
                    "vpaddd %0,%%zmm0,%%zmm1;"
            : "=m" (pC) : "m" (pA), "m" (pB));

            pA += 64;
            pB += 64;
            pC += 64;
    }

    // To prove that the program actually worked
    for (i=0; i <5 ; i++)
    {
            printf("C[%d] = %f\n", i, C[i]);
    }

}

しかし、プログラムを実行すると、asm 部分からセグメンテーション違反が発生しました。誰かがそれを手伝ってくれますか???

ありがとう

4

2 に答える 2

4

Xeon Phi Knights Corner は AVX をサポートしていません。これは、ベクター サイズが512bの Intel Initial Many Core Instructions ( Intel IMCI ) と呼ばれる、ベクター拡張の特別なセットのみをサポートします。したがって、あらゆる種類の AVX 固有のアセンブリを KNC コードに入れようとすると、クラッシュが発生します。

ナイツ・ランディングを待ちましょう。AVX-512 ベクトル拡張をサポートします。

于 2015-12-06T07:23:28.430 に答える