在學(xué)習(xí)并行編程之前,你應(yīng)該知道進(jìn)程、線程、主線程、從線程等基本概念。進(jìn)程是一個(gè)大型應(yīng)用程序的基本單位,在任務(wù)管理器里進(jìn)程都有一個(gè)名稱,后面跟隨的是與他有關(guān)的資源。線程是程序執(zhí)行的基本單位,它必須從屬與一個(gè)進(jìn)程,一個(gè)進(jìn)程可以有多個(gè)線程,同一個(gè)進(jìn)程的線程可以共享進(jìn)程的資源,例如他們可以引用同一個(gè)變量的值。一個(gè)進(jìn)程一般會(huì)與一個(gè).EXE文件關(guān)聯(lián),所以我把程序和進(jìn)程不加區(qū)分。一個(gè)程序中有多個(gè)線程時(shí),它必然會(huì)有一個(gè)主線程,主線程執(zhí)行完后,其它從線程也應(yīng)該結(jié)束執(zhí)行。
并行化編程一般可以理解為多個(gè)線程的創(chuàng)建和并行化編程,并行化編程的東西很多,但他們都會(huì)有兩個(gè)必須的規(guī)定:1、程序執(zhí)行模型。2、存儲(chǔ)模型。
程序執(zhí)行模型,他規(guī)定了并行化線程的執(zhí)行方式,規(guī)則,或者說(shuō)邏輯結(jié)構(gòu)。openMP的執(zhí)行采用了Fork-Join模型。主線程在執(zhí)行過(guò)程中遇到要并行處理的部分,根據(jù)openMP的編譯指導(dǎo)語(yǔ)句來(lái)創(chuàng)建,執(zhí)行多個(gè)線程,創(chuàng)建的線程個(gè)數(shù)一般與計(jì)算機(jī)的核心數(shù)成正比,可以通過(guò)添加一個(gè)環(huán)境變量(OMP_NUM_THREADS)來(lái)規(guī)定創(chuàng)建線程的個(gè)數(shù),注意環(huán)境變量添加后要注銷或者重啟系統(tǒng)才會(huì)生效。
圖1 omp程序執(zhí)行模型
存儲(chǔ)模型,omp針對(duì)的是一個(gè)計(jì)算機(jī)或者分布式計(jì)算機(jī)的并行,在一臺(tái)計(jì)算機(jī)上他采用共享存儲(chǔ)的方式,多個(gè)線程共享一塊進(jìn)程的內(nèi)存資源。
下面先寫個(gè)程序例子,能讓大家有個(gè)初步認(rèn)識(shí)。這個(gè)程序是在VS2008中編譯的,項(xiàng)目類型為Win32ConsoleApplication。
例1、并行HelloWorld程序
#include <stdio.h>
#include "omp.h"
int main(int argc, char* argv[])
{
printf("Hello World! Serial Begin./n");
#pragma omp parallel //開(kāi)始并行執(zhí)行
{ printf("Hello World! Parallel/n"); }
printf("Hello World! Serial again./n");
return 0;
}
此程序編譯之前,還需要你對(duì)你的編譯器項(xiàng)目屬性設(shè)置一下。這里我們以VS2008為例,首先設(shè)置項(xiàng)目支持openMP。右擊項(xiàng)目->屬性->C/C++->語(yǔ)言->openMP支持修改為是,如圖2所示,然后代碼生成修改為多線程調(diào)試,如圖3所示。執(zhí)行結(jié)果如圖4所示。
圖2、添加openMP支持
圖3、多線程調(diào)試支持
圖4、執(zhí)行結(jié)果
以上程序我并沒(méi)有設(shè)置環(huán)境變量,因?yàn)槲业挠?jì)算機(jī)是雙核的,所以他的并行部分輸出了兩行Hello World! Parallel,這說(shuō)明他有兩個(gè)線程執(zhí)行并行部分,每個(gè)線程完全執(zhí)行了相同的一段程序。我們?cè)谠O(shè)置一下環(huán)境變量后在執(zhí)行一下。順便說(shuō)明一下怎樣設(shè)置環(huán)境變量。
計(jì)算機(jī)右擊-》屬性-》高級(jí)-》環(huán)境變量-》系統(tǒng)變量-》新建。。。如圖5所示。
圖5、Win7環(huán)境下設(shè)置環(huán)境變量
設(shè)置完環(huán)境后,注銷或重啟系統(tǒng)后,再次執(zhí)行例1的程序后得到的結(jié)果中 Hello World! Parallel 將被執(zhí)行四遍。因?yàn)槟阋呀?jīng)設(shè)置了四個(gè)線程了。
到現(xiàn)在為止,大家可以模仿著例1寫幾個(gè)小程序了,可是還有一句話大家可能還不大明白吧,#pragma omp parallel這句話標(biāo)記{}中的程序?qū)⒃贠MP_NUM_THREADS個(gè)線程中執(zhí)行。
在下面的幾篇文章中我將繼續(xù)講解openMP編程的基礎(chǔ)知識(shí)。歡迎繼續(xù)關(guān)注。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
