MPI_Isend和MPI_Wait会导致大矩阵的分段错误

MPI_Isend和MPI_Wait会导致大矩阵的分段错误,mpi,large-data,Mpi,Large Data,代码只是为矩阵分配内存,并使用非阻塞过程将矩阵从秩0发送到秩1。它适用于较小的矩阵大小(1024)。但它会导致较大的分段错误(16384); 下面是代码 double **A; int i,j,size,rankid,rankall; size = 16384; MPI_Request reqr,reqs; MPI_Status star,stas; MPI_Init(&argc, &argv); MPI_Comm_size

代码只是为矩阵分配内存,并使用非阻塞过程将矩阵从秩0发送到秩1。它适用于较小的矩阵大小(1024)。但它会导致较大的分段错误(16384); 下面是代码

    double **A;
    int i,j,size,rankid,rankall;
    size = 16384;
    MPI_Request reqr,reqs;
    MPI_Status star,stas;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD,&rankall);
    MPI_Comm_rank(MPI_COMM_WORLD,&rankid);
    A = (double**)calloc(size,sizeof(double*));
    for(i=0;i<size;i++){
            A[i] = (double *)calloc(size,sizeof(double));
            for(j=0;j<size;j++){
                    if(rankid ==0){
                            A[i][j] = 1;
                    }
            }
    }
    if(rankid ==0){
            MPI_Isend(&A[0][0],size*size,MPI_DOUBLE,1,1,MPI_COMM_WORLD,&reqs);
            MPI_Wait(&reqs,&stas);
    }
    if(rankid ==1){
            MPI_Irecv(&A[0][0],size*size,MPI_DOUBLE,0,1,MPI_COMM_WORLD,&reqr);
            MPI_Wait(&reqr,&star);
    }

    MPI_Finalize();

您是否尝试过检查以确保calloc调用中的指针不为NULL?每个列组为一个16k x 16k矩阵分配2 GB的内存,您可能会耗尽内存(我不知道您的系统是什么)。这在C“多维数组”和MPI中经常出现。(例如,见我的回答——但还有许多其他例子)。问题是您试图从/to
&A[0][0]
发送/接收
size*size
MPI\u DOUBLE
s,但分配的内存实际上不太可能是这样布置的。您必须在一个块中分配大小*大小的两倍,然后将指针分配到其中-这将为您提供通常需要的数字代码内存布局。
#0 0x00007FFFF7947093 in ?? () From /1ib/x86_64-1inux-gnu/libc.so.6
#1 0x000000000043a5B0 in MPID_Segment_contig_m2m ()
#2 0x00000000004322cb in MPID_Segment_manipulate ()
#3 0x000000000043a?Ba in MPID_Segment_pack ()
#4 0x000000000042BB99 in lmt_shm_send_progress ()
#5 0x000000000042?e1F in MPID_nem_lmt_shm_start_send ()
#6 0x0000000000425aFF in pkt_CTS_handler ()
#? 0x000000000041Fb52 in MPIDI_CH3I_Progress ()
#8 0x0000000000405Bc1 in MPIR_Wait_impl ()
#9 0x000000000040594e in PMPI_Wait ()
#10 0x0000000000402ea5 in main (argc=1,argv=0x7fffffffe4a8)
at ./simpletest.c:26