1

我在 Mac OSX 10.8.3 上工作,我正在用 C 编程。我使用 bash 作为我的 shell,我使用 macports 的 gcc-mp-4.7,因为我知道苹果的 gcc 有时不能完全使用打开mp。我之前运行过一些 openmp 文件,它们通常工作正常,但是当我尝试将并行用于 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 封垃圾邮件)。

如果它是并行运行的,则不应该发生这种情况,没有什么可以保护这样的顺序。我相信它显然是按顺序运行的,而忽略了并行化它的命令。

有谁知道我可能做错了什么?谢谢你尽你所能的帮助。

4

2 回答 2

2
  1. 你应该使用#pragma omp parallel for

    #pragma omp parallel for
    for(n=0; n<100; ++n)
    {
        printf(" %d", n);
    }
    

    或分开#pragma omp paralleland #pragma omp for,如果您愿意:

    #pragma omp parallel
    {
        #pragma omp for
        for(n=0; n<100; ++n)
        {
            printf(" %d", n);
        }
    }
    

    需要注意的重要一点是#pragma omp parallel创建线程池并#pragma omp for 使用创建的池。如果您没有池,它将是单线程的。

  2. 确保你-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.
    
于 2013-07-03T17:24:21.677 回答
2

最外面的循环必须包含parallel创建新线程池的关键字。所以应该是:

#pragma omp parallel for
于 2013-07-03T17:24:22.657 回答