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