MPI_Gatherv记忆问题(MPI + C)(MPI_Gatherv memory proble

2019-11-04 18:34发布

作为延续到我以前的问题,我已经修改了内核的可变数量的代码。 然而,Gatherv在我的代码实现的方式似乎是不可靠的。 一旦在运行3-4在收集缓冲器的结束序列最终被损坏,它似乎是,由于存储器泄漏。 示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mpi.h>

int main (int argc, char *argv[]) {

MPI_Init(&argc, &argv);
int world_size,*sendarray;
int rank, *rbuf=NULL, count,total_counts=0;
int *displs=NULL,i,*rcounts=NULL;

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);

if(rank==0){
    displs = malloc((world_size+1)*sizeof(int));
    for(int i=1;i<=world_size; i++)displs[i]=0;
    rcounts=malloc(world_size*sizeof(int));

    sendarray=malloc(1*sizeof(int));
    for(int i=0;i<1;i++)sendarray[i]=1111;
    count=1;
}

if(rank!=0){
    int size=rank*2;
    sendarray=malloc(size*sizeof(int));
    for(int i=0;i<size;i++)sendarray[i]=rank;
    count=size;
}

MPI_Barrier(MPI_COMM_WORLD);

MPI_Gather(&count,1,MPI_INT,rcounts,1,MPI_INT,0,MPI_COMM_WORLD);

MPI_Barrier(MPI_COMM_WORLD);

if(rank==0){
    displs[0]=0;
    for(int i=1;i<=world_size; i++){
        for(int j=0; j<i; j++)displs[i]+=rcounts[j];
    }

    total_counts=0;
    for(int i=0;i<world_size;i++)total_counts+=rcounts[i];
    rbuf = malloc(10*sizeof(int));
}

MPI_Gatherv(sendarray, count, MPI_INT, rbuf, rcounts,
            displs, MPI_INT, 0, MPI_COMM_WORLD);

if(rank==0){
    int SIZE=total_counts;
    for(int i=0;i<SIZE;i++)printf("(%d) %d ",i, rbuf[i]);

    free(rbuf);
    free(displs);
    free(rcounts);
}

if(rank!=0)free(sendarray);
MPI_Finalize();

}

为什么会出现这种情况,是有办法解决它?

这一点在我的实际项目更糟。 每个发送缓冲器包含150个双打。 接收缓冲区变得非常脏,有的时候我床上终止的错误,退出代码为1,6或11。

任何人都可以至少重现我的错误?

我的猜测:我分别在每个线程上分配的内存sendarray。 如果我的虚拟机是1对1的硬件,那么,也许就不会有这样的问题。 但我只有2个内核,运行过程4个或更多。 难道是这个原因?

Answer 1:

改变这一行:

rbuf = malloc(10*sizeof(int));

至:

rbuf = malloc(total_counts*sizeof(int));

作为一个方面说明:每个MPI进程存在于自己的进程地址空间,他们不能在eachothers数据踩除了通过通过MPI_XXX功能明确地传递错误的数据,这会导致不确定的行为。



文章来源: MPI_Gatherv memory problems (MPI+C)