我有一个像这样的
部分块中的单个块#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int main (int argc, char *argv[])
{
int nthreads, tid;
/* Fork a team of threads giving them their own copies of variables */
#pragma omp parallel private(tid)
{
#pragma omp sections
{
#pragma omp section
{
printf("First section %d \n" , tid);
}
#pragma omp section
{
#pragma omp single
{
printf("Second Section block %d \n" , tid);
}
}
}
} /* All threads join master thread and disband */
printf("Outside parallel block \n");
}
编译此代码时,编译器会发出以下警告
工作共享区域可能不会紧密嵌套在工作共享,关键,有序或主区域内
为什么?
答案 0 :(得分:3)
它会给你这个警告,因为你有一个嵌套在openmp区域区域内的openmp单区域,而没有嵌套在它们之间的openmp平行区域。
这被称为紧密嵌套的区域。
在C中,工作共享结构用于,部分和单个。
有关详细信息,请参阅OpenMP Specification或查看Intel's Documentation on Improper nesting of OpenMP* constructs。
为了让代码干净利落,请尝试将#pragma omp sections
替换为#pragma omp parallel sections
将#pragma omp sections
与#pragma omp parallel
括起来。
有关更多信息和示例,请参阅Guide into OpenMP: Easy multithreading programming for C++。