gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:19:26 29 4
gpt4 key购买 nike

我正在使用带卸载功能的 cilk plus 在 Xeon phi 上进行一些性能测试。

在一个简单的 vector 加法程序中,我有两种方法:

  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. 使用 vector 标注:

    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 个线程)。但不会执行 vector 运算。

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

其次,我想知道编写此代码的正确方法是什么,这样它既可以将任务拆分到不同的线程,又可以在 Xeon phi 上使用 vector 指令?

提前致谢。

最佳答案

实际上,如果您查看编译器生成的优化报告 (-opt-report),或者查看 VTune 输出(如果有),您可能会感到惊讶。正如您推测的那样,您的第二个示例仅进行矢量化。但是,除了并行化之外,您的第一个示例还可以进行矢量化。请记住,_Cilk_for 不是分发单个迭代,而是分发在某些情况下可以矢量化的迭代 block 。

为了更好地控制,您可以尝试使用嵌套循环来显式分离并行循环和 vector 循环,或者使用粒度来更改线程在任何给定时间或多个不同时间必须处理的工作量编译指示。

有关专门针对 Intel Xeon Phi 协处理器进行优化的建议,我想向人们推荐 https://software.intel.com/en-us/articles/programming-and-compiling-for-intel-many-integrated-core-architecture ,但我认为您可能会发现其中一些过于基础。尽管如此,如果您想四处挖掘......

关于c++ - Xeon phi 卸载模式如何利用线程并行性和矢量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29573472/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com