我正在使用Mac OSX 10.8.3,我正在用C语言编程。我使用bash作为我的shell,我使用的是来自macports的gcc-mp-4.7,因为我知道来自苹果的gcc有时不会完全适用于openmp。我以前运行过一些openmp文件,它们通常工作正常,但是当我尝试使用parallel for pragma时,我不会按照我的想法工作。我的.c文件示例如下:
#include <omp.h>
#include <stdio.h>
int main (int argc, char *argv[]) {
int n;
#pragma omp for
for(n=0; n<100; ++n)
{
printf(" %d", n);
}
printf(".\n");
}
每次输出0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99.
(超过20个垃圾邮件)。
这不应该发生,如果它是并行运行,没有什么可以保护这样的订单。我相信它显然按顺序运行,忽略了并行化它的命令。
有谁知道我可能做错了什么?感谢您提供的任何帮助。
答案 0 :(得分:2)
您应该使用#pragma omp parallel for
:
#pragma omp parallel for
for(n=0; n<100; ++n)
{
printf(" %d", n);
}
或单独#pragma omp parallel
和#pragma omp for
,如果您愿意:
#pragma omp parallel
{
#pragma omp for
for(n=0; n<100; ++n)
{
printf(" %d", n);
}
}
需要注意的重要一点是#pragma omp parallel
创建了一个线程池,#pragma omp for
使用创建的池。如果你没有游泳池,那就是单线程。
确保在构建时传递-fopenmp
。
示例:
$ gcc -fopenmp example.c -o example
$ ./example
13 0 78 65 52 39 14 1 26 91 79 66 53 40 15 2 27 92 80
67 54 41 16 3 28 93 81 68 55 42 17 4 29 94 82 69 56 43
18 5 30 95 83 70 57 44 19 6 31 96 84 71 58 45 20 7 32
97 85 72 59 46 21 8 33 98 86 73 60 47 22 9 34 99 87 74
61 48 23 10 35 88 75 62 49 24 11 36 89 63 76 50 25 12
37 90 64 77 51 38.
答案 1 :(得分:2)
最外层循环必须包含parallel
关键字才能创建新的线程池。所以它应该是:
#pragma omp parallel for