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