并行處理實(shí)驗(yàn)1_第1頁(yè)
并行處理實(shí)驗(yàn)1_第2頁(yè)
并行處理實(shí)驗(yàn)1_第3頁(yè)
并行處理實(shí)驗(yàn)1_第4頁(yè)
并行處理實(shí)驗(yàn)1_第5頁(yè)
已閱讀5頁(yè),還剩13頁(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、Parallel Programming Principle and PracticeLab GuideSchool of Computer Science and TechnologyHuazhong University of Science and Technology2 Labso 如何將向量加法運(yùn)算并行化?基本的向量加法程序:for(int i = 0; i n; +i)Ai = Bi + Ci;o 使用最簡(jiǎn)單的任務(wù)劃分方法:每個(gè)線程(進(jìn)程)完成循環(huán)體中一次循環(huán)的工作,共有n個(gè)線程同時(shí)計(jì)算。3 Labso 使用pThread完成這項(xiàng)工作基本的API: 創(chuàng)建一個(gè)新的線程 int pth

2、read_create( pthread_t *thread, const pthread_attr_t *attr, void *(*func) (void *), void *arg);thread表示線程ID,與線程中的pid概念類似attr表示設(shè)定線程的屬性,可以暫時(shí)不用考慮func表示新創(chuàng)建的線程會(huì)從這個(gè)函數(shù)指針處開(kāi)始運(yùn)行arg表示這個(gè)函數(shù)的參數(shù)指針?lè)祷刂禐?代表成功,其他值為錯(cuò)誤編號(hào)4 Labs主進(jìn)程等待線程結(jié)束: int pthread_join( pthread_t thread, void *retval );thread表示線程ID,與線程中的pid概念類似retval用于

3、存儲(chǔ)等待線程的返回值頭文件加入pthread.h編譯命令加入 lpthread 庫(kù)5 Labs#include #define THREAD_NUM 8int div;pthread_t tidN;int AN, BN,CN;/創(chuàng)建線程函數(shù)void *func(void *arg)for(int i = *(int *)arg; i i + div & i N; +i) Ci = Ai + Bi;int main(int argc, int *argv)div = N/THREAD_NUM;if(N/THREAD_NUM) div+;for(int i = 0; i N; i += d

4、iv) /創(chuàng)建THREAD_NUM個(gè)線程 if ( pthread_create( &tidi, NULL, func, (void *)&i ) ) puts(Pthread create fail); return; for(int i = 0; i N; i+=div) pthread_join(tidi, NULL);6 Labso 使用OpenMP完成這項(xiàng)工作:不需要使用MPI,使用特殊的編譯引導(dǎo)語(yǔ)句,源程序修改成如下形式:#pragma omp parallel forfor(int i = 0; i n; +i) Ai = Bi + Ci;Openmp會(huì)自動(dòng)將fo

5、r循環(huán)分解為多個(gè)線程并行執(zhí)行頭文件加入omp.h編譯時(shí)加入 openmp 參數(shù)7 Labso 使用MPI完成這個(gè)工作o基本的API: int MPI_Init(int *argc, char *argv)MPI_Init 是MPI程序的第一個(gè)調(diào)用,它完成MPI程序的所有初始化工作,啟動(dòng)MPI環(huán)境,標(biāo)志并行代碼的開(kāi)始。 int MPI_Finalize(void) MPI_Finalize 是MPI程序的最后一個(gè)調(diào)用,它結(jié)束MPI程序的運(yùn)行,標(biāo)志并行代碼的結(jié)束,結(jié)束除主進(jìn)程外其它進(jìn)程。其之后串行代碼仍可在主進(jìn)程(rank = 0)上繼續(xù)運(yùn)行。8 Labs int MPI_Comm_size(MP

6、I_Comm comm, int *size);獲取進(jìn)程個(gè)數(shù)p。 int MPI_Comm_rank(MPI_Comm comm, int *rank); MPI獲取當(dāng)前進(jìn)程的RANK,rank值取址范圍是0p-1,RANK值唯一的表示了進(jìn)程的ID,其中Rank=0的為主進(jìn)程9 Labs o進(jìn)程間的相互通信int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);發(fā)送函數(shù):當(dāng)前進(jìn)程將以buf為初始地址,長(zhǎng)度為count且元素類型為datatype的信息發(fā)動(dòng)給rank值為

