2013-07-03 32 views
1

我正在使用Mac OSX 10.8.3,而且我使用C編程。我使用bash作爲我的shell,並且使用gcc-mp -4.7來自macports,因爲我知道來自蘋果的gcc有時不能完全使用openmp。我以前運行過幾個openmp文件,它們通常工作正常,但是當我嘗試使用並行處理雜注時,我不會如何工作。我的.c文件的一個例子是下面:Openmp編譯,但「parallel for」不能按照計劃工作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

我是建設它「GCC-MP-4.7 -fopenmp file.c」,因爲我已經固定編譯指示,它似乎工作得很好。謝謝。 –

回答

2
  1. 你應該用#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使用創建的池。如果你沒有一個池,它只是單線程的。

  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. 
    
2

最外迴路必須包括parallel關鍵字創建線程的新池。因此,它應該是:

#pragma omp parallel for