Xeon phi卸载模式如何利用线程并行和矢量化

时间:2015-04-11 02:40:42

标签: c++ multithreading vectorization xeon-phi cilk-plus

我正在使用cilk plus和offload对Xeon phi进行一些性能测试。

在一个简单的向量添加程序中,我有两种方法可以做到:

  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];
    }
    
  3. 我的测试显示第一种方式比xeon phi的第二种方式快〜10倍。当我不卸载并在Xeon E5主机CPU上运行它时,会发生同样的情况。

    首先,我想知道我的理解是否正确:

    第一种方法只在XEON phi中利用线程并行性(60核*每个4线程)。但是不会执行矢量操作。

    第二种方法只利用矢量化,它只在一个线程中运行此代码并使用SIMD(IMCI)指令。

    其次我想知道写这个的正确方法是什么,它将把任务拆分到不同的线程并在Xeon phi上使用向量指令?

    提前致谢。

1 个答案:

答案 0 :(得分:1)

实际上,如果你看一下编译器产生的优化报告(-opt-report),或者如果你有这个优化报告,你可能会感到惊讶。你推测,你的第二个例子只是矢量化。但是,除了并行化之外,您的第一个示例还可以进行向量化。请记住,_Cilk_for不会分发单个迭代,而是分配迭代块,在某些情况下可以进行矢量化。

为了更好地控制,您可以尝试使用嵌套循环来明确地分离并行和向量循环,或者使用粒度来改变线程在任何给定时间或许多不同的工作量编译指示。

有关专门针对英特尔至强融核协处理器进行优化的建议,我想将人们指向https://software.intel.com/en-us/articles/programming-and-compiling-for-intel-many-integrated-core-architecture,但我认为您可能会发现其中一些太基础了。不过,如果你想要四处寻找......