一開始我以為寫OpenMP需要安裝,就如同安裝OpenGL那樣,要把相關的.h、.lib、.dll檔丟到特定的資料夾,接著在專案中設定存取的相對位置,才能使用,不過那也是因為微軟「不想」支援OpenGL,我們才需要自己動手來「安裝」。好消息是微軟支援OpenMP,所以我們只要在專案特性中把OpenMP的選項打開即可寫OpenMP程式!
這篇文章要說是Visual Studio安裝OpenMP也是無妨!只要記得OpenMP已內建於Visual Studio中,我們只要去開啟它就能使用了!

不過,並不是所有Microsoft的IDE版本都支援,我寫程式常用的Microsoft Visual C++ 2010 Express雖然有打開OpenMP的選項,但編譯後卻找不到omp.h這個檔,我只好安裝Microsoft Visual Studio 2010 Professional,沒想到同樣的步驟,我馬上就得到平行運算後的結果!真令人開心呢~
至此設定完全結束!什麼?!這麼簡單?沒錯~接下來就來跑OpenMP的程式。
/**
Theme: My First OpenMP Program
Compiler: Visual Studio 2010 Professional
Date: 100/10/20
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
#include <omp.h>
#include <iostream>
void test( int n )
{
for( int i = 0; i < 10000; ++ i )
{
//do nothing, just waste time
}
//printf( "%d, ", n );
std::cout<< n << ", ";
}
int main(int argc, char* argv[])
{
#pragma omp parallel for
for( int i = 0; i < 10; ++ i )
test( i );
system( "pause" );
}
跑出來的結果是:
0, 6, 8, 3, 1, 7, 9, 4, 2, 5, 請按任意鍵繼續 . . .
每次執行都是不同的序列,這是非決定性的運算架構。
註解掉#include <omp.h>和#pragma omp parallel for這兩行後的執行結果:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 請按任意鍵繼續 . . .
所呈現的就是一般用單核心跑程式的結果。
在此想跟Heresy前輩不一樣的程式內容是,想用C++的Standard Output:
std::cout<< n << ", ";
結果如何呢?
8036, , , , 9147, , , , 25, , 請按任意鍵繼續 . . .
嘿~你沒有看錯,怎麼執行都這麼印出,可以想一下為什麼,話說,我用的是4核心的電腦。
上圖上半部份表示1個job分為3個task,只用1顆核心執行,下半部份則依task的需求分成3顆核心、4顆核心、2顆核心來執行。若演算法適合平行化,想必效能會有所提昇!
參考:OpenMP 官方網站、簡易的程式平行化方法-OpenMP(一)簡介、Begin Parallel Programming With OpenMP、WiKi – OpenMP。







Comments on: "[OpenMP] Visual Studio 使用 OpenMP" (2)
[…] 學任何程式語言都要來Hello World,這裡OpenMP也不例外,在Microsoft Visual Studio 2010 Professional設定啟用OpenMP(可參考[OpenMP] Visual Studio 使用 OpenMP)之後,就可以編譯OpenMP的程式碼。 […]
讚讚
[…] 也許有人會不相信第一個OpenMP程式是用4核心(我的電腦是4核心)來跑,那麼我來做以下的實驗。 […]
讚讚