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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 SHANGHAI UNIVERSITY學 院計算機工程與科學學院實驗OpenMP程序的編譯和運行姓名陳帥學號12122208教師劉芳芳時間2015.05.06報告成績實驗2-1. OpenMP程序的編譯和運行1. 實驗目的1) 在Linux平臺上編譯和運行OpenMP程序;2) 在Windows平臺上編譯和運行OpenMP程序。3) 掌握OpenMP并行編程基礎。2. 實驗環(huán)境1) 硬件環(huán)境:計算機一臺;2) 軟件環(huán)境:Linux、Win2003、GCC、MPICH、VS2008或其他版本Visual Studio;3. 實驗內容1. Linux下OpenMP程序的編譯和運行。OpenMP是

2、一個共享存儲并行系統(tǒng)上的應用編程接口,支持C/C+和FORTRAN等語言,編譯和運行簡單的"Hello World"程序。在Linux下編輯hellomp.c源程序,或在Windows下編輯并通過附件中的FTP工具(端口號:1021)上傳,用"gcc -fopenmp -O2 -o hellomp.out hellomp.c"命令編譯,用"./hellomp.out"命令運行程序。注:在虛擬機中當使用vi編輯文件時,不是以ESC鍵退出插入模式,可以使用“Ctrl+c”進入命令模式,然后輸入wq進行存盤退出。代碼如下:#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是否安裝完成 編寫hellomp.c編譯運行2.控制并行執(zhí)行的線程數(shù)。根據(jù)算法的要求和硬件情況,例如CPU數(shù)量或者核數(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,默認會等于CPU數(shù)量,在8核心的機器上,會打印出8行&q

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

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

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

8、行程序進行簡單的性能調優(yōu)2. 實驗內容1) 運行并測試OpenMP編寫兩個n階的方陣a和b的相乘程序,結果存放在方陣c中,其中乘法用for編譯制導語句實現(xiàn)并行化操作,并調節(jié)for編譯制導中schedule的參數(shù),使得執(zhí)行時間最短。要求在window環(huán)境(不用虛擬機),在linux環(huán)境(用和不用虛擬機情況下)測試程序的性能,并寫出詳細的分析報告。源代碼如下:#include<stdio.h>#include<omp.h>#include<time.h>void comput(float* A,float* B,float* C)/兩個矩陣相乘傳統(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+)/每個線程管個循環(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+)/每個線程管個循環(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;程序運行結果:分析報告:由運行結果可以看出串行運算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的多線程并行計算,要求寫出并行算法,并分析并行的效果(注:必須核對串行和并行的計算結果,保證正確性)#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)/計算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+)/每個線程管個循環(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+)/每個線程管個循環(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_SE

溫馨提示

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

評論

0/150

提交評論