嵌套矢量化 OpenMP 循环,在最内层循环中具有多行代码
nested vectorized openmp loops with multiple lines of code in inner-most loop
我想知道使用 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++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在这个代码结束循环中没有得到结束
- 下面是我为检测链接列表中的循环而制作的代码
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 在java中解决这段代码时面临循环中的问题
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 我的代码运行良好,但在游戏循环中中断
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- 如何编译使用循环引用的代码?
- 我正在尝试创建一个菜单,但我的代码一直在循环
- 使用基于数组和范围的 For 循环替换一些基本代码行
- 为什么这段代码会导致无限循环?
- 如果代码包含多个复杂度循环,如何计算复杂度
- 无休止的 do while 循环C++代码
- 循环代码错误C++
- C++ while 循环代码的含义
- 如何将查找组合的几个循环代码转换为递归方法
- 如何使用MySQL将c++for循环代码加速到查询中
- 如何将一系列if/else-if/else-if/关系链转换为线性循环代码
- 当我所做的只是将循环代码移动到函数中时,代码运行速度会慢10倍