关键指令在openmp的部分内部不起作用

时间:2020-06-01 02:41:33

标签: openmp

#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;
 }

在上面的代码输出操作中,尽管处于临界区,但在两个区之间存在竞争。您能说出为什么会发生这种情况吗?我该如何确保它们之间没有种族冲突?

1 个答案:

答案 0 :(得分:3)

几乎可以肯定,高性能标记指出了这个问题:您在OpenMP实用程序中误拼了“关键”一词。

但是,这指出了更普遍的问题,您应该(至少)在编译时启用警告。使用GCC,您可以使用-Wall来实现,或者,如果只想警告该错误,可以使用-Wunknown-pragmas

如果您想更加严格和更具选择性,可以使用-Werror=unknown-pragmas,这将导致带有拼写错误的编译指示的此类代码无法编译。这些缺点的一个缺点是,如果您随后在不使用-fopenmp的情况下编译代码,则对于每个OpenMP编译指示都会收到警告/错误。

因此,您可能只想在拥有-Werror=unknown-pragmas的情况下才启用-fopenmp。 (这在Make中应该很简单;在“简单”,“现代”构建系统中有多么容易,我不知道:-))。

感谢高性能标记提供的原始答案,感谢Jakub Jelinek提供的GCC论证教育。

相关问题