OpenMP并行程序設計(一)
作者:周偉明
OpenMP是一個支持共享存儲并行設計的庫,特別適宜多核CPU上的并行程序設計。今天在雙核CPU機器上試了一下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的具體指令和用法。
原文鏈接:http://blog.csdn.net/drzhouweiming/article/details/1131537
責任編輯:陳四芳
來源:
blog.csdn.net