是否可以在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一起工作的方式。我想知道这种行为是否可移植,或者是规范没有定义的东西,可以预期任何事情。
答案 0 :(得分:2)
根据this文件:
DO / for,SECTIONS,SINGLE,MASTER和BARRIER指令绑定到动态封闭的PARALLEL(如果存在)。如果当前没有执行并行区域,则指令无效。
所以答案是那些pragma可以在并行区域之外使用。虽然我仍然没有在文档中明确写出它。