OpenMP:循环结转依赖
OpenMP: Loop Carry over dependency
我想在c++中实现一个简单的累积和代码,如下所示:
x[0] = 0;
for (k=1;k<100; k++)
x[k] = x[k-1] + x[k];
在这个站点上,一个实现被记录下来以消除循环结转依赖。对于两个线程,代码应该如下所示:
x[0] = 0;
x[49] = 74; //pre calculated
//the outer loop is parallelized (two instances)
#pragma omp parallel for private(m,k)
for(m=0;m<2;m++) {
for (k=m*49+1; k<m*50+50; k++) {
x[k] = x[k-1] + x[k];
}
}
问题是我仍然在这里看到循环携带依赖(两个线程并行运行,但一个需要来自另一个的数据)。
谁能在这里加些解释吗?消除这种依赖的最好方法是什么?
由于x[49]
的值已经存在,所以不需要再计算它:您可以跳过k = 0
和k = 49
的迭代。这就是为什么循环在两个嵌套循环中展开。
然而,这里似乎有一个错误。对于内部循环应该只有一个循环携带依赖,并且它应该跨外部循环的迭代传播。这是因为没有正确定义限制:
- 与
m = 0
,k = 1 .. 48
(你已经得到0和49)。 - 与
m = 1
,k = 50 ..99
(再次,你已经得到了49!)。
因此,循环应该如下所示:
for( m = 0; m < 2; m++ ) {
for (k=m*49+1; k<m*51+49; k++) {
x[k] = x[k-1] + x[k];
}
}
如果您将添加更改为:
x[k+1] = x[k] + x[k+1];
它可以简化一点你的下界…
for( m = 0; m < 2; m++ ) {
for (k=m*50; k < m*51+48; k++) {
x[k+1] = x[k] + x[k+1];
}
}
相关文章:
- C++GTKMM gui循环依赖关系
- 如何在头文件中声明类模板(由于循环依赖关系)
- 如何在具有循环依赖的类中dynamic_cast?
- C++模板方法中的循环依赖关系
- 修复循环依赖项 c++17 标头
- 涉及全局对象的循环依赖C++
- 循环依赖,在继承类的情况下使用覆盖方法
- Wt::D bo 中的循环依赖关系
- 在包含窗口标头时难以解决循环依赖关系问题
- 解决循环依赖关系 c++ 的想法
- C++循环依赖关系,未声明的标识符
- C++ 中的循环依赖关系问题
- 错误 C2512 视觉C++(并且不是循环依赖项)
- CMake 外部和内部静态库的循环依赖关系
- 正在从继承中解析循环依赖项
- "std::shared_ptr"循环依赖关系是如何导致问题的
- 循环包含依赖项/转发声明
- 纯引用而不是weak_ptr来打破循环依赖关系
- 如何在Visual Studio(C++11)中处理相互依赖/循环依赖
- 优化依赖循环openmp