OpenMP: VS2010配置使用OpenMP
阿新 • • 發佈:2018-12-18
一個簡單的OpenMP例子
首先啟動VisualStudio 2010,新建一個C++的控制檯應用程式,如下圖所示:
然後在專案解決方案資源管理器上選擇專案名稱,點選右鍵,選擇“屬性”,如下圖所示:
然後在屬性頁上左側選擇“配置屬性”——“C/C++”——“語言”,然後在右側“OpenMP支援”後選擇“是(/openmp)”,如下圖所示:
在cpp檔案中新增如下程式碼:
#include "stdafx.h"#include<omp.h>#include<iostream>usingnamespace std;//迴圈測試函式 void test(){for(int i=0;i<10000;i++){}}int _tmain(int argc,_TCHAR* argv[]){cout<<"這是一個序列測試程式!\n";double start = omp_get_wtime( );//獲取起始時間for(int i = 0; i < 10000; i++){ test();}double end = omp_get_wtime( );cout<<"計算耗時為:"<<end -start<<"\n";cin>>end;return 0;}
以上程式碼中紅色字型為新增的程式碼,以上程式是一個典型的序列程式,經過隨機執行10次,其平均耗時約0.283273s(具體所耗時間跟測試計算機有密切的關係,測試電腦CPU採用Core I7 2630QM,4核)。
下面將其轉換成並行程式,只需要在for迴圈加上#pragma omp parallel for即可,如下程式碼(注意紅色部分):
#include "stdafx.h"#include<omp.h>#include <iostream>using namespace std;//迴圈測試函式void test(){for(inti=0;i<10000;i++){}}int _tmain(int argc, _TCHAR* argv[]){cout<<"這是一個並行測試程式!\n";doublestart = omp_get_wtime( );//獲取起始時間 #pragma ompparallel forfor(inti = 0; i < 10000; i++) {test();}doubleend = omp_get_wtime( );cout<<"計算耗時為:"<<end -start<<"\n";cin>>end;return0;}
同樣,也經過10次隨機的執行,其平均耗時約為0.06358044s,兩種不同執行方式的比較結果如下表所示: 次數 | 序列 | 並行 |
1 | 0.283382 | 0.0746704 |
2 | 0.283654 | 0.0686404 |
3 | 0.283212 | 0.0536631 |
4 | 0.280234 | 0.0517737 |
5 | 0.283041 | 0.0717588 |
6 | 0.283126 | 0.0524264 |
7 | 0.281881 | 0.0580316 |
8 | 0.283301 | 0.0730386 |
9 | 0.284545 | 0.0745088 |
10 | 0.286353 | 0.0572926 |
平均值 | 0.283273 | 0.06358044 |
兩種執行方式的結果如下圖所示:
從上面的分析結果可見,採用OpenMP並行所耗時間僅為序列的22.44%,節約近4.5倍的時間。