聲明:歡迎任何人和組織轉載本blog中文章,但必須標記文章原始連結和作者資訊。
本文連結:http://blog.csdn.net/li_007/archive/2009/04/30/4139211.aspx
開拓進取的小烏龜------->CSDN點滴點點滴滴Blog
之前大概看了一下openMP,並且在初期像很多人一樣犯了一些低級錯誤。
openMP是一種API,不是另一種程式設計語言,是像XML這樣的一種業界標準,是一種基於記憶體共用的可擴充的可移植的多核並行編程模型,它適合於PC應用程式,同樣也適合超級電腦的並行編程。可以去openMP的官網(www.openmp.org)它的介紹。
openMP的語句也很簡潔,由#pragma omp這個directives加上一些如parallel、for、section、etc子語句組成,現在又很多人寫了大量這方面的文章,如何感興趣可以去baidu or google一下,當然最好是去官網或者www.wikipedia.org看看,畢竟它們更權威和專業。
支援openMP的編譯器有很多,流行的Visual Studio .NET 2005/2008都支援(說明一下,只有professional Edition 和 Team Edition才支援)、當然還有Intel studio@parallel、gcc 4.3.2以上版本的編譯器都支援openMP。在VS系列中,如果沒有用到openMP的omp_get_thread_num()等等這些API,是不需要包含<omp.h>標頭檔的。只需要在項目屬性中開啟openMP支援就可以了。
#include "stdafx.h"<br />#include <omp.h><br />#include <iostream></p><p>using namespace std;</p><p>int _tmain(int argc, _TCHAR* argv[])<br />{<br />int a[6][6] = {0};<br />int i, j;<br />int sum = 0;<br />omp_set_num_threads(3);//設定線程數為3</p><p> // omp_get_thread_num()得到當前線程ID<br />#pragma omp parallel for private(i, j) reduction(+:sum)<br />for(i = 1; i <= 6; i ++)<br />{<br />for(j = 1; j <= 6; j ++)<br />{<br />a[i][j] = i * j;<br />printf("a[%d][%d] = %d ID = %d/n", i, j, a[i][j], omp_get_thread_num());</p><p>sum += a[i][j];<br />}<br />}</p><p>int max = 0;<br />int min = 37;<br />int m, n;</p><p>#pragma omp parallel for private(m, n) //lastprivate(max, min)<br /> for(m = 6; m >= 0; m --)<br />{<br />for(n = 0; n <= 6; n ++)<br />{<br />#pragma omp parallel sections<br />{<br />#pragma omp section<br />#pragma omp critical<br />if(max < a[m][n])<br />max = a[m][n];</p><p>#pragma omp section<br />#pragma omp critical<br />if(min > a[m][n])<br />min = a[m][n];<br />}</p><p>printf("max = %d min = %d ID = %d/n", max, min, omp_get_thread_num());<br />}<br />}</p><p>cout<<"/nsum = "<<sum<<endl;<br />cout<<"max = "<<max<<endl;<br />cout<<"min = "<<min<<endl;</p><p>int loop;<br />cin>>loop;<br />return 0;<br />}
上面是一個簡單的利用了openMP的程式 ,執行結果如下:
a[3][1] = 3 ID = 1<br />a[1][1] = 1 ID = 0<br />a[5][1] = 5 ID = 2<br />a[3][2] = 6 ID = 1<br />a[1][2] = 2 ID = 0<br />a[5][2] = 10 ID = 2<br />a[3][3] = 9 ID = 1<br />a[1][3] = 3 ID = 0<br />a[5][3] = 15 ID = 2<br />a[3][4] = 12 ID = 1<br />a[1][4] = 4 ID = 0<br />a[5][4] = 20 ID = 2<br />a[3][5] = 15 ID = 1<br />a[1][5] = 5 ID = 0<br />a[5][5] = 25 ID = 2<br />a[3][6] = 18 ID = 1<br />a[1][6] = 6 ID = 0<br />a[5][6] = 30 ID = 2<br />a[4][1] = 4 ID = 1<br />a[2][1] = 2 ID = 0<br />a[6][1] = 6 ID = 2<br />a[4][2] = 8 ID = 1<br />a[2][2] = 4 ID = 0<br />a[6][2] = 12 ID = 2<br />a[4][3] = 12 ID = 1<br />a[2][3] = 6 ID = 0<br />a[6][3] = 18 ID = 2<br />a[4][4] = 16 ID = 1<br />a[2][4] = 8 ID = 0<br />a[6][4] = 24 ID = 2<br />a[4][5] = 20 ID = 1<br />a[2][5] = 10 ID = 0<br />a[6][5] = 30 ID = 2<br />a[4][6] = 24 ID = 1<br />a[2][6] = 12 ID = 0<br />a[6][6] = 36 ID = 2<br />max = 30 min = 30 ID = 0<br />max = 30 min = 0 ID = 2<br />max = 30 min = 0 ID = 1<br />max = 30 min = 0 ID = 0<br />max = 30 min = 0 ID = 2<br />max = 30 min = 0 ID = 1<br />max = 30 min = 0 ID = 0<br />max = 30 min = 0 ID = 2<br />max = 30 min = 0 ID = 1<br />max = 30 min = 0 ID = 0<br />max = 30 min = 0 ID = 2<br />max = 30 min = 0 ID = 1<br />max = 30 min = 0 ID = 0<br />max = 30 min = 0 ID = 2<br />max = 30 min = 0 ID = 1<br />max = 30 min = 0 ID = 0<br />max = 30 min = 0 ID = 2<br />max = 30 min = 0 ID = 1<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 2<br />max = 36 min = 0 ID = 1<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 2<br />max = 36 min = 0 ID = 1<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 2<br />max = 36 min = 0 ID = 1<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 2<br />max = 36 min = 0 ID = 1<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 2<br />max = 36 min = 0 ID = 1<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 2<br />max = 36 min = 0 ID = 1<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 2<br />max = 36 min = 0 ID = 1<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 2<br />max = 36 min = 0 ID = 1<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 0<br />max = 36 min = 0 ID = 0</p><p>sum = 441<br />max = 36<br />min = 0<br />
註:在這裡說明一下,不能使用C++的cout輸出,貌似是不支援多線程輸出,大家可以自己去測試。