我的问题很简单,但我无法找到要搜索答案的字词。
如果我这样做:
const unsigned N = ... ;
#pragma omp parallel
{
unsigned i;
#pragma omp for
for(i=0; i<N; i++) // first loop
<1st stuffs>
<stuffs with other omp for...>
#pragma omp for
for(i=0; i<N; i++) // second loop
<3rd stuffs>
}
第一个和第二个循环是否保证在线程之间以相同的方式分开?
如果没有,是否还有明确定义块大小或使用schedule子句的可能性?
答案 0 :(得分:3)
如果满足某些条件,则为是(OpenMP规范,第2.7.1节循环结构):
static
时间表的合规实施必须确保这一点 将使用相同的线程逻辑迭代次数分配 如果满足以下条件,则在两个循环区域中:1)两个循环 区域具有相同数量的循环迭代,2)两个循环区域 具有相同的 chunk_size 值,或者两个循环区域都没有 指定了 chunk_size ,3)两个循环区域绑定到同一个并行区域,并且4)两个循环都没有与SIMD结构相关联。
示例中的代码满足所有四个条件,但您必须显式指定静态调度,因为OpenMP规范会保留默认的循环调度类型(即没有schedule
子句时的类型目前)具体实施。
以下代码是完全符合的示例:
#pragma omp parallel
{
#pragma omp for schedule(static)
for(i=0; i<N; i++) // first loop
<1st stuffs>
<other stuff>
#pragma omp for schedule(static)
for(i=0; i<N; i++) // second loop
<3rd stuffs>
}
答案 1 :(得分:1)
根据这个答案https://stackoverflow.com/a/10852852/7024081,假设# threads
和N
未更改,并且调度设置为{{1},则两个循环中的线程确实将被分配相同的迭代范围}。
如果您无法将计划设置为静态,我不确定会发生什么,因为默认计划将取决于实施:https://computing.llnl.gov/tutorials/openMP/#DO