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

下載本文檔

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

文檔簡介

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

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

3、gt;#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",nthreads);安裝gcc檢

4、查GCC是否安裝完成 編寫hellomp.c編譯運行2.控制并行執(zhí)行的線程數(shù)。根據(jù)算法的要求和硬件情況,例如CPU數(shù)量或者核數(shù),選擇適合的線程數(shù)可以加速程序的運行。請按照下列的方法進(jìn)行線程數(shù)量的設(shè)置。/設(shè)置線程數(shù)為10xuycsv168 openmp$ OMP_NUM_THREADS=10/將線程數(shù)添加為環(huán)境變量xuycsv168 openmp$ export OMP_NUM_THREADS/運行修改hellomp.c程序,刪除omp_set_num_threads(8);語句如果不定義OMP_NUM_THREADS,默認(rèn)會等于CPU數(shù)量,在8核心的機器上,會打印出8行"Hello

5、World".omp_set_num_threads(8); 設(shè)置了子線程數(shù)為8,即是可以有8個子線程并行運行。#pragma omp parallel private(nthreads,tid) 為編譯制導(dǎo)語句,每個線程都自己的nthreads和tid兩個私有變量,線程對私有變量的修改不影響其它線程中的該變量。程序的功能是對于每個線程都打印出它的id號,對于id號為0的線程打印出線程數(shù)目。2. Windows下OpenMP程序的編譯和運行。用VS2013編輯上述的hellomp.c源程序,注意在菜單“項目->屬性->C/C+->語言”選中“OpenMP支持”,編譯

6、并運行程序。打開或者新建一個c+項目,依次選擇Project -> 屬性 -> 配置屬性(configuration property) -> c/c+ -> 語言(Language),打開OpenMP支持;設(shè)置環(huán)境變量OMP_NUM_THREADS。    設(shè)置環(huán)境變量:我的電腦 -> 屬性 -> 高級 -> 環(huán)境變量,新建一個OMP_NUM_THREADS變量,值設(shè)為2,

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

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

9、=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.10f,0.11f,

10、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,",Cy*4+x); pr

11、intf("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+)/每個線程管個循環(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()

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

13、 = 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;程序運行結(jié)果:分析報告:由運行結(jié)果可以看出串行運算1000000次s-1的時間是0.030000,并行運算1000000次p-1的時間是0.040000,并行的時間比串行還要久一點,原因在

14、于對計算機來說計算1000000萬次的此矩陣計算是非常easy的事情,計算量很小,在這種情況下OMP多線程計算時,線程的創(chuàng)建和銷毀的開銷會變成主要的消耗時間。p-2是2線程運算,p-3是4線程運算,所以在同樣運算1000000次的情況下,p-2的時間要比p-3的時間多出來0.010000秒。2)請自己找一個需要大量計算但是程序不是很長的程序,實現(xiàn)OMP的多線程并行計算,要求寫出并行算法,并分析并行的效果(注:必須核對串行和并行的計算結(jié)果,保證正確性)#include<iostream>#include<cmath>#include<time.h>using

15、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)/計算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 = clock(); d

16、ouble 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 2 #pragma

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

18、 0; k<250000; k+)/每個線程管個循環(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+)/每個線程管個循環(huán) qh(i); qh1(i); f = clock(); duration = (double)(f - s) / CLOCKS_PER_SEC

溫馨提示

  • 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

提交評論