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

下載本文檔

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

文檔簡(jiǎn)介

1、 SHANGHAI UNIVERSITY學(xué) 院計(jì)算機(jī)工程與科學(xué)學(xué)院實(shí)驗(yàn)OpenMP程序的編譯和運(yùn)行姓名陳帥學(xué)號(hào)12122208教師劉芳芳時(shí)間2015.05.06報(bào)告成績(jī)實(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ǔ)言,編譯和運(yùn)行簡(jiǎn)單的"Hello World"程序。在Linux下編輯hellomp.c源程序,或在Windows下編輯并通過(guò)附件中的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)行存盤(pán)退出。代碼如下:#include

3、<omp.h>#include <stdio.h>int main()int nthreads,tid;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",nthrea

4、ds);安裝gcc檢查GCC是否安裝完成 編寫(xiě)hellomp.c編譯運(yùn)行2.控制并行執(zhí)行的線程數(shù)。根據(jù)算法的要求和硬件情況,例如CPU數(shù)量或者核數(shù),選擇適合的線程數(shù)可以加速程序的運(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);語(yǔ)句如果不定義OMP_NUM_THREADS,默認(rèn)會(huì)等于CPU數(shù)量,在8核心的機(jī)器上,會(huì)打印出8行&q

5、uot;Hello World".omp_set_num_threads(8); 設(shè)置了子線程數(shù)為8,即是可以有8個(gè)子線程并行運(yùn)行。#pragma omp parallel private(nthreads,tid) 為編譯制導(dǎo)語(yǔ)句,每個(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+->語(yǔ)言”選中“Op

6、enMP支持”,編譯并運(yùn)行程序。打開(kāi)或者新建一個(gè)c+項(xiàng)目,依次選擇Project -> 屬性 -> 配置屬性(configuration property) -> c/c+ -> 語(yǔ)言(Language),打開(kāi)OpenMP支持;設(shè)置環(huán)境變量OMP_NUM_THREADS。    設(shè)置環(huán)境變量:我的電腦 -> 屬性 -> 高級(jí) -> 環(huán)境變量,新建一個(gè)OMP_NUM_THREA

7、DS變量,值設(shè)為2,即為程序執(zhí)行的線程數(shù)。 圖3 VS2013使用界面使用VS2013進(jìn)行并行程序設(shè)計(jì),圖3為VS2013使用界面,圖4為運(yùn)行結(jié)果截圖。圖4 程序運(yùn)行結(jié)果截圖雖然線程都是一起開(kāi)始運(yùn)行,但實(shí)驗(yàn)中每次運(yùn)行的結(jié)果都不一樣,這個(gè)是因?yàn)槊看蚊總€(gè)線程結(jié)束的先后可能不一樣的。所以每次運(yùn)行的結(jié)果都是隨機(jī)的。這是串行程序和并行程序不同的地方:串行程序可以重新運(yùn)行,結(jié)果和之前一樣;并行程序卻因?yàn)閳?zhí)行次序無(wú)法控制可能導(dǎo)致每次的結(jié)果都不一樣。實(shí)驗(yàn)2-2 矩陣乘法的OpenMP實(shí)現(xiàn)及性能分析1. 實(shí)驗(yàn)?zāi)康?) 用OpenMP實(shí)現(xiàn)最基本的數(shù)值算法“矩陣乘法”2) 掌握f(shuō)or編譯制導(dǎo)語(yǔ)句3) 對(duì)并

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

9、x,y; for(y=0;y<4;y+) for(x=0;x<4;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.

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

11、y*4+x); printf("n"); printf("n=n"); s = clock(); /parallel 2 #pragma omp parallel for for(n=0;n<2;n+)/CPU是核線程的 for(k=0;k<1000000;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

12、 = clock(); #pragma omp parallel for for(n=0;n<4;n+) /CPU是核線程的 for(k=0;k<1000000;k+)/每個(gè)線程管個(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;n<1000000;n+) comput

13、(A,B,C); f = clock(); duration = (double)(f - s)/CLOCKS_PER_SEC; printf("p1- 1,000,000 :%fn",duration); for(y=0;y<4;y+) for(x=0;x<4;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í)間比串

14、行還要久一點(diǎn),原因在于對(duì)計(jì)算機(jī)來(lái)說(shuō)計(jì)算1000000萬(wàn)次的此矩陣計(jì)算是非常easy的事情,計(jì)算量很小,在這種情況下OMP多線程計(jì)算時(shí),線程的創(chuàng)建和銷毀的開(kāi)銷會(huì)變成主要的消耗時(shí)間。p-2是2線程運(yùn)算,p-3是4線程運(yùn)算,所以在同樣運(yùn)算1000000次的情況下,p-2的時(shí)間要比p-3的時(shí)間多出來(lái)0.010000秒。2)請(qǐng)自己找一個(gè)需要大量計(jì)算但是程序不是很長(zhǎng)的程序,實(shí)現(xiàn)OMP的多線程并行計(jì)算,要求寫(xiě)出并行算法,并分析并行的效果(注:必須核對(duì)串行和并行的計(jì)算結(jié)果,保證正確性)#include<iostream>#include<cmath>#include<time.h

15、>using 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=" << sum<<endl;int main() int i = 10; clock_t s, f; s =

16、clock(); double duration; int x = 0; int y = 0; int n = 0; int k = 0; /#pragma omp parallel if(false) for (n = 0; n<1000000; 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

17、 2 #pragma omp parallel for for (n = 0; n<2; n+)/CPU是核線程的 for (k = 0; k<500000; 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; n<4; n+) /CPU是核線程

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論