首页 文章

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

提问于
浏览
0

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

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

  • 使用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上的第二种方式快10倍 . 当我不卸载并在Xeon E5主机CPU上运行它时,会发生同样的情况 .

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

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

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

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

提前致谢 .

1 回答

  • 1

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

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

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

相关问题