1. 程式人生 > >OpenMP並行程式設計(一)

OpenMP並行程式設計(一)

  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的具體指令和用法。