嵌套矢量化openmp循环,在最里面的循环中有多行代码

时间:2019-01-11 20:58:04

标签: c++ parallel-processing openmp

我想知道使用opemp simd构造折叠多个嵌套循环是否有效,其中 最内层循环中的代码首先计算多个索引(如下所示),然后计算这些索引 用于修改多维数组(如下所示)。换句话说,标有I1-I4的行会 下面全部矢量化?在所有的openmp示例中,我都看到总是有一个变量,其结果为 向量化。以下代码将被视为有效吗?谢谢

for(std::size_t a=0;a<A;a++)
{
  #pragma omp simd collapse(3)
  for(std::size_t b=0;b<B;b++)
  {
    for(std::size_t c=0;c<C;c++)
    {
      for(std::size_t d=0;d<D;d++)
      {
        std::size_t idx1 = c*B + b; //I1
        std::size_t idx2 = d*(B*C) + c*B + b; //I2
        std::size_t idx3 = d*(E) + c*F + b; //I3
        W1[idx1][idx3] += W1[idx1][a]*W2[a][idx3]; //I4

      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

这绝对是有效的OpenMP代码。根据编译器和目标体系结构的不同,编译结果可能会有所不同,但至少某些编译器肯定会对其进行矢量化处理。由于索引可能是非线性的,因此只能在具有聚集和分散指令的平台上很好地向量化,但是无论如何都是有效的。