在 OpenMP 中循环并行

schedule 子句的含义如下:

  • static[,chunk]:以循环方式静态分配(意味着在进入循环之前完成分发)循环迭代以 chunk 大小进行批量处理。如果未指定 chunk,则块尽可能均匀,并且每个线程最多只能获得其中一个。
  • dynamic[,chunk]:使用先到先得的策略,按批次的 chunk 大小在线程之间分配循环迭代,直到没有剩余批处理。如果未指定,则 chunk 设置为 1
  • guided[,chunk]:与 dynamic 一样,但批量大小越来越小,低至 1
  • auto:让编译器和/或运行时库决定什么是最合适的
  • runtime:通过 OMP_SCHEDULE 环境变量在运行时决定。如果在运行时未定义环境变量,则将使用默认调度

schedule 的默认值是实现定义。在许多环境中它是 static,但也可以是 dynamic 或者很可能是 auto。因此,请注意,如果没有明确设置,你的实现不会隐式依赖它。

在上面的例子中,我们使用融合形式 parallel forparallel do。但是,可以使用循环结构而不将其与 parallel 指令融合,在 parallel 区域内以 #pragma omp for [...]!$omp do [...] 独立指令的形式。

仅对于 Fortran 版本,默认情况下,并行循环的循环索引变量始终为 private。因此,没有必要明确地宣称它们为 private(尽管这样做不是错误)。
对于 C 和 C++版本,循环索引就像任何其他变量一样。因此,如果它们的范围扩展到并行化循环之外(意味着如果它们不像 for ( int i = ...) 那样声明,而是像 int i; ... for ( i = ... ) 那么它们必须被声明为 private