簡體   English   中英

接收方未發布接收時標准和非阻塞發送會發生什么

[英]What happens for standard and non-blocking sends when the receiver does not post a receive

如果我發送使用或者MPI_SendMPI_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_SsendMPI_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM