版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 中科院數(shù)學(xué)與系統(tǒng)科學(xué)研究院 “并行計(jì)算” 課程講義 (草稿)” 張林波 計(jì)算數(shù)學(xué)與科學(xué)工程計(jì)算研究所 科學(xué)與工程計(jì)算國家重點(diǎn)實(shí)驗(yàn)室 2003 年1月 29目 錄第一部分 MPI消息傳遞編程第一章 預(yù)備知識(shí) 1.1 高性能并行計(jì)算機(jī)系統(tǒng)簡介 1.1.1 微處理器的存儲(chǔ)結(jié)構(gòu) 1.1.2 Cache 結(jié)構(gòu)對(duì)程序性能的影響 1.1.3 共享內(nèi)存 SMP 型并行計(jì)算機(jī) 1.1.4 分布式內(nèi)存 MP P 型并行計(jì)算機(jī) 1.1.5 DSM 型并行計(jì)算機(jī) 1.1.6 SMP/D SM 機(jī)群 1.1.7 微機(jī)1.4.作站機(jī)群 1.1.8 TOP500 1.2 并行編程模式 1.2.1 自動(dòng)并行與手1.4.并行
2、 1.2.2 0penMP 1.2.3 DSM 編程模式 1.2.4 高性能 Fortran: HPF 1.2.5 消息傳遞并行編程模式 l.3 Unix 程序開發(fā)簡介 l.3.1 Unix中常用的編譯系統(tǒng) 1.3.2 實(shí)用1.4.具make 1.4 消息傳遞編程平臺(tái) MPI 1.4.1 MPI 程序的編譯與運(yùn)行 1.4.2 利用 MPICH 建立 MPI 程序開發(fā)與調(diào)試環(huán)境 第二章 MPI 基礎(chǔ)知識(shí) 2.1 下載 MPI標(biāo)準(zhǔn)的 PS 文檔 2.2 一些名詞與概念 2.3 編程模式 2.4 MPI 函數(shù)的一般形式 2.5 MPI 的原始數(shù)據(jù)類型 2.5.1 Fortran 77 原始數(shù)據(jù)類型
3、2.5.2 C 原始數(shù)據(jù)類型 2.6 MPI 的幾個(gè)基本函數(shù) 2.6.1 初始化 MPI 系統(tǒng) 2.6.2 檢測 MPI 系統(tǒng)是否已經(jīng)初始化 2.6.3 得到通信器的進(jìn)程數(shù)及進(jìn)程在通信器中的序號(hào) 2.6.4 退出 MPI 系統(tǒng) 2.6.5 異常終止 MPI 程序的執(zhí)行 2.6.6 查詢處理器名稱 2.6.7 蕕取墻上時(shí)間及時(shí)鐘精度 2.7 MPI 程序的基本結(jié)構(gòu) 2.7.1 Fortran 77 程序 2.7.2 C 程序第三章 點(diǎn)對(duì)點(diǎn)通信 3.1 標(biāo)準(zhǔn)阻塞型點(diǎn)對(duì)點(diǎn)通信函數(shù) 3.1.1 標(biāo)準(zhǔn)阻塞發(fā)送 3.1.2 阻塞接收 3.1.3 阻塞型消息傳遞實(shí)例 3.1.4 其它一些阻塞型消息傳遞函數(shù)
4、3.2 消息發(fā)送模式 3.2.1 阻塞型緩沖模式消息發(fā)送函數(shù) 3.3 阻塞型與非阻塞型函數(shù) 3.4 非阻塞型點(diǎn)對(duì)點(diǎn)通信函數(shù) 3.4.1 非阻塞發(fā)送 3.4.2 非阻塞接收 3.4.3 通信請(qǐng)求的完成與檢測 3.4.4 通信請(qǐng)求的釋放 3.5 消息探測與通信請(qǐng)求的取消 3.5.1 消息探測 3.5.2 通信請(qǐng)求的取消 3.6 點(diǎn)對(duì)點(diǎn)通信函數(shù)匯總 3.7 持久通信請(qǐng)求 3.7.1 創(chuàng)建持久消息發(fā)送請(qǐng)求 3.7.2 創(chuàng)建持久消息接收請(qǐng)求3.7.3 開始基于持久通信請(qǐng)求的通信 3.7.4 持久通信請(qǐng)求的完成與釋放第四章 數(shù)據(jù)類型 4.1 與數(shù)據(jù)類型有關(guān)的一些定義 4.1.1 數(shù)據(jù)類型定義 4.1.2
5、數(shù)據(jù)類型的大小 4.1.3 數(shù)據(jù)類型的下界、 上界與域 4.1.4 MPI_LB 和 MPI_UB 4.1.5 數(shù)據(jù)類型查詢函數(shù) 4.2 數(shù)據(jù)類型創(chuàng)建函數(shù) 4.2.1 MPI_Type_contiguous 4.2.2 MPI_Type_vector 4.2.3 MPI_Type_hvector 4.2.4 MPI_Type_indexed 4.2.5 MPI_Type_hindexed 4.2.6 MPI_Type_struct 4.2.7 地址函數(shù) MPI_Address 4.3 數(shù)據(jù)類型的使用 4.3.1 數(shù)據(jù)類型的提交 4.3.2 數(shù)據(jù)類型的釋放 4.3.3 MPI_Get_eleme
6、nts 4.4 數(shù)據(jù)的打包與拆包 4.4.1 數(shù)據(jù)打包 4.4.2 數(shù)據(jù)拆包 4.4.3 得到打包后的數(shù)據(jù)大小 4.5 MPI l.l 中位移與數(shù)據(jù)大小的限制第五章 聚含通信 (Collective Communications) 5.1 障礙同步 5.2 廣播 5.3 數(shù)據(jù)收集 5.3.1 收集相同長度數(shù)據(jù)塊 MPI_Gather 5.3.2 收集不同長度數(shù)據(jù)塊 MPI_Gatherv 5.3.3 全收集 MPI_Allgather 5.3.4 不同長度數(shù)據(jù)塊的全收集 MPI_Allgatherv5.4 數(shù)據(jù)散發(fā) 5.4.1 散發(fā)相同長度數(shù)據(jù)塊 MPI_Scatter 5.4.2 散發(fā)不同長
7、度數(shù)據(jù)塊 MPI_Scatterv 5.5 全部進(jìn)程對(duì)全部進(jìn)程的數(shù)據(jù)散發(fā)收集 5.5.1 相同數(shù)據(jù)長度的全收集散發(fā) MPI_Alltoall 5.5.2 不同數(shù)據(jù)長度的全收集散發(fā) MPI_Alltoallv 5.6 歸約 5.6.1 歸約函數(shù) MPI_Reduce 5.6.2 全歸約 MPI_Allreduce 5.6.3 歸約散發(fā) MPI_Reduce_scatter 5.6.4 前綴歸約 MPI_Scan 5.6.5 歸約與前綴歸約中用戶自定義的運(yùn)算 5.7 兩個(gè)程序?qū)嵗?5.7.1 值計(jì)算 5.7.2 Jacobi 迭代求解二維 Poisson 方程第六章 進(jìn)程組與通信器 6.1 基本概
8、念 6.1.1 進(jìn)程組 6.1.2 上下文 (Context) 6.1.3 域內(nèi)通信器 (Intracommunicator) 6.1.4 域間通信器 (Intercommunicator) 6.2 進(jìn)程組操作函數(shù) 6.2.1 查詢進(jìn)程組大小和進(jìn)程在組中的序號(hào) 6.2.2 兩個(gè)進(jìn)程組間進(jìn)程序號(hào)的映射 6.2.3 比較兩個(gè)進(jìn)程組 6.2.4 進(jìn)程組的創(chuàng)建與釋放 6.3 域內(nèi)通信器操作函數(shù) 6.3.1 比較兩個(gè)通信器 6.3.2 通信器的創(chuàng)建與釋放 6.4 通信器的附加屬性 (Caching) 6.5 域間通信器 (Intercommunicator) 6.6 進(jìn)程拓?fù)浣Y(jié)構(gòu) 6.6.1 迪卡爾拓?fù)?/p>
9、結(jié)構(gòu) 6.6.2 一般拓?fù)浣Y(jié)構(gòu) 6.6.3 底層支持函數(shù)第七章 文件輸入輸出 7.1 基本術(shù)語 7.2 基本文件操作 7.2.1 打開 MPI 文件 7.2.2 關(guān)閉 MPI 文件 7.2.3 刪除文件 7.2.4 設(shè)定文件長度 7.2.5 為文件預(yù)留空間 7.2.6 查詢文件長度 7.3 查詢文件參數(shù) 7.3.1 查詢打開文件的進(jìn)程組 7.3.2 查詢文件訪問模式 7.4 設(shè)定文件視窗 7.4.1 文件中的數(shù)據(jù)表示格式 7.4.2 可移植數(shù)據(jù)類型 7.4.3 查詢數(shù)據(jù)類型相應(yīng)于文件數(shù)據(jù)表示格式的域 7.5 文件讀寫操作 7.5.1 使用顯式位移的阻塞型文件讀寫 7.5.2 使用獨(dú)立文件指針的
10、阻塞型文件讀寫 7.5.3 使用共享文件指針的阻塞型文件讀寫 7.5.4 非阻塞型文件讀寫函數(shù) 7.5.5 分裂型文件讀寫函數(shù) 7.6 文件指針操作 7.6.1 獨(dú)立文件指針操作 7.6.2 共享文件指針操作 7.6.3 文件位移在文件中的絕對(duì)地址 7.7 不同進(jìn)程對(duì)同一文件讀寫操作的相容性 7.7.1 設(shè)定文件訪問的原子性 7.7.2 查詢 atomicity 的當(dāng)前值 7.7.3 文件讀寫與存儲(chǔ)設(shè)備間的同步 7.8 子數(shù)組數(shù)據(jù)類型創(chuàng)建函數(shù) 本講義僅供課程學(xué)員及其他感興趣者個(gè)人參考用,尚處于逐步修改完善的過程中,許多內(nèi)容代表的是作者的個(gè)人觀點(diǎn)。未經(jīng)作者同意,不得擅自散播、 印刷、 轉(zhuǎn)引講義中
11、的部分或全部內(nèi)容。 Vll 課程安排 高性能計(jì)算機(jī)簡介:高性能計(jì)算機(jī)的體系結(jié)構(gòu)特點(diǎn)及編程方式。 消息傳遞環(huán)境:MPI 編程:消息傳遞 MPI (Message Passing Interface)標(biāo)準(zhǔn)。 分布式并行算法設(shè)計(jì)技術(shù):分布式并行算法設(shè)計(jì)的基本原理與方法。 目的:學(xué)習(xí)分布式并行算法設(shè)計(jì),分布式并行程序編制,高性能并行計(jì)算機(jī)使用參考材料 孫家昶等,網(wǎng)絡(luò)并行計(jì)算與分布式編程環(huán)境,科學(xué)出版社,1996。 張寶琳等,數(shù)值并行計(jì)算原理與方法,國防1.4.業(yè)出版社,1999。 李曉梅等,可擴(kuò)展并行算法的設(shè)計(jì)與分析,國防1.4.業(yè)出版社,2000。 莫?jiǎng)t堯等, 消息傳遞并行編程環(huán)境 MPI,科學(xué)出版
12、社,2001。 /Parallel-programming/莫?jiǎng)t堯/ /Parallel-programming/唐志敏/ /pub/home/zlb/bxjs/bxjs.pdf 1第一部分MPI消息傳遞編程第一章 預(yù)備知識(shí)1.1 高性能并行計(jì)算機(jī)系統(tǒng)簡介1.1.1 微處理器的存儲(chǔ)結(jié)構(gòu)1.1.2 Cache 結(jié)構(gòu)對(duì)程序性能的影響例1.1矩陣乘法中不同循環(huán)順序?qū)Τ绦蛐阅艿挠绊?DO J=l,NDO I=l,NC(I,J) = 0.D0END DOEND DODO I=l,NDO J=l,NDO K=l,NC(I,J) = C (I,J) + A (I,K) * B (K ,J)ENDDOENDD
13、OENDDO矩陣乘法實(shí)例 1:【 matmul0.m4】矩陣乘法實(shí)例 2:【 matmul f】1.1.3 共享內(nèi)存SMP型并行計(jì)算機(jī) 對(duì)稱多處理器 (Symmetric Multl-Processors),或共享內(nèi)存處理器 (Shared Memory Processors)。 多個(gè)處理器通過系統(tǒng)總線或交叉開關(guān)共享一個(gè)或多個(gè)內(nèi)存模塊。 優(yōu)點(diǎn):使用簡單,維護(hù)方便。 缺點(diǎn):受系統(tǒng)總線帶寬限制,只能支持少量處理器 (一般十幾個(gè))。 并行編程方式:通常采用 OpenMP,也可使用消息傳遞 (MPI/PVM) 及 HPF。 代表機(jī)型 SGI Power Challeng,Sun El0000等。1.1
14、.4 分布式內(nèi)存MPP型并行計(jì)算機(jī) Massively Parallel Processors 的簡稱。 指由大量具有局部內(nèi)存的計(jì)算結(jié)點(diǎn)通過高速系統(tǒng)網(wǎng)絡(luò)聯(lián)接而構(gòu)成的并行處理系統(tǒng)。 MPP系統(tǒng)的系統(tǒng)網(wǎng)絡(luò)通常具有某種拓?fù)浣Y(jié)構(gòu) (如tree,mesh,torus,hypercube)。1.1.5 DSM型并行計(jì)算機(jī) 分布共享內(nèi)存:Distributed Shared Memory。 多個(gè)物理上具有獨(dú)立內(nèi)存的處理單元,通過高速網(wǎng)絡(luò)聯(lián)接在一起。 邏輯上作為共享內(nèi)存并行機(jī)使用。 也稱為NUMA 結(jié)構(gòu)(NonUniform Memory Access)。 不同處理單元間內(nèi)存的共享通過特殊的硬件軟件實(shí)現(xiàn)。 具
15、有比SMP型并行機(jī)更好的可擴(kuò)展性 (超過100 個(gè) CPU)。 代表機(jī)型:SGI Origin 2000/3000。1.1.6 SMP/DSM機(jī)群 將多臺(tái)SMP或DSM并行機(jī)通過互聯(lián)網(wǎng)絡(luò)連接而成。 目前國內(nèi)外最高性能的并行機(jī)大多是這種結(jié)構(gòu)。1.1.7 微機(jī)/1.4.作站機(jī)群 微機(jī)機(jī)群(PC cluster,又稱為Beowulf cluster),1.4.作站機(jī)群 (NOW,Network Of Workstations)。將聯(lián)網(wǎng)的多臺(tái)微機(jī)或工作站組織成一臺(tái)并行計(jì)算機(jī)。目前常用的網(wǎng)絡(luò)有以太網(wǎng) (l00Mbps),ATM (155/622Mbps),Myrinet (1.2Gbps,) 適合于構(gòu)造
16、中等規(guī)模的并行系統(tǒng) (多達(dá)數(shù)百個(gè)處理器)。 根據(jù)機(jī)群中所使用的機(jī)型可為同構(gòu)型和異構(gòu)型兩種。 根據(jù)機(jī)群的使用方式又可分為專用型和兼用型,前者指該機(jī)群專門用于并行計(jì)算。 微機(jī)工作站機(jī)群的優(yōu)點(diǎn)是價(jià)格便宜、配置靈活、但其規(guī)模及并行效率受網(wǎng)絡(luò)設(shè)備的制。配以適當(dāng)?shù)南到y(tǒng)管理工具及作業(yè)調(diào)度、性能監(jiān)控、并行程序調(diào)試開發(fā)環(huán)境、及外設(shè)等,微機(jī)工作站機(jī)群系統(tǒng)可以達(dá)到與商用MPP系統(tǒng)一樣的使用效果。1.1.8 TOP500TOP50O Super computer Sites:【】1.2 并行編程模式1.2.1 自動(dòng)并行與手工并行 在SMP及DSM并行機(jī)上編譯系統(tǒng)通常具有一定的對(duì)用戶程序(C/Fortran)進(jìn)行自動(dòng)并
17、行化的能力,但經(jīng)常需要人工干預(yù) (通過指導(dǎo)語句、命令行選項(xiàng)等)以達(dá)到理想的并行效率。并行主要針對(duì)循環(huán)進(jìn)行 (細(xì)粒度并行)。 在分布式內(nèi)存并行機(jī)上尚無通用高效的,自動(dòng)并行1.4.具,主要依靠人1.4.編寫并行程序。 并行算法的設(shè)計(jì)及并行程序的編制已成為目前制約大規(guī)模并行計(jì)算機(jī)應(yīng)用的主要障礙。 51.2.2 OpenMP 在串行程序的循環(huán)語句前插入特定的指導(dǎo)語句,告知編譯系統(tǒng)一些有助于對(duì)該循環(huán)進(jìn)行并行的信息以及/或是強(qiáng)制編譯系統(tǒng)按指定的方式將該循環(huán)并行化 主要限于SMP及DSM型的并行系統(tǒng),現(xiàn)在也已發(fā)展到一些MPP系統(tǒng) 通常結(jié)合編譯系統(tǒng)的自動(dòng)并行化功能使用 也有一些自動(dòng)并行化1.4.具,它們對(duì)程序
18、結(jié)構(gòu)及數(shù)據(jù)流進(jìn)行分析,然后自動(dòng)插入適當(dāng)?shù)?OpenMP語句 OpenMP的優(yōu)點(diǎn)是學(xué)習(xí)及使用相對(duì)簡單,很多情況下不需要對(duì)原有算法及程序做大的改動(dòng)。缺點(diǎn)是只適合一類特定的機(jī)型,并且程序的可擴(kuò)展性通常不如用消息傳遞方式編寫的并行程序 對(duì)一些具有強(qiáng)數(shù)據(jù)相關(guān)性的計(jì)算過程需要通過改變計(jì)算順序或修改算法甚至設(shè)計(jì)新的算法來實(shí)現(xiàn)并行計(jì)算 OpenMP程序?qū)嵗壕仃嚦耍骸緈atmul-omp.f】1.2.3 DSM編程模式 建立在某種內(nèi)存一致性協(xié)議之上,通過軟件或軟硬件結(jié)合的方式實(shí)現(xiàn)處理器間內(nèi)存的共享 通過要求DSM并行程序中對(duì)內(nèi)存的讀寫遵循一定的規(guī)則來減小維護(hù)內(nèi)存一致性的開銷 參看 /Parallel- pro
19、gramming/唐志敏/jiajia.ppt 軟件DSM系統(tǒng)實(shí)例:Jiajia:【 /chpc/chinese/field1.htm】1.2.4 高性能 Fotran:HPF 基于數(shù)據(jù)并行的編程語言,即用戶通過指導(dǎo)語句指示編譯系統(tǒng)將數(shù)據(jù)分布到各處理器上,編譯系統(tǒng)根據(jù)數(shù)據(jù)分布的情況生成并行程序 主要面向 Fotran 90/95 優(yōu)點(diǎn):編程相對(duì)簡單,串并行程序一致 適合于SMP/DSM/MPP/cluster系統(tǒng) 主要缺點(diǎn)是并行過程對(duì)用戶的透明度不高,程序的性能很大程度上依賴于所用的編譯系統(tǒng)及用戶對(duì)編譯系統(tǒng)的了解,需要針對(duì)不同的HPF編譯器做不同的優(yōu)化,影響了程序的可移植性 HPF程序?qū)嵗壕?/p>
20、陣乘:【 matmul-hpf.f】1.2.5 消息傳遞并行編程模式 并行程序由一組獨(dú)立運(yùn)行的進(jìn)程構(gòu)成,進(jìn)程間通過相互發(fā)送消息來實(shí)現(xiàn)數(shù)據(jù)交換 可以說消息傳遞并行編程是并行應(yīng)用程序開發(fā)的最底層編程方式之一 很多其它并行開發(fā)語言或1.4.具 ( 如一些HPF編譯器)將程序轉(zhuǎn)化成消息傳遞型并行程序來實(shí)現(xiàn)并行 常用的消息傳遞平臺(tái)有PVM(Parallel Virtual Machine)和MPI(Message Passing Interface) 程序通用性好,用PVM或MPI編寫的程序可以在任何并行計(jì)算機(jī)上運(yùn)行 能夠達(dá)到很高的并行效率,具有很好的可擴(kuò)展性 缺點(diǎn):程序的編制與調(diào)試比較困難,許多情況下
21、要對(duì)程序甚至算法做大的改動(dòng) 61.3 Unix 程序開發(fā)簡介1.3.l Unix 中常用的編譯系統(tǒng) 編譯器由前端和后端組成。通常用戶只需使用前端命令即可完成編譯、鏈接 C 編譯器 cc,gcc(GNU C) 等 Fortran 編譯器 f77,fc,g77(GNU Fortran),f90(Fortran 90)等 可用 man查看使用手冊(cè),如man cc,man f77等等 命令行形式: % cc options files options % f77 options files options 文件的類型由文件的擴(kuò)展名決定 。C 源代碼:C; 。Fortran 77 源代碼: .f; 。帶
22、預(yù)處理的 Fortran 源代碼: .F; 。Fortran 90 源代碼: .f90; 。C+源代碼: .C+,,C,.cpp,.cc ,.cxx; 。 匯編代碼: .s, .S; 。 目標(biāo)文件: .o; 。 庫文件: .a; 。 共享庫 :.so; 命令行選項(xiàng) 。 -C 只編譯,不鏈接,即只生成 O 文件。 。 -o a”“ma 指定輸出文件名,缺省為*.o, a.out 等。 。 -Ipath 指定 (增加) 包含文件 ( h) 的搜索目錄。 。 -Lpath 指定 (增加) 庫文件的搜索目錄。 。 -lname 與庫文件libname.a 鏈接。 。 優(yōu)化開關(guān) -O,-O1, -O2,
23、-O3,等等。 。 標(biāo)碼中包含源文件名、行號(hào)等信息(用于程序調(diào)試): -g 例如: o f77 -O2 -o prog file1.f file2.c file2.o file4.a o f77 -c file.f f77 -o out file.o o f77 -c prog -I/usr/local/mpi/include file.f f77 -o prog -L/usr/local/mpi/lib file.o -lmpi (等價(jià)于f77 -o prog file.o /usr/local/mpi/lib/libmpi.a)1.3.2 實(shí)用1.4.具 make 命今形式 make _f
24、 Makefile options target target . 其中 -f 選項(xiàng)給出定義規(guī)則的文件名 (簡稱 Makefile 文件),缺省使用當(dāng)前 錄下的 Makefile 或makefile 文件 .target 指明要求生成的目標(biāo) (在 Makefile 中定義),當(dāng)命令行中不給出 target時(shí)make 只生成 Makefile 中定義的笫一個(gè)目標(biāo) 比較有用也較通用的命令行選項(xiàng)有下面一些: -f 文件名 指定 Makefile 文件名 -n 只顯示將要執(zhí)行的命令而并不執(zhí)行它們 -p 顯示定義的全部規(guī)則及宏,用于對(duì) Makefile 的調(diào)試 通過 Makefile 文件定義一組文件之
25、間的依賴關(guān)系及處理命令,方便程序開發(fā)過程中的編譯與維護(hù)。 處理規(guī)則的建立以特定的文件擴(kuò)展名及文件修改時(shí)間為基礎(chǔ) 缺省支持常用的程序擴(kuò)展名 .C , .f, .F, .o, .a, .h,等等 用戶可以通過 .SUFFIXES: 目標(biāo)定義新的文件擴(kuò)展名 基本規(guī)則 目標(biāo): 依賴對(duì)象 處理命令 . . 例: prog: file1.f file2.f fil3.c file4.CC f77 -O2 -o prog file1.f file2.f fil3.c file4.CC 其含義為: 如果目標(biāo) (prog) 不存在,或者任何一個(gè)依賴對(duì)象 (file1.f file2.f fil3.c file4
26、.CC) 比目 標(biāo)新,則執(zhí)行指定的命令 宏定義 SRC=file1.f file2.f fil3.c prog: $(SRC) f77 -O2 -o prog $(SRC) 環(huán)境變量可以在 Makefile 中作為宏使用,如 $(HOME) 常用預(yù)定義的宏 。$: 代表 標(biāo)名 (上例中為 prog) 。$: 笫一個(gè)依賴對(duì)象名 (上例中為 file1.f) 。$: 全部依賴對(duì)象名(上例中為file1.f file2.f fil3.c) 。$?: 全部比 標(biāo)新的依賴對(duì)象名 。$*: 用在隱式規(guī)則中,代表不含擴(kuò)展名的依賴對(duì)象 隱式規(guī): prog: file1.o file2.o fil3.o f77
27、 -O2 -o prog $? .c.o: cc -O2 -c $*.c .f.o f77 -O2 -c $*.fMakefile 實(shí)例 Makefile.dummy1.4 消息傳遞編程平臺(tái) MPI 由全世界1.4.業(yè)、 科研和政府部門聯(lián)合建立的一個(gè)消息傳遞編程標(biāo)準(zhǔn),以便為并行應(yīng)用程序的設(shè)計(jì) 8 提供一個(gè)高效、 統(tǒng)一的編程環(huán)境 它是目前最為通用的并行編程方式,也是分布式并行系統(tǒng)的主 要編程環(huán)境。 MPI 標(biāo)準(zhǔn)中定義了一組函數(shù)接口用于進(jìn)程間的消息傳遞 這些函數(shù)的具體實(shí)現(xiàn)由各計(jì)算機(jī)廠商 或科研部門來完成。 除各廠商提供的 MPI 系統(tǒng)外,一些高校、 科研部門也在開發(fā)免費(fèi)的通用 MPI 系統(tǒng),其中最
28、著名 的有 o MPICH (/mpi/mpich) o LAM MPI (/lam) 它們均提供源代碼,并支持目前絕大部分的并行計(jì)算系統(tǒng) (包括微機(jī)和1.4.作站機(jī)群) 實(shí)際上許多 廠商提供的 MPI 系統(tǒng)是在 MPICH 的基礎(chǔ)亠優(yōu)化產(chǎn)生的 MPI 的笫一個(gè)標(biāo)準(zhǔn) MPIl.0 于1994 年推出目最新的標(biāo)準(zhǔn)為2.2.5 版,于 2003 年推出 大部分 MPI 系統(tǒng) 前只實(shí)現(xiàn)了MPI spercification 1.1版中規(guī)定的內(nèi)容1.4.1 MPI 程序的編譯與運(yùn)行 MPI 程序的編譯 %mpicc -O2 -o mpiprog mpisrc.c %mpif77 -O2 -o mpip
29、rog mpisrc1.f mpisrc2.o MPI 程序的運(yùn)行 % mpirun -np 4 mpiprog 如果要指定并行程序所運(yùn)行的并行節(jié)點(diǎn),則: % mpirun -np 4 -machinefile hosts mpiprogMPI 程序?qū)嵗?/usr/local/lib/mpiintel/examples/pi3.f1.4.2 利用 MPICH 建立 MPI 程序開發(fā)與調(diào)試環(huán)境 MPICH 是目前最為流行的免費(fèi) MPI系統(tǒng),它支持幾乎所有的 Unix 及Windows 9x/NT/xp 環(huán)境,很適合于用來建立自己的 MPI 程序調(diào)試環(huán)境 建議在 Linux 環(huán)境下安裝 MPICH
30、 從而形成一個(gè) MPI程序的開發(fā)調(diào)試環(huán)境 mpich.tar.gz 的下載 /mpi/mpich 解開 MPICH 源代碼 % tar xzpvf mpich.tar.gz 或 % gzip -dc mpich.tar.gz | tar xpvf - 或 % gzip -d mpich.tar.gz % tar xpvf mpich.tar 展開后的源代碼位于目錄mpich或 mpich.1.2.5中,其中的doc子 錄含有 MPICH 的安裝說 明及使用說明 配置 、 編譯 MPICH % cd mpich(或 mpich.1.2.5) % ./configure -prefix=/usr/
31、local/lib/mpich % make 9如果使用的是 RedHat7.0 中發(fā)布的 gcc 2.96,在編譯時(shí)會(huì)出錯(cuò) 建議安裝kgcc 包,并在 configure 命令中加入選項(xiàng) -cc=kgcc 來選擇用 kgcc 編譯 MPICH 在單機(jī)上編譯運(yùn)行簡單測試程序 % cd examples/basic % ././bin/mpicc -o cpi cpi.c (or make cpi) % ././bin/mpirun -np 1 cpi % ././bin/mpirun -np 4 cpi 檢查文件 /.rhosts 或 /etc/hosts.equiv 是否存在并且其中包含本機(jī)
32、的主機(jī)名,當(dāng)文件不存在 或沒有包含本機(jī)主機(jī)名的話需要?jiǎng)?chuàng)建一個(gè)文件并且 (或) 在其中加入本機(jī)主機(jī)名 否則上述最后 一條命令將產(chǎn)生 permission denied錯(cuò)誤。 如果擁有超級(jí)用戶權(quán)限,則可以以超級(jí)用戶身份在目錄mpich下運(yùn)行 # make install 來將 MPICH 安裝到 錄 /usr/local/lib/mpich 下,以便其它用戶也能使用 然后可以刪除 mpich 目錄。 使用 C shell 的用戶應(yīng)該在文件 /.cshrc.login中加入 setenv PATH $PATH:/usr/local/lib/mpich/bin setenv MANPATH $MANP
33、ATH:/usr/local/lib/mpich/man 使用 Bourne shell 的用戶應(yīng)該在文件 /.bashrc 中加入 PATH=$PATH:/usr/local/lib/mpich/bin export PATH MANPATH=$MANPATH:/usr/local/lib/mpich/man export MANPATH 以便可以直接使用/usr/local/lib/mpich/bin中的命令 (mpif77, mpicc, mpirun 等等),以及用 man 命 令來得到 MPI 函數(shù)的使用手冊(cè)。 10第二章 MPI基礎(chǔ)知識(shí)2.1 下載 MPI標(biāo)準(zhǔn)的ps文檔MPI1.0
34、、MPI1.1、MPI2.0 文檔的下載:在網(wǎng)站 HYPERLINK 上有關(guān)于MPI上有關(guān)于MPI標(biāo)準(zhǔn)的所有文檔。可以隨時(shí)下載。注意其中的勘誤文檔的下載。 MPI2.0 的 postscrip 文檔中只有 MPI1.22.0版新增加的內(nèi)容,應(yīng)該結(jié)合 MPI1.1的文檔閱讀。2.2 一些名詞與概念程序與代碼: 我們這里說的程序不是指以文件形式存在的源代碼、 可執(zhí)行代碼等,而是指為了完成一個(gè)計(jì)算任務(wù)而進(jìn)行的一次運(yùn)行過程;進(jìn)程 (process): 一個(gè)MPI并行程序由一組運(yùn)行在相同或不同計(jì)算機(jī)計(jì)算結(jié)點(diǎn)上的進(jìn)程或線程構(gòu)成;為統(tǒng)一起見,我們將 MPI 程序中一個(gè)獨(dú)立參與通信的個(gè)體稱為一個(gè)進(jìn)程 在 Un
35、ix 系統(tǒng)中,MPI 的進(jìn)程通常是一個(gè) Unix 進(jìn)程 在共享內(nèi)存消息傳遞混合編程模式中,一個(gè) MPI 進(jìn)程可能代表一組 Unix 線程;進(jìn)程組 (process group) 指一個(gè) MPI程序的全部進(jìn)程集合的一個(gè)有序子集 進(jìn)程組中每個(gè)進(jìn)程被賦于一個(gè)在該組中唯一的序號(hào) (秩rank),用于在該組中標(biāo)識(shí)該進(jìn)程,序號(hào)的取值范圍是0 到進(jìn)程數(shù)-1。通信器(communicator) 通信器 (也有譯成通信子的) 是完成進(jìn)程間通信的基本環(huán)境,它描述了一組可以互相通信的進(jìn)程以及它們之間的聯(lián)接關(guān)系等信息。 MPI 的所有通信必須在某個(gè)通信器中進(jìn)行。通信器分域內(nèi)通信器 (lntracommuni cato
36、r) 和域間通信器 (lntercommunicator) 兩類,前者用于屬于同一進(jìn)程組的進(jìn)程間的通信,后者用于分屬兩個(gè)不同進(jìn)程組的進(jìn)程間的通信。域內(nèi)通信器 由一個(gè)進(jìn)程組和有關(guān)該進(jìn)程組的進(jìn)程間的拓?fù)渎?lián)接關(guān)系構(gòu)成。 MPI 系統(tǒng)在一個(gè) MPI 程序運(yùn)行時(shí)會(huì)自動(dòng)創(chuàng)建兩個(gè)通信器,一個(gè)稱為 MPI_COMM_WORLD,它包含該 MPI 程序中的所有進(jìn)程,另一個(gè)稱為MPI_COMM_SELF,它指單個(gè)進(jìn)程自己所構(gòu)成的通信器.序號(hào) (rank) 序號(hào)用來在一個(gè)進(jìn)程組或通信器中標(biāo)識(shí)一個(gè)進(jìn)程 MPI 程序中的進(jìn)程由進(jìn)程組序號(hào)或通信器序號(hào)所唯一確定。 序號(hào)是相對(duì)于進(jìn)程組或通信器而言的,同一個(gè)進(jìn)程在不同的進(jìn)程組
37、或通信器中可以有不同的序號(hào),進(jìn)程的序號(hào)是在進(jìn)程組或通信器被創(chuàng)建時(shí)賦予的。 MPI 系統(tǒng)提供了一個(gè)特殊的進(jìn)程序號(hào) MPI_PROC_NULL,它代表空進(jìn)程 (不存在的進(jìn)程)。與MPI_PROC_NULL間的通信實(shí)際上沒有任何作用。消息 (message) MPI程序中在進(jìn)程間傳送的數(shù)據(jù)稱為消息。一個(gè)消息由通信器、 源地址、目的地址、消息標(biāo)簽和數(shù)據(jù)構(gòu)成通信 (communication): 通信指在進(jìn)程之間進(jìn)行消息的收發(fā)、 同步等操作。2.3 編程模式SPMD 編程模式: Single Program Multiple Data 的縮寫。指構(gòu)成一個(gè)程序的所有進(jìn)程運(yùn)行的是同一份可執(zhí)行代碼,不同進(jìn)程根
38、據(jù)自己的序號(hào)可能執(zhí)行該代碼中的不同分支。這是 MPI 編程中最常用的編程方式。用戶只需要編寫 、 維護(hù)一份源代碼。 11MPMD 編程模式: Multiple Program Multiple Data的縮寫 指構(gòu)成一個(gè)程序的不同進(jìn)程運(yùn)行不同的可執(zhí)行代碼 用戶需要編寫、 維護(hù)多份源代碼。主從編程模式: 英文為Master/Slave。它是 MPMD 編程模式的一個(gè)特例,也是 MPMD 編程模式中最常見的方式。構(gòu)成一個(gè)程序的進(jìn)程之一負(fù)責(zé)所有進(jìn)程間的協(xié)調(diào)及任務(wù)調(diào)度,該進(jìn)程稱為主進(jìn)程(Master),其余進(jìn)程稱為從進(jìn)程 (Slave) 通常用戶需要維護(hù)兩份源代碼。2.4 MPI函數(shù)的一般形式C:一般
39、形式為 int MPI_Xxxxxx(.) MPI 的 C 函數(shù)名中下劃線后笫一個(gè)字母大寫,其余字母小寫 除 MPI_Wtime()和MPI_Wtick()外,所有 MPI 的 C 函數(shù)均返回一個(gè)整型錯(cuò)誤碼,當(dāng)它等于 MPI_SUCCESS (0)時(shí)表示調(diào)用成功,否則表示調(diào)用中產(chǎn)生了某類錯(cuò)誤Fortran 77::一般形式為 SUBROUTINE MPI_XXXXXX(., IERR) 除 MPI_WTIME 和 MPI_WTICK 外,F(xiàn)ortran 77 的 MPI 過程全部是 Fortran 77 子程序 (SUBROUTINE),它們與對(duì)應(yīng)的 MPI 的 C 函數(shù)同名 (但不區(qū)分大小寫
40、),參數(shù)表除最后多出一個(gè)整型參數(shù)IERR 用于返回調(diào)用錯(cuò)誤碼及參數(shù)的類型不同外,也和 MPI 的 C 函數(shù)一樣。2.5 MPI的原始數(shù)據(jù)類型 MPI 系統(tǒng)中數(shù)據(jù)的發(fā)送與接收都是基于數(shù)據(jù)類型進(jìn)行的 數(shù)據(jù)類型可以是 MPI 系統(tǒng)預(yù)定義的,稱為原始數(shù)據(jù)類型,也可以是用戶在原始數(shù)據(jù)類型的基礎(chǔ)上自己定義的數(shù)據(jù)類型。 MPI 為 Fortran 77 和 C 定義的原始的數(shù)據(jù)類型在下面兩個(gè)表格中給出。除表中列出的外,有的MPI 實(shí)現(xiàn)可能還提供了更多的原始數(shù)據(jù)類型,如 MPI_INTEGER2, MPI_LONG_LONG,等等。 2.5.1 Fortran 77 原始數(shù)據(jù)類型MPI數(shù)據(jù)類型對(duì)應(yīng)的Fortr
41、an77數(shù)據(jù)類型MPI_INTEGERMPI_REALMPI_DOUBLE_PRECISIONMPI_COMPLEXMPI_DOUBLE_COMPLEXMPI_LOGICALMPI_CHARACTERMPI_BYTEMPI_PACKEDINTEGERREALDOUBLE PRECISIONCOMPLEXDOUBLE COMPLEXLOGICALCHARACTER*1 12 2.5.2 C 原始數(shù)據(jù)類型MPI數(shù)據(jù)類型對(duì)應(yīng)的C數(shù)據(jù)類型MPI_INTMPI_FLOATMPI_DOUBLEMPI_SHORTMPI_LONGMPI_CHARMPI_UNSIGNED_CHARMPI_UNSIGNED_SH
42、ORTMPI_UNSIGNEDMPI_UNSIGNED_LONGMPI_LONG_DOUBLEMPI_BYTEMPI_PACKEDintfloatdoubleshortlongcharunsigned charunsigned shortunsigned unsigned longlong double2.6 MPI的幾個(gè)基本函數(shù) 本節(jié)介紹 MPI 系統(tǒng)的幾個(gè)基本函數(shù) 2.6.1 初始化 MPI 系統(tǒng)C: int MPI_Init(int *argc, char *argv) Fortran 77:MPI_INIT(IERR)INTEGER IERR 初始化 MPI 系統(tǒng) 通常它應(yīng)該是笫一個(gè)被
43、調(diào)用的 MPI 函數(shù) 除 MPI_Initialized外,其它所有MPI 函數(shù)僅在調(diào)用了該函數(shù)后才可以被調(diào)用。 在 C 接口中,MPI 系統(tǒng)通過 argc 和 argv 得到命令行參數(shù),并且會(huì)將其中 MPI 系統(tǒng)專用的參數(shù)刪除,而僅留下供用戶程序解釋的參數(shù)。 2.6.2 檢測 MPI 系統(tǒng)是否己經(jīng)初始化C int MPI_Initialized(int *flag)Fortran 77MPI_INITIALIZED(FLAG, IERR)LOGICAL FLAGINTEGER IERR 如果已經(jīng)調(diào)用過MPI_Init 則返回flag = true,否則返回 flag = false。這是唯一
44、可以在MPI_Init之前調(diào)用的函數(shù)。 13 2.6.3 得到通信器的進(jìn)程數(shù)及進(jìn)程在通信器中的序號(hào)Cint MPI_Comm_size(MPI_Comm comm, int *size)int MPI_Comm_rank(MPI_Comm comm, int *rank)Fortran 77MPI_COMM_SIZE(COMM, SIZE, IERR)INTEGER COMM, SIZE, IERRMPI_COMM_RANK(COMM, RANK, IERR)INTEGER COMM, RANK, IERR 上述兩個(gè)函數(shù)分別返回指定通信器中的進(jìn)程數(shù)及本進(jìn)程在該通信器中的序號(hào) 2.6.4 退出
45、MPI 系統(tǒng)Cint MPI_Finalize(void)Fortran 77MPI_FINALIZE(IERR)INTEGER IER 退出 MPI 系統(tǒng)。所有 MPI 進(jìn)程在正常退出前都必須調(diào)用該函數(shù),它是 MPI 程序中最后一個(gè)被調(diào)用的 MPI 函數(shù) 調(diào)用int MPI_Finalize后不允許再調(diào)用任何 MPI 函數(shù)。用戶在調(diào)用該函數(shù)前應(yīng)該確認(rèn)所有的 (非阻塞) 通信均已完成。 2.6.5 異常終止 MPI 程序的執(zhí)行Cint MPI_Abort(MPI_Comm comm, int errorcode)Fortran 77MPI_ABORT(COMM, ERRORCODE, IERR
46、)INTEGER COMM, ERRORCODE, IERR 調(diào)用該函數(shù)時(shí)表明因?yàn)槌霈F(xiàn)了某種致命錯(cuò)誤而希望異常終止 MPI 程序的執(zhí)行。MPI 系統(tǒng)會(huì)盡量設(shè)法終止通信器 comm 中的所有進(jìn)程。 在 Unix 系統(tǒng)環(huán)境中,errcode 被作為進(jìn)程的退出碼 (exitcode)返回給操作系統(tǒng)。 2.6.6 查詢處理器名稱Cint MPI_Get_processor_name(char *name, int *resultlen)Fortran 77MPI_GET_PROCESSOR_NAME( NAME, RESULTLEN, IERR)CHARACTER*(*) NAMEINTEGER RE
47、SULTLEN, IERR 14 該函數(shù)在name 中返回進(jìn)程所在的處理器的名稱,參數(shù) name 應(yīng)該提供不少于MPI_MAX_PROCESSOR_NAME個(gè)字節(jié)的存儲(chǔ)空間用于存放處理器名稱。 2.6.7 獲取墻上時(shí)間及時(shí)鐘精度Cdouble MPI_Wtime(void)double MPI_Wtick(void)Fortran 77DOUBLE PRECISION FUNCTION MPI_WTIME()DOUBLE PRECISION MPI_WTICK() MPI_WTIME 返回當(dāng)前墻上時(shí)間,以從某一固定時(shí)刻算起的秒數(shù)為單位。而 M PI_WTICK 則返回MPI_WTIME 函數(shù)的
48、時(shí)鐘精度,也是以秒為單位。 例如,假設(shè) MPI_WTIME 使用的硬件時(shí)鐘計(jì)數(shù)器每11000 秒增加1,則 MPI_WTICK 的返回值為 10-3,表示用函數(shù) MPI_WTIME 得到的時(shí)間精度為干分之一秒。 在 C 中,這是唯一兩個(gè)返回雙精度值而非整型錯(cuò)誤碼的 MPI 接口函數(shù)。在 Fortran 77中,這是唯一兩個(gè)FUNCTION形式的接口。其它 Fortran 77 MPI 的接口一律以SUBROUTINE的形式定義)。2.7 MPI程序的基本結(jié)構(gòu) 2.7.1 Fortran 77程序 PROGRAM MPIPRGINCLUDE mpif.hINTEGER MYRANK, NPROC
49、S, IERR*CALL MPI_INIT(IERR)CALL MPI_COMM_RANK( MPI_COMM_WORLD, MYRANK, IERR)CALL MPI_COMM_SIZE( MPI_COMM_WORLD, NPROCS, IERR). .CALL MPI_FINALIZE(IERR)STOPEND程序?qū)嵗?【 02-mpi.f】 15 2.7.2 C 程序#include mpi.h. .int main(int argc, char *argv)int myrank, nprocs;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_W
50、ORLD,&nprocs);MPI_Comm_rank(MPI_COMM_WORLD,&myrank);. .MPI_Finalize();程序?qū)嵗?【 02-mpi.c】 16第三章 點(diǎn)對(duì)點(diǎn)通信 點(diǎn)對(duì)點(diǎn)通信指在一對(duì)進(jìn)程之間進(jìn)行的消息收發(fā)操作。一個(gè)進(jìn)程發(fā)送消息,另一個(gè)進(jìn)程接收消息。3.1 標(biāo)準(zhǔn)阻塞型點(diǎn)對(duì)點(diǎn)通信函數(shù) 3.1.1 標(biāo)準(zhǔn)阻塞發(fā)送Cint MPI_Send(void *buff, int count,MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)Fortran 77MPI_SEND(BUFF, COUNT, DATATY
51、PE, DEST, TAG, COMM, IERR) BUFF(*)INTEGER COUNT, DATATYPE, DEST, TAG, COMM, IERR tag 的取值范圍為0 - MPI_TAG_UB. dest 的取值范圍為 0 - np-1 (np 為通信器 comm 中的進(jìn)程數(shù)) 或 MPI_PROC_NULL. count 是指定數(shù)據(jù)類型的個(gè)數(shù),而不是字節(jié)數(shù)。3.1.2 阻塞接收Cint MPI_Recv(void *buff, int count,MPI_Datatype datatype, int source, int tag,MPI_Comm comm, MPI_St
52、atus status)Fortran 77MPI_RECV(BUFF, COUNT, DATATYPE, SOURCE, TAG, COMM,+ STATUS, IERR) BUFF(*)INTEGER COUNT, DATATYPE, SOURCE, TAG, COMM, IERRINTEGER STATUS(MPI_STATUS_SIZE) tag 的取值范圍為0 - MPI_TAG_UB ,或 MPI_ANY_TAG. source 的取值范圍為 0 - np-1(np 為通信器 comm 中的進(jìn)程數(shù)),或 MPI_ANY_SOURCE,,或MPI_PROC_NULL。 count 給
53、出接收緩沖區(qū)的大小 ( 定數(shù)據(jù)類型的個(gè)數(shù)),它是接收數(shù)據(jù)長度的上界。具體接收到的數(shù)據(jù)長度可通過調(diào)用 MPI_Get_count 函數(shù)得到。 17 status 中的內(nèi)客 status 返回有關(guān)接收到的消息的信息,它的結(jié)構(gòu)如下: 在 C 中 status 是一個(gè)結(jié)構(gòu),它包含下面三個(gè)用戶可以使用的域: typedef struct. . int MPI_SOURCE; 消息源地址 int MPI_TAG; 消息標(biāo)簽 int MPI_ERROR; 錯(cuò)誤碼 M PI_Status; 在 Fortran 77 中 status 各個(gè)元素的含義如下 STATUS(MPI_SOURCE) 消息源地址 STA
54、TUS(MPI_TAG) 消息標(biāo)簽 STATUS(MPI_ERROR) 錯(cuò)誤碼 查詢接收到的消息長度Cint MPI_Get_count(MPI_Status status,MPI_Datatype datatype, int *count)Fortran 77MPI_GET_COUNT(STATUS, DATATYPE, COUNT, IERR)INTEGER DATATYPE, COUNT, IERRINTEGER STATUS(MPI_STATUS_SIZE)該函數(shù)在 count 中返回消息的長度 (數(shù)據(jù)類型個(gè)數(shù))。31.4.3 阻塞型消息傳遞實(shí)例例 3.1 阻塞型消息傳遞: 【 03_
55、exl.f 】 18例 3.2 消息收發(fā)順序?qū)е碌某绦蛩梨i: 【 03_ex2.f 】例 3.3 長消息導(dǎo)致的程序死鎖: 【 03_ex3.f 】例 3.4 0 號(hào)進(jìn)程先發(fā), 其它進(jìn)程先收: 【 03_ex4.f 】 通信過程是串行的。例 3.5 偶數(shù)號(hào)的進(jìn)程先發(fā),奇數(shù)號(hào)的進(jìn)程先收:【03_ex5.f 】 通信過程是并發(fā)的, 當(dāng) NPROCS1時(shí)仍有可能發(fā)生死鎖。如果將接收及求和中的數(shù)組 B 改成 A,會(huì)得到什么結(jié)果?3.1.4 其它一些阻塞型消息傳遞函數(shù) 發(fā)送與接收組合進(jìn)行 MPI_SENDRECV 函數(shù)將一次發(fā)送調(diào)用和一次接收調(diào)用合并進(jìn)行。它使得 MPI 程序更為簡潔,更重要的是,MPI
56、的實(shí)現(xiàn)通常能夠保證使用MPI_SENDRECV 函數(shù)的程序不會(huì)出現(xiàn)上節(jié)例子中出現(xiàn)的由于消息收發(fā)配對(duì)不好而引起的程序死鎖。Cint MPI_Sendrecv(void *sendbuff, int sendcount,MPI_Datatype sendtype, int dest, int sendtag,void *recvbuff, int recvcount,MPI_Datatype recvtype, int source, int recvtag,MPI_Comm comm, MPI_Status status)Fortran 77MPI_SENDRECV(SENDBUFF, SEND
57、COUNT, SENDTYPE,+ DEST, SENDTAG,+ RECVBUFF, RECVCOUNT, RECVTYPE, SOURCE, RECVTAG,+ COMM, STATUS, IERR) SENDBUFF(*), RECVBUFF(*)INTEGER SENDCOUNT, SENDTYPE, DEST, SENDTAG,+ RECVCOUNT, RECVTYPE, SOURCE, RECVTAG,+ COMM, IERRINTEGER STATUS(MPI_STATUS_SIZE)例 3.6 用 MPI_SENDRECV 替換 MPI_SEND和 MPI_RECV: 【 03
58、_ex6.f 】 發(fā)送與接收組合進(jìn)行,收發(fā)使用同一緩沖區(qū)C int MPI_Sendrecv_replace(void *buff, int count,MPI_Datatype datatype, 19 int dest, int sendtag,int source, int recvtag,MPI_Comm comm, MPI_Status status)Fortran 77MPI_SENDRECV_REPLACE(BUFF, COUNT, DATATYPE,+ DEST, SENDTAG, SOURCE, RECVTAG,+ COMM, STATUS, IERR) BUFF(*)INT
59、EGER COUNT, DATATYPE, DEST, SENDTAG,+ SOURCE, RECVTAG, COMM, IERRINTEGER STATUS(MPI_STATUS_SIZE)3.2 消息發(fā)送模式 MPI共有四種模式的消息發(fā)送函數(shù),這些函數(shù)具有完全一樣的入口參數(shù),但它們發(fā)送消息的方式或?qū)邮辗降臓顟B(tài)要求不同。標(biāo)準(zhǔn)模式 (standard mode): 由 MPI 系統(tǒng)來決定是否將消息拷貝至一個(gè)緩沖區(qū)然后立即返回 (此時(shí)消息的發(fā)送由 MPI 系統(tǒng)在后臺(tái)進(jìn)行),還是等待將數(shù)據(jù)發(fā)送出去后再返回。大部分 MPI 系統(tǒng)預(yù)留了一定大小的緩沖區(qū),當(dāng)發(fā)送的消息長度小于緩沖區(qū)大小時(shí)會(huì)將消息緩沖然
60、后立即返回,否則,當(dāng)部分或全部消息發(fā)送完成后才返回。標(biāo)準(zhǔn)模式發(fā)送被稱為是非局部的,因?yàn)樗耐瓿煽赡苄枰c接收方聯(lián)絡(luò)。標(biāo)準(zhǔn)模式的阻塞發(fā)送函數(shù)為 MPI_Send。緩沖模式 (buffered mode) MPI系統(tǒng)將消息拷貝至一個(gè)用戶提供的緩沖區(qū)然后立即返回,消息的發(fā)送由 MPI 系統(tǒng)在后臺(tái)進(jìn)行。用戶必須確保所提供的緩沖區(qū)大小足以容下采用緩沖模式發(fā)送的消息。緩沖模式發(fā)送操作被稱為是局部的,因?yàn)樗恍枰c接收方聯(lián)絡(luò)即可立即完成(返回)。 緩沖模式的阻塞發(fā)送函數(shù)為 MPI_Bsend。同步模式 (synchronous mode): 實(shí)際上就是在標(biāo)準(zhǔn)模式的基礎(chǔ)上還要求確認(rèn)接收方已經(jīng)開始接收數(shù)據(jù)后函數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 瀝青混凝土心墻堆石壩設(shè)計(jì)與計(jì)算
- 牛品種改良技術(shù)
- 建設(shè)工程施工合同糾紛要素式起訴狀模板法務(wù)團(tuán)隊(duì)審定版
- 2026 年有子女離婚協(xié)議書標(biāo)準(zhǔn)版
- 2026 年離婚協(xié)議書權(quán)威正規(guī)范本
- 2026 年官方化離婚協(xié)議書專業(yè)范本
- 房企hr年終總結(jié)(3篇)
- 釣友俱樂部年終總結(jié)(3篇)
- 干部選拔任用工作情況的自查報(bào)告
- 2026年虛擬主機(jī)租用合同
- 東風(fēng)7電路圖解析
- 數(shù)字填圖系統(tǒng)新版(RgMap2.0)操作手冊(cè)
- YY/T 1778.1-2021醫(yī)療應(yīng)用中呼吸氣體通路生物相容性評(píng)價(jià)第1部分:風(fēng)險(xiǎn)管理過程中的評(píng)價(jià)與試驗(yàn)
- GB/T 17213.4-2015工業(yè)過程控制閥第4部分:檢驗(yàn)和例行試驗(yàn)
- FZ/T 73009-2021山羊絨針織品
- JJF 1069-2012 法定計(jì)量檢定機(jī)構(gòu)考核規(guī)范(培訓(xùn)講稿)
- GB∕T 5900.2-2022 機(jī)床 主軸端部與卡盤連接尺寸 第2部分:凸輪鎖緊型
- 2011-2015廣汽豐田凱美瑞維修手冊(cè)wdl
- DFMEA編制作業(yè)指導(dǎo)書新版
- DB35∕T 1844-2019 高速公路邊坡工程監(jiān)測技術(shù)規(guī)程
- 城市管理綜合執(zhí)法局城管執(zhí)法與執(zhí)法程序PPT模板
評(píng)論
0/150
提交評(píng)論