OpenMP並行程式設計(一)
阿新 • • 發佈:2019-02-10
OpenMP並行程式設計(一)
OpenMP是一個支援共享儲存並行設計的庫,特別適宜多核CPU上的並行程式設計。今天在雙核CPU機器上試了一下OpenMP並行程式設計,發現效率方面超出想象,因此寫出來分享給大家。
在VC8.0中專案的屬性對話方塊中,左邊框裡的“配置屬性”下的“C/C++”下的“語言”頁裡,將OpenMP支援改為“是/(OpenMP)”就可以支援OpenMP了。
先看一個簡單的使用了OpenMP程式
int main(int argc, char* argv[])
{
#pragma omp parallel for
for (int i = 0; i < 10; i++ )
{
printf("i = %d/n", i);
}
return 0;
}
這個程式執行後打印出以下結果:
i = 0
i = 5
i = 1
i = 6
i = 2
i = 7
i = 3
i = 8
i = 4
i = 9
可見for 迴圈語句中的內容被並行執行了。(每次執行的列印結果可能會有區別)
這裡要說明一下,#pragma omp parallel for 這條語句是用來指定後面的for迴圈語句變成並行執行的,當然for迴圈裡的內容必須滿足可以並行執行,即每次迴圈互不相干,後一次迴圈不依賴於前面的迴圈。
有關#pragma omp parallel for 這條語句的具體含義及相關OpenMP指令和函式的介紹暫時先放一放,只要知道這條語句會將後面的for迴圈裡的內容變成並行執行就行了。
將for迴圈裡的語句變成並行執行後效率會不會提高呢,我想這是我們最關心的內容了。下面就寫一個簡單的測試程式來測試一下:
void test()
{
int a = 0;
clock_t t1 = clock();
for (int i = 0; i < 100000000; i++)
{
a = i+1;
}
clock_t t2 = clock();
printf("Time = %d/n" , t2-t1);
}
int main(int argc, char* argv[])
{
clock_t t1 = clock();
#pragma omp parallel for
for ( int j = 0; j < 2; j++ ){
test();
}
clock_t t2 = clock();
printf("Total time = %d/n", t2-t1);
test();
return 0;
}
在test()函式中,執行了1億次迴圈,主要是用來執行一個長時間的操作。
在main()函式裡,先在一個迴圈裡呼叫test()函式,只迴圈2次,我們還是看一下在雙核CPU上的執行結果吧:
Time = 297
Time = 297
Total time = 297
Time = 297
可以看到在for迴圈裡的兩次test()函式呼叫都花費了297ms, 但是打印出的總時間卻只花費了297ms,後面那個單獨執行的test()函式花費的時間也是297ms,可見使用平行計算後效率提高了整整一倍。
下一篇文章中將介紹OpenMP的具體指令和用法。