OpenMP意外输出

时间:2011-10-15 03:17:40

标签: c++ openmp

我有两个并行的线程但是这个线程没有分解成线程:

#pragma omp parallel sections
  {
#pragma omp section
    {
      for(int i=0;i<4;++i)
        printf("Loop A %d %d\n", omp_get_thread_num(),2);
    }
#pragma omp section
    {
      for(int i=0;i<4;++i)
        printf("Loop B %d %d\n", 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

2 个答案:

答案 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

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

答案 1 :(得分:1)

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

// 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 %d\n", 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