2010-08-26 72 views
1

我試圖使用MPI_SendRecv跨2個進程發送數據(部隊)。通常數據將被覆蓋在接收緩衝區中,我不想覆蓋接收緩衝區中的數據,而是要添加接收到的數據。將接收到的數據添加到MPI_SendRecv中的現有接收緩衝區

我可以做以下事情。將前一時間步驟中的數據存儲到不同的陣列中,然後在接收後添加它。但是我擁有大量的節點,並且我不想爲每個時間段的存儲分配內存。 (或覆蓋相同)

我的問題是有辦法將接收到的數據直接添加到緩衝區並使用MPI將其存儲到接收的內存中?

在這個方向上的任何幫助將是非常感謝。

我確定集體溝通電話(MPI減少)不能在這裏制定。有沒有其他的命令可以做到這一點?

+0

你的意思是像添加總和,或添加像追加? – 2013-03-20 13:03:43

+0

我認爲對MPI_Reduce的引用表明他指的是數值加法而不是buffer.push_back。 – Jeff 2013-03-20 16:37:16

回答

1

總之:沒有。

只要你的建議沒有意義。如果沒有先將其放入本地存儲器,機器就無法對收到的值執行任何操作。你將需要一個緩衝區來接收最新的值,並且每個接收之後都會有一個單獨的總和,以便緩衝區的內容增加。

+0

是的,我做了同樣的事情,首先我將內存中的值存儲到一個臨時數組,然後進行通信,然後將接收到的值添加到緩衝區,但是接着我必須​​在每次send/recv命令之後獨立執行並在每個方向(pos和neg方向都是3 * 2),儘管它是相同的額外代碼的一點點...非常感謝迴應。 – lsk1985 2010-09-08 15:26:59

3

總之:不,但你應該能夠做到這一點。

總之:您的建議非常有意義,而MPI論壇目前正在考慮新的功能,這些功能基本上可以滿足您的需求。

建議必須收集數據才能累計數據是不正確的。 MPI_Accumulate以片面的方式進行遠程堆積。您希望MPI_Sendrecv_accumulate而不是MPI_Sendrecv_replace。這非常有意義,並且實現可以在內部做得比您可以做得更好,例如,它可以基於每個數據包進行緩衝。

對於suszterpatt,MPI在eager協議內部緩衝區中,並且在彙集協議中可以設置一個管道以最小化緩衝。

MPI_Recv_accumulate的實現(爲簡單起見,該部分MPI_SEND不必考慮)是這樣的:

int MPI_Recv(void *buf, int count, MPI_Datatype datatype, MPI_Op op, int source, int tag, MPI_Comm comm, MPI_Status *status) 
{ 
if (eager) 
    MPI_Reduce_local(_eager_buffer, buf, count, datatype, op); 
else /* rendezvous */ 
{ 
    malloc _buffer 
    while (mycount<count) 
    { 
    receive part of the incoming data into _buffer 
    reduce_local from _buffer into buf 
    } 
} 
相關問題