我有两个并行的线程但是这个线程没有分解成线程:
#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
答案 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