MPI编程的常用接口速查
獲取當(dāng)前時(shí)間
在插入MPI提供的頭文件后,可以獲得獲取時(shí)間的函數(shù)。
double MPI_Wtime(void) 取得當(dāng)前時(shí)間, 計(jì)時(shí)的精度由 double MPI_Wtick(void) 取得
作為對(duì)比,一般在C/C++中, 插入time.h,通過 clock_t clock(void) 取得當(dāng)前時(shí)間, 計(jì)時(shí)的精度由常數(shù) CLOCKS_PER_SEC 定義。
?
?點(diǎn)到點(diǎn)通信函數(shù)
進(jìn)程間的通信需要通過一個(gè)通信器來完成。MPI 環(huán)境在初始化時(shí)會(huì)自動(dòng)創(chuàng)建兩個(gè)通信器,一個(gè)稱為 MPI_COMM_WORLD,它包含程序中的所有進(jìn)程,另一個(gè)稱為 MPI_COMM_SELF,它是每個(gè)進(jìn)程獨(dú)自構(gòu)成的、僅包含自己的通信器。MPI 系統(tǒng)提供了一個(gè)特殊進(jìn)程號(hào) MPI_PROC_NULL,它代表空進(jìn)程 (不存在的進(jìn)程),與 MPI_PROC_NULL 進(jìn)行通信相當(dāng)于一個(gè)空操 作,對(duì)程序的運(yùn)行沒有任何影響。
使用MPI_Barrier(communicator)來完成同步
使用MPI_Send(message, size, data_type, dest_id, tag, communicator) 來把數(shù)據(jù)message封裝起來成為真正的消息結(jié)構(gòu),向進(jìn)程號(hào)為dest_id的進(jìn)程發(fā)送數(shù)據(jù),是否要先把消息存入緩沖區(qū)根據(jù)默認(rèn)緩沖區(qū)的大小確定。
使用MPI_Bsend(message_data, size, data_type, dest_id, tag, communicator) 來發(fā)送數(shù)據(jù),需要預(yù)先注冊(cè)一個(gè)緩沖區(qū),并調(diào)用MPI_Buffer_attach(buffer, buf_size)來供MPI環(huán)境使用
使用MPI_Buffer_attach(buffer, size)來把緩沖區(qū)buffer提交給MPI環(huán)境,其中buffer是通過malloc分配的內(nèi)存塊。
使用MPI_Buffer_detach(&buffer,&size)來確保傳輸?shù)耐瓿?#xff0c;盡量把detach和attach函數(shù)配對(duì)使用,正如盡可能同時(shí)使用malloc和free,同時(shí)使用Init和Finalize,防止遺漏!
使用MPI_Pack_size(size, data_type, communicator, &pack_size)來獲取包裝特定類型的數(shù)據(jù)所需要的緩沖區(qū)大小(還沒有計(jì)入頭部,所以真正緩沖區(qū)大小 buf_size = MPI_BSEND_OVERHEAD + pack_size,如果有多份數(shù)據(jù)發(fā)送,則buf_size還要疊加)。
使用MPI_Recv(message, size, data_type, src_id, tag, communicator, status)來接收數(shù)據(jù),把已經(jīng)到達(dá)接收緩沖區(qū)的數(shù)據(jù)解析到message數(shù)組中,只有全部數(shù)據(jù)都解析出來時(shí),函數(shù)才返回。
tips:除了上述兩種發(fā)送模式外,還有就緒通信MPI_Rsend()和同步通信MPI_Ssend(),參數(shù)都是一致的,函數(shù)的區(qū)別在于,如果已經(jīng)保證接收動(dòng)作在發(fā)送動(dòng)作之前啟動(dòng)了(可以利用MPI_Barrier函數(shù)做到這一點(diǎn)),那么就可以使用MPI_Rsend()提高效率;如果需要保證接收動(dòng)作發(fā)生后,發(fā)送動(dòng)作才能返回,那么就使用MPI_Ssend()
tips:上面都是阻塞通信的方式,也就是調(diào)用這些函數(shù)的時(shí)候進(jìn)程可能會(huì)阻塞。可以使用別的通信模式,或者使用多線程來改變這一點(diǎn)。
?
集合通信
MPI_Bcast廣播,使得數(shù)據(jù)有p份拷貝
MPI_Scatter散發(fā),每份數(shù)據(jù)只拷貝一次
MPI_Gather收集,每份數(shù)據(jù)只拷貝一次
MPI_Reduce歸約
以后如果需要用到再寫吧。
?
數(shù)據(jù)類型和預(yù)定義的量
用于作為參數(shù)的數(shù)據(jù)類型 MPI_INT, MPI_DOUBLE, MPI_CHAR,?MPI_Status?
預(yù)定義的量 MPI_STATURS_IGNORE, MPI_ANY_SOURCE, MPI_ANY_TAG
?
?
初始化與結(jié)束
使用MPI_Init(&argc, &argv)來初始化MPI環(huán)境,可能是一些全局變量的初始化。
使用MPI_Comm_rank(communicator, &myid)來獲取當(dāng)前進(jìn)程在通信器中具有的進(jìn)程號(hào)。
使用MPI_Comm_size(communicator, &numprocs)來獲取通信器中包含的進(jìn)程數(shù)目。
使用MPI_Finalize()來結(jié)束并行編程環(huán)境。之后我們就可以創(chuàng)建新的MPI編程環(huán)境了。
?
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的MPI编程的常用接口速查的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c# sha1签名 微信_C#微信公众号
- 下一篇: 【C语言】字节对齐问题(以32位系统为例