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),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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

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

3、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ù)可以加速程序的運(yùn)行。請按照下

4、列的方法進(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)會等于CPU數(shù)量,在8核心的機(jī)器上,會打印出8行Hello World.omp_set_num_threads(8); 設(shè)置了子線程數(shù)為8,即是可以有8個子線程并行運(yùn)行。#pragma omp parallel private(nthreads

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

6、ADS。設(shè)置環(huán)境變量:我的電腦-屬性-高級-環(huán)境變量,新建一個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é)果都不一樣,這個是因?yàn)槊看蚊總€線程結(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)康?) 用Ope

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

8、 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,0.11f,0.

9、12f, 0.13f,0.14f,0.15f,0.16f; float C16; s= clock(); /#pragma omp parallel if(false) for(n=0;n;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(); /parallel 2

10、 #pragma omp parallel for for(n=0;n2;n+)/CPU是核線程的 for(k=0;k;k+)/每個線程管個循環(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;k;k+)/每個線程管個循環(huán) comput(A,B,C); f = clo

11、ck(); 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;n;n+) comput(A,B,C); f = clock(); duration = (double)(f - s)/CLOCKS_PER_SEC; printf(p1- 1,000,000 :%fn,duration); for(y=0;y4;y+) for(x=0;x4;x+) printf(%f,Cy*

12、4+x); printf(n); return 0;程序運(yùn)行結(jié)果:分析報告:由運(yùn)行結(jié)果可以看出串行運(yùn)算次s-1的時間是0.,并行運(yùn)算次p-1的時間是0.,并行的時間比串行還要久一點(diǎn),原因在于對計(jì)算機(jī)來說計(jì)算萬次的此矩陣計(jì)算是非常easy的事情,計(jì)算量很小,在這種情況下OMP多線程計(jì)算時,線程的創(chuàng)建和銷毀的開銷會變成主要的消耗時間。p-2是2線程運(yùn)算,p-3是4線程運(yùn)算,所以在同樣運(yùn)算次的情況下,p-2的時間要比p-3的時間多出來0.秒。2)請自己找一個需要大量計(jì)算但是程序不是很長的程序,實(shí)現(xiàn)OMP的多線程并行計(jì)算,要求寫出并行算法,并分析并行的效果(注:必須核對串行和并行的計(jì)算結(jié)果,保證正確性

13、)#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); cout sum= sumendl;int main() int i = 10; clock_t s, f; s = clock(); double duration

14、; int x = 0; int y = 0; int n = 0; int k = 0; /#pragma omp parallel if(false) for (n = 0; n; n+) qh(i); qh1(i); f = clock(); duration = (double)(f - s) / CLOCKS_PER_SEC; printf(s-1,000,000 :%fn, duration); printf(n=n); s = clock(); /parallel 2 #pragma omp parallel for for (n = 0; n2; n+)/CPU是核線程的 fo

15、r (k = 0; k; k+)/每個線程管個循環(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+) /CPU是核線程的 for (k = 0; k; k+)/每個線程管個循環(huán) qh(i); qh1(i); f = clock(); duration = (double)(f - s) / CL

16、OCKS_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; k; k+)/每個線程管個循環(huán) qh(i); qh1(i); f = clock(); duration = (double)(f - s) / CLOCKS_PER_SEC; printf(p4- 500,000:%fn, duration); /parallel 1 s = clock(); #pragma omp parallel for for (n = 0; n; 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)

溫馨提示

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

評論

0/150

提交評論