在 OpenMP 中循环并行
schedule
子句的含义如下:
static[,chunk]
:以循环方式静态分配(意味着在进入循环之前完成分发)循环迭代以chunk
大小进行批量处理。如果未指定chunk
,则块尽可能均匀,并且每个线程最多只能获得其中一个。dynamic[,chunk]
:使用先到先得的策略,按批次的chunk
大小在线程之间分配循环迭代,直到没有剩余批处理。如果未指定,则chunk
设置为 1guided[,chunk]
:与dynamic
一样,但批量大小越来越小,低至 1auto
:让编译器和/或运行时库决定什么是最合适的runtime
:通过OMP_SCHEDULE
环境变量在运行时决定。如果在运行时未定义环境变量,则将使用默认调度
schedule
的默认值是实现定义。在许多环境中它是 static
,但也可以是 dynamic
或者很可能是 auto
。因此,请注意,如果没有明确设置,你的实现不会隐式依赖它。
在上面的例子中,我们使用融合形式 parallel for
或 parallel do
。但是,可以使用循环结构而不将其与 parallel
指令融合,在 parallel
区域内以 #pragma omp for [...]
或 !$omp do [...]
独立指令的形式。
仅对于 Fortran 版本,默认情况下,并行循环的循环索引变量始终为 private
。因此,没有必要明确地宣称它们为 private
(尽管这样做不是错误)。
对于 C 和 C++版本,循环索引就像任何其他变量一样。因此,如果它们的范围扩展到并行化循环之外(意味着如果它们不像 for ( int i = ...)
那样声明,而是像 int i; ... for ( i = ... )
那么它们必须被声明为 private
。