OpenMP程序的編譯和運(yùn)行_第1頁
OpenMP程序的編譯和運(yùn)行_第2頁
OpenMP程序的編譯和運(yùn)行_第3頁
OpenMP程序的編譯和運(yùn)行_第4頁
OpenMP程序的編譯和運(yùn)行_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 SHANGHAI UNIVERSITY學(xué) 院計(jì)算機(jī)工程與科學(xué)學(xué)院實(shí)驗(yàn)OpenMP程序的編譯和運(yùn)行姓名陳帥學(xué)號(hào)12122208教師劉芳芳時(shí)間2015.05.06報(bào)告成績實(shí)驗(yàn)2-1. OpenMP程序的編譯和運(yùn)行1. 實(shí)驗(yàn)?zāi)康?) 在Linux平臺(tái)上編譯和運(yùn)行OpenMP程序;2) 在Windows平臺(tái)上編譯和運(yùn)行OpenMP程序。3) 掌握OpenMP并行編程基礎(chǔ)。2. 實(shí)驗(yàn)環(huán)境1) 硬件環(huán)境:計(jì)算機(jī)一臺(tái);2) 軟件環(huán)境:Linux、Win2003、GCC、MPICH、VS2008或其他版本Visual Studio;3. 實(shí)驗(yàn)內(nèi)容1. Linux下OpenMP程序的編譯和運(yùn)行。OpenMP是

2、一個(gè)共享存儲(chǔ)并行系統(tǒng)上的應(yīng)用編程接口,支持C/C+和FORTRAN等語言,編譯和運(yùn)行簡單的Hello World程序。在Linux下編輯hellomp.c源程序,或在Windows下編輯并通過附件中的FTP工具(端口號(hào):1021)上傳,用gcc -fopenmp -O2 -o hellomp.out hellomp.c命令編譯,用./hellomp.out命令運(yùn)行程序。注:在虛擬機(jī)中當(dāng)使用vi編輯文件時(shí),不是以ESC鍵退出插入模式,可以使用“Ctrl+c”進(jìn)入命令模式,然后輸入wq進(jìn)行存盤退出。代碼如下:#include #include int main()int nthreads,tid;

3、omp_set_num_threads(8);#pragma omp parallel private(nthreads,tid)tid=omp_get_thread_num();printf(Hello World from OMP thread %dn,tid);if(tid=0)nthreads=omp_get_num_threads();printf(Number of threads is %dn,nthreads);安裝gcc檢查GCC是否安裝完成 編寫hellomp.c編譯運(yùn)行2.控制并行執(zhí)行的線程數(shù)。根據(jù)算法的要求和硬件情況,例如CPU數(shù)量或者核數(shù),選擇適合的線程數(shù)可以加速程序

4、的運(yùn)行。請(qǐng)按照下列的方法進(jìn)行線程數(shù)量的設(shè)置。/設(shè)置線程數(shù)為10xuycsv168 openmp$ OMP_NUM_THREADS=10/將線程數(shù)添加為環(huán)境變量xuycsv168 openmp$ export OMP_NUM_THREADS/運(yùn)行修改hellomp.c程序,刪除omp_set_num_threads(8);語句如果不定義OMP_NUM_THREADS,默認(rèn)會(huì)等于CPU數(shù)量,在8核心的機(jī)器上,會(huì)打印出8行Hello World.omp_set_num_threads(8); 設(shè)置了子線程數(shù)為8,即是可以有8個(gè)子線程并行運(yùn)行。#pragma omp parallel private(

5、nthreads,tid) 為編譯制導(dǎo)語句,每個(gè)線程都自己的nthreads和tid兩個(gè)私有變量,線程對(duì)私有變量的修改不影響其它線程中的該變量。程序的功能是對(duì)于每個(gè)線程都打印出它的id號(hào),對(duì)于id號(hào)為0的線程打印出線程數(shù)目。2. Windows下OpenMP程序的編譯和運(yùn)行。用VS2013編輯上述的hellomp.c源程序,注意在菜單“項(xiàng)目-屬性-C/C+-語言”選中“OpenMP支持”,編譯并運(yùn)行程序。打開或者新建一個(gè)c+項(xiàng)目,依次選擇Project-屬性-配置屬性(configuration property)-c/c+-語言(Language),打開OpenMP支持;設(shè)置環(huán)境變量OMP_