7、dest的進(jìn)程,這條消息的標(biāo)識(shí)符為tag。其中datatype有MPI_INT, MPI_FLOAT等常用類型Tag的作用是用于區(qū)分一對(duì)進(jìn)程之間發(fā)送的不同信息int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status);接受函數(shù):從rank值為source的進(jìn)程接受標(biāo)識(shí)符為tag的信息,存入以buf為初始地址,長(zhǎng)度為count的存儲(chǔ)區(qū)域中,類型為datatype.10 Labso 頭文件加入o 編譯:mpicc o bin cod

8、e.co 運(yùn)行:mpirun np x bin /其中x為設(shè)置的進(jìn)程數(shù)11 Labsint AN,BN,CN;int nProcNums, nTaskID, nProcNums;int main(int argc , int *argv)MPI_Status status;MPI_Init(&argc,&argv);/初始化/獲取任務(wù)IDMPI_Comm_rank(MPI_COMM_WORLD,&nTaskID);/獲取線程數(shù)MPI_Comm_size(MPI_COMM_WORLD,&nProcNums);Init();line = N/ nProcNums;i

9、f (nTaskID = 0) /主進(jìn)程for (int i = 1; i nProcNums; +i) MPI_Send(B+ (i - 1) * line, line, MPI_FLOAT, i, 0, MPI_COMM_WORLD);for (int i = 1; i nProcNums; +i) MPI_Send(A + (i - 1) * line , line , MPI_FLOAT, i, 1, MPI_COMM_WORLD);for (int i = 1; i nProcNums; +i) MPI_Recv(C, line * NN, MPI_FLOAT, i, 3, MPI_

10、COMM_WORLD, &status); for (int i = (nProcNums - 1) * line; i MM; +i) Ci = Ai+Bi;elseMPI_Recv(B, line, MPI_FLOAT, 0, 0, MPI_COMM_WORLD, &status);MPI_Recv(A line , MPI_FLOAT, 0, 1, MPI_COMM_WORLD, &status);for(int i = 0; i line; +i) Ci=Ai+Bi;MPI_Send(C, line , MPI_FLOAT, 0, 3, MPI_COMM_WOR

11、LD);MPI_Finalize();return 0;MPI_Finalize();return 0;12 Labso 使用Cuda:GPU協(xié)處理器的運(yùn)算流程:13 LabsoCUDA在執(zhí)行的時(shí)候是讓host里面的一個(gè)一個(gè)的kernel按照線程網(wǎng)格(Grid)的概念在顯卡硬件(GPU)上執(zhí)行。o每一個(gè)線程網(wǎng)格又可以包含多個(gè)線程塊(block),每一個(gè)線程塊中又可以包含多個(gè)線程(thread)。o將任務(wù)合理的分配到grid和thread中,有助于提升程序的性能14 Labso基本API: cudaError_t cudaMalloc (void *devPtr, size_t size );

12、在設(shè)備端分配size大小的空間,起始地址為devPtr cudaError_t cudaMemcpy (void * dst, const void * src,size_t count,enum cudaMemcpyKind kind); 將以src為地址長(zhǎng)度為count的數(shù)據(jù)賦值到dst為起始地址的內(nèi) 存區(qū)域中,常用的kind有cudaMemcpyHostToDevice, cudaMemcpyDeviceToHost15 Labso基本API: cudaError_t cudaFree (void *devPtr); 在設(shè)備端清理以devPtr為起始地址的內(nèi)存空間16 Labso MapReduce實(shí)現(xiàn)PageRankApache官方的配置、實(shí)現(xiàn)和運(yùn)行教程/docs/r1.0.4/cn/mapred_tutorial.html17 Labso實(shí)驗(yàn)室集群使用方法:o使用ssh登錄: 1. 先登陸到外網(wǎng)代理節(jié)點(diǎn):輸入ssh jumptohpcc06,密碼為hustcloudhpcc。 2. 登錄到跳板機(jī)之后,什么都別做,直接登錄到集群管理節(jié)點(diǎn):輸入ssh pppuser23072 密碼為cgclhpcc2015。 3. 登錄到計(jì)算節(jié)點(diǎn),例如登錄到計(jì)算節(jié)點(diǎn)node230,

溫馨提示

  • 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)論