嵌套矢量化 OpenMP 循环,在最内层循环中具有多行代码

nested vectorized openmp loops with multiple lines of code in inner-most loop

本文关键字:循环 代码 OpenMP 矢量化 嵌套      更新时间:2023-10-16

我想知道使用 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
      }
    }
  }
}

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