9

是否可以在 omp 并行块之外使用 omp pragma,如关键、单一、主或屏障?我有一个可以从 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 一起工作的方式。我想知道这种行为是可移植的,还是规范没有定义的东西,任何东西都是可以预期的。

4

1 回答 1

3

根据这份文件:

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

所以答案是这些编译指示可以在并行区域之外使用。虽然我仍然没有发现它在文档中明确写入。

于 2012-09-27T19:24:24.987 回答