在 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>
}
...
}
}
谢谢!
最佳答案
collapse
指令可能就是您要查找的内容,如 here 所述.这将基本上形成一个循环,然后将其并行化,并且专为这些情况而设计。所以你会这样做:
#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>
}
...
}
}
准备就绪。
关于c - 多维嵌套 OpenMP 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5287321/