天天看點

《并行計算的程式設計模型》一1.3 點對點通信

點對點通信是MPI中最常用的基礎通信模式。一個程序發送資料,另一個程序接收資料。發送程序需要指定發送的資料、接收資料的程序号和通信域。考慮到一些老式消息傳遞系統,每個消息還有一個消息号,消息号的資料類型為單精度非負整數。同理,接收程序需要指定資料接收位址、資料來源程序号、通信域和消息号。另外,可能需要提供一個消息狀态參數,用于儲存資料接收的狀态資訊。

針對早期的消息傳遞系統和多數檔案I/O庫,用包含位址和位元組數的二進制數組指定資料緩沖區。MPI将該二進制數組擴充成三元數組,三元數組包含位址、資料類型和資料個數(指定資料類型的個數,而非位元組數)。在簡單例子中,MPI中資料類型與基本程式設計語言的資料類型相似。例如,用C語言指定10個整數類型資料的緩沖區,MPI的語句表達方式為(address,10,MPI_INT)。這種方法友善程式編寫者指定資料,因為程式程式設計者無需知道每一種資料類型的具體位元組數。同時,該方法使MPI程式能夠在混合硬體平台上運作,即使該混合硬體平台資料類型的位元組數不一緻(這是MPI庫的重要特性)。另外,如1.4節所述,MPI允許在記憶體中指定不連續的資料緩沖區。

《并行計算的程式設計模型》一1.3 點對點通信

在MPI_Send函數參數中,通信域中的程序号指定資料發送到具體哪個程序,并提供通信文本。消息号是一個非負整數類型,其最大值取決于MPI的具體實作方式,但至少為32 767。

MPI_Recv接收函數與發送函數的參數類似。不同之處在于接收函數允許指定接收資料緩沖區大小大于實際發送的資料大小。消息号和資料來源程序号可用具體數字指定(例如消息号為15和資料來源程序号為3),也可使用通配符類型的數值(例如消息号為MPI_ANY_TAG和資料來源程序号為MPI_ANY_SOURCE)。MPI_ANY_TAG允許使用者發送一個額外整數類型的資料(例如具體消息号數值);MPI_ANY_SOURCE通過非确定性算法确定程序号。狀态參數的消息值由發送資料的程序提供。若不需要狀态資訊,可通過MPI_STATUS_IGNORE進行指定。

圖1-2是0号程序向MPI_COMM_WORLD通信域中其他所有程序發送相同資料的程式示例。該程式示例是MPI的基本或者标準發送模式,MPI還提供其他資料發送模式,例如同步發送模式、就緒發送模式和緩沖發送模式。在1.5節中,将介紹非阻塞式通信模式。

繼續閱讀