cilk plus とオフロードを使用して、Xeon phi でいくつかのパフォーマンス テストを行っています。
単純なベクトル追加プログラムでは、次の 2 つの方法があります。
cilk_for を使用して、Xeon phi でタスクを異なるスレッドに分割します。
__declspec(target(mic)) void vector_add(double *A,double *B,double *C, int vector_size) { _Cilk_for(int i=0;i<vector_size;i++) { C[i] += A[i] + B[i]; } } double *A,*B,*C; //allocating and initializing A, B ,C using malloc..... #pragma offload target(mic:0) \ in(B:length(vector_size)) \ in(A:length(vector_size)) \ in(C:length(vector_size)) \ in(vector_size ) { vector_add(A,B,C,vector_size); }
ベクトル注釈の使用:
double *A,*B,*C; //allocating and initializing A, B ,C using malloc..... #pragma offload target(mic:0) \ in(B:length(vector_size)) \ in(A:length(vector_size)) \ in(C:length(vector_size)) //in(vector_size ) //signal(offload0) { C[0:vector_size] = A[0:vector_size]+B[0:vector_size]; }
私のテストでは、xeon phi で最初の方法が 2 番目の方法よりも ~10 倍高速であることが示されています。オフロードせずに Xeon E5 ホスト CPU で実行すると、同じ話が発生します。
まず、私の理解が正しいかどうかを知りたいです。
最初の方法は、XEON phi でスレッドの並列処理 (それぞれ 60 コア * 4 スレッド) のみを利用します。ただし、ベクトル操作は実行されません。
2 番目の方法は、このコードを 1 つのスレッドでのみ実行し、SIMD(IMCI) 命令を使用するベクトル化のみを利用します。
次に、タスクを異なるスレッドに分割し、Xeon phi でベクトル命令を使用するように、これを記述する正しい方法を知りたいですか?
前もって感謝します。