簡體   English   中英

是否可以忽略/丟棄MPI_Allgather中收到的數據?

[英]Is it possible to ignore/throw out received data in MPI_Allgather?

在MPI中,是否可以立即丟棄接收到的數據而無需分配緩沖區來保存它? 我正在使用MPI_Allgather收集來自多個進程的數據,但是在某些時候,一個或多個進程沒有有用的數據要發送。

我最初的解決方案是讓無用的過程完成。 但是,如果任務在不調用MPI_Allgather的情況下終止,則其余部分最終將陷入死鎖,因為MPI_Allgather會阻塞。 為了解決此問題,我將所有進程保留到最后,但是發送了從未使用過的垃圾數據。

有用的進程會保留一些接收到的數據,但無用的進程不會。 我試圖像這樣傳遞一個空指針給Recbuf:

MPI_Allgather(&sendbuf, 1, MPI_INT, 0, 1, MPI_INT, MPI_COMM_WORLD);

但這沒用。 為了避免接收或至少存儲無用的數據,我能做些什么嗎?

您可以為有用的過程創建一個新的組,並在該組上收集而不是MPI_COMM_WORLD

從定義上講,集體是集體,這意味着溝通者中的每個過程都必須稱呼他們。 如果您需要對某個通信器的一個子集執行集體呼叫,則必須像已經建議的那樣新建一個通信器。

您還可以查看MPI_Allgatherv ,看看它是否適合您的應用程序。 使用此集合,您可以指定每個進程將發送多少數據。 但是,通信器中的每個進程仍必須調用MPI_Allgatherv ,即使那些未發送數據的MPI_Allgatherv也是如此。 除了此要求之外,所有進程都必須知道每個進程正在貢獻多少數據。

最后,MPI 3最有可能包括完全按照您的意願進行的稀疏集體操作。 但是就目前而言,新的傳播者可能是最好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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