![](/img/trans.png)
[英]Elegantly stop the thread for blocking or non-blocking when accept or receive using asio and C++11
[英]What happens for standard and non-blocking sends when the receiver does not post a receive
如果我發送使用或者MPI_Send
或MPI_Isend
和接收過程中要么不接收死或太忙回復?
我怎么知道我應該停止發送到進程,因為它沒有接收/死或忙
我嘗試了1:
MPI_Send (&destNode, strlen(destNode)+1, MPI_CHAR, nameServer, TAG_NAME_RESOLUTION, MPI_COMM_WORLD, &req);
但是,當nameServer
不處於接收模式時,發送將被阻止
我嘗試使用MPI_Isend
2並測試是否發送了味精:
//Ask nameServer (process 1) to resolve destNode
MPI_Isend (&destNode, strlen(destNode)+1, MPI_CHAR, nameServer, TAG_NAME_RESOLUTION, MPI_COMM_WORLD, &req);
int flag = 0;
MPI_Test(&req, &flag, &stat);
但是,即使我知道MPI_Send
因為進程未接收而掛起,我MPI_Send
得到flag = 1
。
不論是否MPI_Send
返回或MPI_Isend
請求完成( flag==true
)不一定依賴於匹配接收被張貼。 在兩種情況下,這僅意味着可以重新使用發送緩沖區。
當條件相似時,您的MPI實現可能只決定在一種情況下緩沖而不在另一種情況下緩沖。 否則可能會在星期三的滿月時緩沖。 您不能對此承擔任何責任。
如果出於某種原因需要函數返回或操作完成以指示實際上已接收到消息,則需要使用同步模式調用,即MPI_Ssend
或MPI_Issend
。
引用MPI_Send
(3.4)的標准
3.2.1節中描述的發送呼叫使用標准通信模式。 在這種模式下,由MPI決定是否將緩沖傳出的消息。 MPI可以緩沖傳出消息。 在這種情況下,發送調用可以在調用匹配的接收之前完成。 另一方面,出於性能原因,緩沖區空間可能不可用,或者MPI可能選擇不緩存傳出消息。 在這種情況下,只有在發送了匹配的接收方並將數據移至接收方之前,發送呼叫才會完成。
如果您想確保盡管沒有收到消息,您的程序仍可以繼續,那么請繼續使用MPI_Isend
並確保直到MPI_Test
指示完成為止,才觸摸緩沖區和請求。
對於MPI_Isend
/ MPI_Test
(3.7.3)
發送操作的完成表示發送方現在可以自由更新發送緩沖區中的位置(發送操作本身不更改發送緩沖區的內容)。 它並不表示已接收到該消息,而是可能已被通信子系統緩沖。
PS:如果您的接收器等級已失效 ,則您的MPI程序很可能不正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.