6、NUM_THREADS。設(shè)置環(huán)境變量:我的電腦-屬性-高級(jí)-環(huán)境變量,新建一個(gè)OMP_NUM_THREADS變量,值設(shè)為2,即為程序執(zhí)行的線程數(shù)。圖3 VS2013使用界面使用VS2013進(jìn)行并行程序設(shè)計(jì),圖3為VS2013使用界面,圖4為運(yùn)行結(jié)果截圖。圖4 程序運(yùn)行結(jié)果截圖雖然線程都是一起開始運(yùn)行,但實(shí)驗(yàn)中每次運(yùn)行的結(jié)果都不一樣,這個(gè)是因?yàn)槊看蚊總€(gè)線程結(jié)束的先后可能不一樣的。所以每次運(yùn)行的結(jié)果都是隨機(jī)的。這是串行程序和并行程序不同的地方:串行程序可以重新運(yùn)行,結(jié)果和之前一樣;并行程序卻因?yàn)閳?zhí)行次序無法控制可能導(dǎo)致每次的結(jié)果都不一樣。實(shí)驗(yàn)2-2 矩陣乘法的OpenMP實(shí)現(xiàn)及性能分析1. 實(shí)驗(yàn)?zāi)?/p>

7、的1) 用OpenMP實(shí)現(xiàn)最基本的數(shù)值算法“矩陣乘法”2) 掌握for編譯制導(dǎo)語句3) 對(duì)并行程序進(jìn)行簡單的性能調(diào)優(yōu)2. 實(shí)驗(yàn)內(nèi)容1) 運(yùn)行并測(cè)試OpenMP編寫兩個(gè)n階的方陣a和b的相乘程序,結(jié)果存放在方陣c中,其中乘法用for編譯制導(dǎo)語句實(shí)現(xiàn)并行化操作,并調(diào)節(jié)for編譯制導(dǎo)中schedule的參數(shù),使得執(zhí)行時(shí)間最短。要求在window環(huán)境(不用虛擬機(jī)),在linux環(huán)境(用和不用虛擬機(jī)情況下)測(cè)試程序的性能,并寫出詳細(xì)的分析報(bào)告。源代碼如下:#include#include#includevoid comput(float* A,float* B,float* C)/兩個(gè)矩陣相乘傳統(tǒng)方法

8、int x,y; for(y=0;y4;y+) for(x=0;x4;x+) C4*y+x = A4*y+0*B4*0+x + A4*y+1*B4*1+x + A4*y+2*B4*2+x + A4*y+3*B4*3+x; int main() double duration; clock_t s,f; int x=0; int y=0; int n=0; int k=0; float A=1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16; float B=0.1f,0.2f,0.3f,0.4f, 0.5f,0.6f,0.7f,0.8f, 0.9f,0.10f,

9、0.11f,0.12f, 0.13f,0.14f,0.15f,0.16f; float C16; s= clock(); /#pragma omp parallel if(false) for(n=0;n1000000;n+) comput(A,B,C); f=clock(); duration = (double)(f - s)/CLOCKS_PER_SEC; printf(s-1,000,000 :%fn,duration); for(y=0;y4;y+) for(x=0;x4;x+) printf(%f,Cy*4+x); printf(n); printf(n=n); s = clock

10、(); /parallel 2 #pragma omp parallel for for(n=0;n2;n+)/CPU是核線程的 for(k=0;k1000000;k+)/每個(gè)線程管個(gè)循環(huán) comput(A,B,C); f = clock(); duration = (double)(f - s)/CLOCKS_PER_SEC; printf(p2- 1,000,000:%fn,duration); /parallel 3 s = clock(); #pragma omp parallel for for(n=0;n4;n+) /CPU是核線程的 for(k=0;k1000000;k+)/每個(gè)

