當前位置:星座運勢大全官網 - 周易占卜 - mpi4py點對點通信概述

mpi4py點對點通信概述

在上壹篇文章中,我們介紹了mpi4py中的組合發送和接收通信方法。到目前為止,我們已經對mpi4py中提供的各種點對點通信方式做了簡單的介紹,並給出了簡單的使用例程。讓我們對點對點通信做壹個總結。

從前面的介紹中我們可以看到,點對點通信有多種模式,可以分為阻塞通信、非重復非阻塞通信和可重復非阻塞通信,每壹類又可以分為標準、緩沖、就緒和同步模式。要了解各種通信模式的行為,關鍵是要了解每種模式是如何使用緩沖區的。簡而言之,每種模式下使用buffer的特點可以總結為:標準發送實際使用的是MPI環境提供的默認buffer;Buffered Bsend實際上相當於把MPI環境提供的緩沖放在用戶空間管理中;Ready Rsend其實相當於沒有緩沖區,只是發送方不能提前等待;同步Ssend實際上相當於不緩沖,而是允許等待。異步模式下各模式的工作原理差不多,但可以理解為MPI環境下另壹個線程會在後臺做實際的消息傳輸,通過MPI_Wait*、MPI_Test*等機制與MPI進程的主線程進行通信和同步。

點對點通信需要特別註意的壹點是防止死鎖。死鎖的原因有很多,最典型的是緩沖區爭用導致的死鎖,例如下面的例子:

運行結果如下:

在上面的例子中,兩個進程同時互相發送和接收消息,但是因為發送和接收的消息相對較小,並且沒有超過MPI環境提供的默認緩沖區容量,所以可以順利執行。現在,我們嘗試將前面示例中的計數更改為1024(或者更多,具體取決於您的MPI環境配置),運行結果如下:

兩個進程在發送時都被阻塞,因為兩個進程的發送操作都在接收操作之前開始。當發送的數據量超過MPI環境提供的默認緩沖空間時,每個進程都要等待對方啟動接收操作,直接拿走“多余”的數據。但是因為使用了阻塞發送,雙方的發送函數在接收之前都不會返回,所以接收動作無法執行,於是兩個進程都因為等待接收而阻塞在發送步驟上,程序出現死鎖。

對於這種類型的死鎖,解決方案如下:

這些解決方案我們不壹壹列舉,只舉壹個例子,就是調整語句的執行順序來防止死鎖,如下:

運行結果如下:

語句調整後,每個進程的發送操作可以先與對方的接收操作匹配,消息傳輸完成後再進行下壹次通信,這樣就可以消除緩沖區競爭造成的死鎖。

MPI對消息傳遞的執行順序有壹定的規定,但是MPI環境沒有提供保證“公平性”的措施,具體如下:

以上簡單總結了mpi4py中的點對點通信。在下壹篇文章中,我們將介紹組和通信器的基本概念。