我想知道使用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
}
}
}
}
答案 0 :(得分:1)
这绝对是有效的OpenMP代码。根据编译器和目标体系结构的不同,编译结果可能会有所不同,但至少某些编译器肯定会对其进行矢量化处理。由于索引可能是非线性的,因此只能在具有聚集和分散指令的平台上很好地向量化,但是无论如何都是有效的。