#include <omp.h>
#include <iostream>
int main(int argc, char *argv[]) {
#pragma omp parallel num_threads(2)
{
#pragma omp sections
{
#pragma omp section
{
#pragma omp cirtical
{
std::cout<<"first section is executed by thread "<<omp_get_thread_num()<<"\n";
}
}
#pragma omp section
{
#pragma omp cirtical
{
std::cout<<"second section is executed by thread "<<omp_get_thread_num()<<"\n";
}
}
}
}
return 0;
}
在上面的代码输出操作中,尽管处于临界区,但在两个区之间存在竞争。您能说出为什么会发生这种情况吗?我该如何确保它们之间没有种族冲突?
答案 0 :(得分:3)
几乎可以肯定,高性能标记指出了这个问题:您在OpenMP实用程序中误拼了“关键”一词。
但是,这指出了更普遍的问题,您应该(至少)在编译时启用警告。使用GCC,您可以使用-Wall
来实现,或者,如果只想警告该错误,可以使用-Wunknown-pragmas
。
如果您想更加严格和更具选择性,可以使用-Werror=unknown-pragmas
,这将导致带有拼写错误的编译指示的此类代码无法编译。这些缺点的一个缺点是,如果您随后在不使用-fopenmp
的情况下编译代码,则对于每个OpenMP编译指示都会收到警告/错误。
因此,您可能只想在拥有-Werror=unknown-pragmas
的情况下才启用-fopenmp
。 (这在Make中应该很简单;在“简单”,“现代”构建系统中有多么容易,我不知道:-))。
感谢高性能标记提供的原始答案,感谢Jakub Jelinek提供的GCC论证教育。