在上一篇中我們介紹了 mpi4py 中同步阻塞通信模式,下面我們將進(jìn)入到對非阻塞通信模式的介紹解滓。
非阻塞通信將通信和計(jì)算進(jìn)行重疊,在一些情況下可以大大改善性能。特別是在那些具有獨(dú)立通信控制硬件的系統(tǒng)上框仔,將更能發(fā)揮其優(yōu)勢。
非阻塞通信需要通過發(fā)送操作的 start 函數(shù)啟動(dòng)發(fā)送拄养,但并不要求操作立即執(zhí)行和結(jié)束离斩,啟動(dòng)發(fā)送操作的 start 調(diào)用在 MPI 環(huán)境從發(fā)送數(shù)據(jù)區(qū)取走數(shù)據(jù)之前即可返回银舱。然后再在適當(dāng)時(shí)機(jī)通過發(fā)送操作的 complete 函數(shù)來結(jié)束通信。在 start 和 complete 之間可并發(fā)進(jìn)行數(shù)據(jù)傳輸和計(jì)算跛梗。
類似地寻馏,非阻塞通信的接收操作會(huì)發(fā)起一個(gè)接收的 start 操作,并在其它時(shí)機(jī)再通過接收的 complete 操作確認(rèn)接收動(dòng)作實(shí)際完成核偿。再接收的 start 和 complete 函數(shù)之間诚欠,接收數(shù)據(jù)和執(zhí)行計(jì)算可并發(fā)進(jìn)行。
與阻塞通信相對應(yīng)漾岳,非阻塞通信也可使用4個(gè)模式轰绵,即標(biāo)準(zhǔn)、緩沖尼荆、同步和就緒左腔,區(qū)別在于非阻塞通信的方法在前面加了一個(gè) I/i 前綴,但是語義與阻塞通信的各個(gè)模式一一對應(yīng)捅儒。
非阻塞發(fā)送可與阻塞接收相匹配液样,反之,阻塞發(fā)送也可與非阻塞接收相匹配巧还。
在非阻塞通信中一般會(huì)通過非阻塞通信對象來管理通信動(dòng)作完成與否的信息鞭莽。非阻塞通信的發(fā)送和接收方法會(huì)分別初始化一個(gè)發(fā)送和接收操作,然后立即返回一個(gè)MPI.Request 實(shí)例狞悲,在程序某個(gè)合適的地方可以調(diào)用 MPI.Request.Test()撮抓,MPI.Request.Wait() 和MPI.Request.Cancel() 來測試、等待或者取消本次通信摇锋。如果需要進(jìn)行多重的測試或等待丹拯,可以使用 MPI.Request.Testall(),MPI.Request.Testany()荸恕,MPI.Request.Testsome()乖酬,MPI.Request.Waitall(),MPI.Request.Waitany()融求,MPI.Request.Waitsome()方法咬像。
這里我們對非阻塞通信做了一個(gè)非常概要的介紹,在下一篇中我們將依次介紹非重復(fù)的非阻塞通信的四種通信模式生宛,并給出相應(yīng)的例程县昂。讓我們首先從非重復(fù)的標(biāo)準(zhǔn)通信開始。