c - 多维嵌套 OpenMP 循环

标签 c parallel-processing openmp nested-loops

在 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/

相关文章:

c - 具有 1 个线程的 OpenMP 比顺序版本慢

c - 如何为本地主机服务器同时打开 1000 个客户端进程?

c - 链接 2 个源文件而不是使用头文件有什么意义?

python - 如何使用 Fabric 使其并行运行?

c - OpenCL 内核似乎没有获取全局 id "globally"

c++ - 无法使用 #pragma omp parallel for 创建多个线程

openmp - cython openmp 单,屏障

c - "Can' t 打开输出文件“scanf 调用时出错

java - 从 JNI/NDK 将二维原始数组从 C 返回到 Java

linux - 在 bash 脚本中使用并行处理分组的输入文件