Memcpy argument memory ranges overlap with MPICH2 (SOLVED) |
- Date: 2017/05/21 22:11
- Name: Kylin
- Dear all
last night, I found the update of new version of gcc-7+mpich may invoke the memcpy error during the mpi communication. I found it was attributed to the the self-to-self memory copy with the pointer to the same memory range. You could test the following code:
void MPI_Isendrecv_self() { char greeting[MAX_STRING]; MPI_Request req; int oldrank,oldsize; MPI_Comm_rank(MPI_COMM_WORLD, &oldrank); MPI_Comm_size(MPI_COMM_WORLD, &oldsize); if(oldrank==0){ sprintf( greeting , "old rank = %d old size = %d\n" , oldrank , oldsize); MPI_Isend(greeting,strlen(greeting)+1,MPI_CHAR,0,0,MPI_COMM_WORLD,&req); printf("send has done\n"); MPI_Recv(greeting,MAX_STRING,MPI_CHAR,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE); printf("%s\n",greeting); } }
The above function may failed in certain version of mpich2 but passed in open-mpi which is the compilation environment for openmx. But if you still want to do it with mpich or encounter the similar problem, (e.g. try Cr2.dat file in input_example), you could try to modify the code with following principle (skip the self-to-self mpi communication):
========= Eigen_PHH.c (Line 599) ============= for (ID=0; ID<nump; ID++){ IDS = (myid + ID) % nump + ID0; if(IDS == myid) continue; MPI_Isend(&a1d[2*k0-1], 2*num0, MPI_DOUBLE, IDS, tag, MPI_Current_Comm_WD, &request_send[IDS-ID0]); }
/* receiving */
for (ID=0; ID<nump; ID++){ IDR = (myid - ID + nump) % nump + ID0; if(IDR == myid) continue; num1 = ie2[IDR] - is2[IDR] + 2; k1 = is2[IDR] + (IDR - ID0); MPI_Irecv(&a1d[2*k1-1], 2*num1, MPI_DOUBLE, IDR, tag, MPI_Current_Comm_WD, &request_recv[IDR-ID0]); }
/* waitall */ request_recv[myid-ID0] = MPI_REQUEST_NULL; request_send[myid-ID0]= MPI_REQUEST_NULL;
MPI_Waitall(nump,request_recv,stat_send); MPI_Waitall(nump,request_send,stat_send); ========= End of Eigen_PHH.c ============= by adding "continue" and " MPI_REQUEST_NULL" command into Eigen_PHH.c and Eigen_PReHH.c, you may solve this problem.
Cheers Kylin
| |