c++ - 在最内层循环中具有多行代码的嵌套矢量化 openmp 循环

标签 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

      }
    }
  }
}

最佳答案

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

关于c++ - 在最内层循环中具有多行代码的嵌套矢量化 openmp 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54153949/

相关文章:

parallel-processing - 在 Julia 的 while 循环中打印 ("") 的效果

c++ - 如何使用 typeinfo.name C++ 声明变量

C++串口使用Write()只响应一次

java - 尽管spark.executor.cores=1,Apache Spark 执行器仍使用多个核心

java - 将 ExecutorService 与要执行的任务树一起使用

c++ - 带有 clang 的 OpenMP

Java、C++、NIO、mmaped 缓冲区、同步

c++ - 从 auto_ptr 转换为普通指针

openmp - libiomp5 和 libgomp 可以/应该混合吗?

c++ - OpenMP - 并行化嵌套循环