OpenMP意外输出

OpenMP Unexpected output

本文关键字:输出 意外 OpenMP      更新时间:2023-10-16

我有两个并行的线程,但这一个不分解成线程:

#pragma omp parallel sections
  {
#pragma omp section
    {
      for(int i=0;i<4;++i)
        printf("Loop A %d %dn", omp_get_thread_num(),2);
    }
#pragma omp section
    {
      for(int i=0;i<4;++i)
        printf("Loop B %d %dn", omp_get_thread_num(),3);
    }           
  }
输出:

运行……

Loop A 0 2
Loop A 0 2
Loop A 0 2
Loop A 0 2
Loop B 0 3
Loop B 0 3
Loop B 0 3
Loop B 0 3

发生这种情况的原因有很多。我将列出我知道的可能的:

1:确保您实际上有一个多核机器。如果它是一个单核机器(没有HT),它将只运行一个线程。

2:如果这是在Visual Studio上,您需要启用OpenMP支持。仅仅包含标题是不够的:

Project -> Properties -> Configuration Properties -> C/C++ -> Language -> Open MP Support

将其更改为Yes (/openmp),应该是启用的。

我运行你的代码与OpenMP设置正确,我得到这个:

Loop A 0 2
Loop B 2 3
Loop B 2 3
Loop B 2 3
Loop B 2 3
Loop A 0 2
Loop A 0 2
Loop A 0 2

所以我认为你的代码是正确的

这可能发生得太快了。我已经尝试了大量的迭代,它工作如预期:

// gcc -std=c99 *.c -fopenmp && ./a.out
#include <stdio.h>
#include <omp.h>
enum { N = 10000,  M = N/2 };
static void loop(char* s, int d) {
  for(int i=0;i<N;++i)
    if (i % M == 0)
      printf("Loop %s %d %d %dn", s, i, omp_get_thread_num(),d);
}
int main() {
#pragma omp parallel sections
  {
#pragma omp section
    loop("A", 2);
#pragma omp section
    loop("B", 3);
  }
}

输出
Loop A 0 7 2
Loop B 0 4 3
Loop A 5000 7 2
Loop B 5000 4 3