簡體   English   中英

在MPI_Gather C中尋址內存

[英]Addressing Memory in MPI_Gather C

我正在嘗試將數據傳遞給MPI_Gather 我分配內存如下:

float *phie, *phitemp;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

phitemp=(float *) malloc(20*sizeof(float));
if (rank==1) phie=(float *) malloc(itermax*20*size*sizeof(float));

然后使用MPI_Gather()獲取所有進程以將數據發送到第1級,如下所示:

for (iter=0;iter<itermax;iter++) {    
   MPI_Gather((float *) phitemp, 20, MPI_FLOAT, (float *) (phie+iter*20*size*sizeof(float)), 20, MPI_FLOAT, 1, MPI_COMM_WORLD);
   iter=0;

}

我收到錯誤消息,提示我沒有適當分配內存。

指針算術是根據指針所指向的字的大小進行的。 由於phie是一個float * ,所述sizeof(float)phie+iter*20*size*sizeof(float)是多余的,你會有效存儲器的外部。

刪除sizeof(float ),或將其更改為更清晰的數組索引: &(phie[iter * 20 * size])

您還應該刪除所有指針強制轉換,它們都是多余的並且可以隱藏問題。 僅在知道需要時才進行投射。

關於你提到的另一個問題:該recvbuf的參數MPI_Gather只在根進程顯著。 因此,僅根過程的iter重要。 但是,由於您的所有進程都經過運行MPI_Gather的相同循環,並且彼此之間無法相互超越,因此在匹配收集期間它們始終具有相同的iter

暫無
暫無

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

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