【发布时间】:2011-03-13 03:59:49
【问题描述】:
在 OpenMP 中并行化多维令人尴尬的并行循环的正确方法是什么?维度的数量在编译时是已知的,但不知道哪些维度会很大。它们中的任何一个都可能是一、二或一百万。当然,我不希望 N 个 omp parallel 用于 N 维循环...
想法:
这个问题在概念上很简单。只有最外面的“大”循环需要并行化,但循环尺寸在编译时是未知的,并且可能会发生变化。
动态设置
omp_set_num_threads(1)和#pragma omp for schedule(static, huge_number)是否会使某些循环并行化成为无操作?这会产生不良的副作用/开销吗?感觉像个杂种。-
OpenMP Specification (2.10, A.38, A.39) 说明了符合和不符合嵌套并行性之间的区别,但并未提出解决此问题的最佳方法。
重新排序循环是可能的,但可能会导致大量缓存未命中。展开是可能的,但不是微不足道的。还有其他方法吗?
这是我想要并行化的内容:
for(i0=0; i0<n[0]; i0++) {
for(i1=0; i1<n[1]; i1++) {
...
for(iN=0; iN<n[N]; iN++) {
<embarrasingly parallel operations>
}
...
}
}
谢谢!
【问题讨论】:
-
+1 提出一个很好的问题
-
获得正确答案就是提出正确的问题。 '当然,参考规范也没有什么坏处。 :)
标签: c parallel-processing openmp nested-loops