【发布时间】:2020-02-23 10:30:00
【问题描述】:
是否值得并行化真正的依赖循环?有什么好处和坏处?我们平均可以获得多少加速?
例如:
int sum = 0;
for(i=0;i<2000-1;i++){
for(j=0;j<2000;j++) {
curr[i][j] = some_value_here;
sum += curr[i][j];
}
}
我应该如何处理这个循环?有一个明显的 RAW 依赖关系,我应该并行化它吗?如果是,我应该怎么做?
【问题讨论】:
-
这个问题的答案在于我对你另一个问题的回答。
-
哪一个,哈哈!
-
“真正的”依赖是什么意思?存在明显的 read-after-write 依赖性;
sum在每次迭代中写入并在下一次读取。在不了解硬件特性的情况下,无法说明可以获得多少加速。所写的代码执行了 3,998,000 次加法的链,但它的依赖深度可以减少到 ceil(log[2](3,998,000−1)) = 22,因此如果您单独加法的潜在加速超过 181,727有它的硬件。 -
@EricPostpischil,这实际上是一个简单的归约问题,加速比大致等于执行单元的数量。
-
@HristoIliev:正如我所写,这取决于硬件。这个问题询问我们平均可以得到多少加速,在没有硬件规范的情况下,这不是一个明智的问题。
标签: c loops parallel-processing dependencies openmp