Just My Life & My Work

[OpenMP] Visual Studio 使用 OpenMP

一開始我以為寫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,沒想到同樣的步驟,我馬上就得到平行運算後的結果!真令人開心呢~

開啟Visual Studio之後,選擇Visual C++建立新專案,以Empty Project建立,命好名後按確定。

在Source File按右鍵Add->New Item。

新增C++ File,命完名之後按確定。

將程式碼貼上剛才所新增的Source File。

最重要的步驟來了,在專案名稱按右鍵,點選Property。

從Configuration Properties->C/C++->Language->OpenMP Support,選擇Yes(/openmp)。

至此設定完全結束!什麼?!這麼簡單?沒錯~接下來就來跑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)

  1. 未知 的大頭貼

    […] 學任何程式語言都要來Hello World,這裡OpenMP也不例外,在Microsoft Visual Studio 2010 Professional設定啟用OpenMP(可參考[OpenMP] Visual Studio 使用 OpenMP)之後,就可以編譯OpenMP的程式碼。 […]

  2. 未知 的大頭貼

    […] 也許有人會不相信第一個OpenMP程式是用4核心(我的電腦是4核心)來跑,那麼我來做以下的實驗。 […]

回覆給[OpenMP] Hello World « 逍遙文工作室 取消回覆

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

標籤雲