在omp并行块之外的omp pragma

时间:2012-09-07 11:00:30

标签: c++ c openmp

是否可以在omp并行块之外使用omp pragma,如critical,single,master或barrier?我有一个可以从OMP并行块调用的函数。如果是,我需要将部分代码包含在关键部分中。换句话说,这段代码好吗?

void myfunc(){
    #pragma omp critical
    { /* code */ }
}

// not inside an omp parallel region
myfunc();

#pragma omp parallel
{
    // inside an omp parallel region
    myfunc();
}

我在OpenMP文档中没有提到这一点。我猜代码应该与1个线程执行完全一样 - 这就是它与gcc一起工作的方式。我想知道这种行为是否可移植,或者是规范没有定义的东西,可以预期任何事情。

1 个答案:

答案 0 :(得分:2)

根据this文件:

  

DO / for,SECTIONS,SINGLE,MASTER和BARRIER指令绑定到动态封闭的PARALLEL(如果存在)。如果当前没有执行并行区域,则指令无效。

所以答案是那些pragma可以在并行区域之外使用。虽然我仍然没有在文档中明确写出它。