0

cilk plus とオフロードを使用して、Xeon phi でいくつかのパフォーマンス テストを行っています。

単純なベクトル追加プログラムでは、次の 2 つの方法があります。

  1. 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);
    }
    
  2. ベクトル注釈の使用:

    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 でベクトル命令を使用するように、これを記述する正しい方法を知りたいですか?

前もって感謝します。

4

1 に答える 1