在OpenMP中并行化多维尴尬并行循环的正确方法是什么?维度的数量在编译时是已知的,但是哪个维度是大的。他们中的任何一个可能是一,二或一百万。当然,我不希望N omp parallel
用于N维循环...
思想:
问题在概念上很简单。只有最外层的“大”循环需要并行化,但循环维度在编译时是未知的,可能会发生变化。
动态设置omp_set_num_threads(1)
和#pragma omp for schedule(static, huge_number)
会使某些循环并行化成为无操作吗?这会产生不良的副作用/开销吗?感觉就像一个kludge。
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>
}
...
}
}
谢谢!
答案 0 :(得分:9)
如here所述,collapse
指令可能正是您所寻求的。这将基本上形成一个单独的循环,然后进行并行化,并且设计用于这些类型的情况。所以你要这样做:
#pragma omp parallel for collapse(N)
for(int i0=0; i0<n[0]; i0++) {
for(int i1=0; i1<n[1]; i1++) {
...
for(int iN=0; iN<n[N]; iN++) {
<embarrasingly parallel operations>
}
...
}
}
并完成所有设定。