在omp并行块之外的omp指令提示

9

在omp parallel块之外使用类似于critical、single、master或barrier的omp pragmas是否可行?我有一个函数可以从OMP parallel块中调用,也可以不调用。如果是,则需要将部分代码包含在关键部分中。换句话说,这段代码是否正确?

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

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

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

我在OpenMP文档中没有找到相关内容。我猜测代码的行为应该与单线程执行完全相同 - 这也是gcc的工作方式。我想知道这种行为是否可移植,或者它是否是规范未定义的东西,任何结果都可能出现。


我认为这对于大多数编译指示是可以的。 - osgx
1个回答

3
根据这份文档:

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

所以答案是这些编译指示符可以在并行区域之外使用。尽管我仍然没有在文档中明确写出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接