11、線程管個(gè)循環(huán) comput(A,B,C); f = clock(); duration = (double)(f - s)/CLOCKS_PER_SEC; printf(p3- 1,000,000:%fn,duration); /parallel 1 s = clock(); #pragma omp parallel for for(n=0;n1000000;n+) comput(A,B,C); f = clock(); duration = (double)(f - s)/CLOCKS_PER_SEC; printf(p1- 1,000,000 :%fn,duration); for(y=0

12、;y4;y+) for(x=0;x4;x+) printf(%f,Cy*4+x); printf(n); return 0;程序運(yùn)行結(jié)果:分析報(bào)告:由運(yùn)行結(jié)果可以看出串行運(yùn)算1000000次s-1的時(shí)間是0.030000,并行運(yùn)算1000000次p-1的時(shí)間是0.040000,并行的時(shí)間比串行還要久一點(diǎn),原因在于對(duì)計(jì)算機(jī)來說計(jì)算1000000萬次的此矩陣計(jì)算是非常easy的事情,計(jì)算量很小,在這種情況下OMP多線程計(jì)算時(shí),線程的創(chuàng)建和銷毀的開銷會(huì)變成主要的消耗時(shí)間。p-2是2線程運(yùn)算,p-3是4線程運(yùn)算,所以在同樣運(yùn)算1000000次的情況下,p-2的時(shí)間要比p-3的時(shí)間多出來0.010000

13、秒。2)請(qǐng)自己找一個(gè)需要大量計(jì)算但是程序不是很長的程序,實(shí)現(xiàn)OMP的多線程并行計(jì)算,要求寫出并行算法,并分析并行的效果(注:必須核對(duì)串行和并行的計(jì)算結(jié)果,保證正確性)#include#include#includeusing namespace std;void qh (int i) float sum = 0; int j; for (int j = 1; j = i; j+) sum += sqrt(j);void qh1(int i)/計(jì)算1到i平方根的和 float sum = 0; int j; for (int j = 1; j = i; j+) sum += sqrt(j); c

14、out sum= sumendl;int main() int i = 10; clock_t s, f; s = clock(); double duration; int x = 0; int y = 0; int n = 0; int k = 0; /#pragma omp parallel if(false) for (n = 0; n1000000; n+) qh(i); qh1(i); f = clock(); duration = (double)(f - s) / CLOCKS_PER_SEC; printf(s-1,000,000 :%fn, duration); print

15、f(n=n); s = clock(); /parallel 2 #pragma omp parallel for for (n = 0; n2; n+)/CPU是核線程的 for (k = 0; k500000; k+)/每個(gè)線程管個(gè)循環(huán) qh(i); qh1(i); f = clock(); duration = (double)(f - s) / CLOCKS_PER_SEC; printf(p2-500,000:%fn, duration); /parallel 3 s = clock(); #pragma omp parallel for for (n = 0; n4; n+) /C

16、PU是核線程的 for (k = 0; k250000; k+)/每個(gè)線程管個(gè)循環(huán) qh(i); qh1(i); f = clock(); duration = (double)(f - s) / CLOCKS_PER_SEC; printf(p3- 250,000:%fn, duration);/parallel 4 s = clock();#pragma omp parallel for for (n = 0; n4; n+) /CPU是核線程的 for (k = 0; k500000; k+)/每個(gè)線程管個(gè)循環(huán) qh(i); qh1(i); f = clock(); duration =

17、 (double)(f - s) / CLOCKS_PER_SEC; printf(p4- 500,000:%fn, duration); /parallel 1 s = clock(); #pragma omp parallel for for (n = 0; n1000000; n+) qh(i); qh1(i); f = clock(); duration = (double)(f - s) / CLOCKS_PER_SEC; printf(p1- 1,000,000 :%fn, duration); system(pause); return 0;運(yùn)行結(jié)果:結(jié)果分析:程序計(jì)算的是1到10 的平方根的和,由運(yùn)行結(jié)果可以看出,串行運(yùn)算s-1的時(shí)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論