http://blog.csdn.net/bendanban/article/details/6302857 在學習并行編程之前,你應該知道進程、線程、主線程、從線程等基本概念。進程是一個大型應用程序的基本單位,在任務管理器里進程都有一個名稱,后面跟隨的是與他有關的資源。線程是程序執行的基本單位,它必須從屬與一個進程,一個進程可以有多個線程,同一個進程的線程可以共享進程的資源,例如他們可以引用同一個變量的值。一個進程一般會與一個.EXE文件關聯,所以我把程序和進程不加區分。一個程序中有多個線程時,它必然會有一個主線程,主線程執行完后,其它從線程也應該結束執行。
并行化編程一般可以理解為多個線程的創建和并行化編程,并行化編程的東西很多,但他們都會有兩個必須的規定:1、程序執行模型。2、存儲模型。
程序執行模型,他規定了并行化線程的執行方式,規則,或者說邏輯結構。openMP的執行采用了Fork-Join模型。主線程在執行過程中遇到要并行處理的部分,根據openMP的編譯指導語句來創建,執行多個線程,創建的線程個數一般與計算機的核心數成正比,可以通過添加一個環境變量(OMP_NUM_THREADS)來規定創建線程的個數,注意環境變量添加后要注銷或者重啟系統才會生效。

圖1 omp程序執行模型
存儲模型,omp針對的是一個計算機或者分布式計算機的并行,在一臺計算機上他采用共享存儲的方式,多個線程共享一塊進程的內存資源。
下面先寫個程序例子,能讓大家有個初步認識。這個程序是在VS2008中編譯的,項目類型為Win32ConsoleApplication。
例1、并行HelloWorld程序:
#include <stdio.h>
#include "omp.h"
int main(int argc, char* argv[])


{
printf("Hello World! Serial Begin./n");
#pragma omp parallel //開始并行執行

{ printf("Hello World! Parallel/n"); }
printf("Hello World! Serial again./n");
return 0;
}
此程序編譯之前,還需要你對你的編譯器項目屬性設置一下。這里我們以VS2008為例,首先設置項目支持openMP。右擊項目->屬性->C/C++->語言->openMP支持修改為是,如圖2所示,然后代碼生成修改為多線程調試,如圖3所示。執行結果如圖4所示。

圖2、添加openMP支持

圖3、多線程調試支持

圖4、執行結果
以上程序我并沒有設置環境變量,因為我的計算機是雙核的,所以他的并行部分輸出了兩行Hello World! Parallel,這說明他有兩個線程執行并行部分,每個線程完全執行了相同的一段程序。我們在設置一下環境變量后在執行一下。順便說明一下怎樣設置環境變量。
計算機右擊-》屬性-》高級-》環境變量-》系統變量-》新建。。。如圖5所示。

圖5、Win7環境下設置環境變量
設置完環境后,注銷或重啟系統后,再次執行例1的程序后得到的結果中Hello World! Parallel 將被執行四遍。因為你已經設置了四個線程了。
到現在為止,大家可以模仿著例1寫幾個小程序了,可是還有一句話大家可能還不大明白吧,#pragma omp parallel這句話標記{}中的程序將在OMP_NUM_THREADS個線程中執行。
在下面的幾篇文章中我將繼續講解openMP編程的基礎知識。歡迎繼續關注。