[英]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.