2016-02-03 61 views
2

我試圖編寫一個小型C程序來弄清楚OpenMP如何工作。這個例子應該計算1到1000之和;然而,它在終端打印出0。我只能在#pragma的東西出來後才能得到想要的結果。有人可能會告訴我原因嗎?OpenMP如何在內部工作

This guide表示#pragma omp for將for循環的工作劃分爲當前團隊的線程。它不會創建線程,它只會將工作分配給當前正在執行的團隊的線程。所以我們應該在整個執行過程中只有一個主線程,對嗎?

#include <stdio.h> 

int main() { 

    int n, sum = 0; 
    #pragma omp for 
    for (n = 0; n <1000; n++) { 
     sum += n; 
    } 

    printf("%d\n"); 
    return 0; 
} 

回答

4

您有這樣一個簡單的例子幾個問題...

1)你是不是開始並行區域。爲此,請使用omp parallel for而不是僅使用omp for

2)您的變量沒有被設置爲專用於在不同循環中工作的每個線程。所以每個線程都會覆蓋每個其他線程版本的變量。具體來說n需要製作成私人。

3)您正試圖在多個線程之間求和一個共享變量。這必須用reduction條款完成。

4)您不打印任何內容。您的printf()語法原樣不會打印出正確的結果。

所以,你的例子實際上應該是這樣的:

int n, sum = 0; 
#pragma omp parallel for private(n) reduction(+:sum) 
for (n = 0; n < 1000; n++) { 
    sum += n; 
} 

printf("%d\n", sum); 

我強烈建議你看看一個基本的OpenMP教程(網上或書)。只需要一點研究,前三個問題就會顯而易見。

+0

這是我第一天開始學習並行編程,感謝您指出這些錯誤。你有沒有在線推薦的書籍或幻燈片?我發現的大多數材料都假設讀者在這個領域有一些相關的經驗.. –

+0

@YufanFei [這是一個很好的教程](https://computing.llnl.gov/tutorials/openMP/),我已經提到幾次。雖然在我看來這本書的最好的書是[這一個](http://www.amazon.com/Using-OpenMP-Programming-Engineering-Computation/dp/0262533022)。非常方便新人。 – NoseKnowsAll

+0

相關的for循環中的循環變量被預先確定爲「private」,因此private(n)是多餘的。 –