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