MPI_测试上的信号11(分段故障)
我在以下代码中收到MPI_测试的分段错误。该代码包括一个发送方进程和一个接收方进程。发送方进程使用非阻塞发送将整数值发送到接收方进程1000000次。这只是一个测试代码。我在发送方进程的MPI_测试中收到一个分段错误,无法找出原因MPI_测试上的信号11(分段故障),mpi,openmpi,Mpi,Openmpi,我在以下代码中收到MPI_测试的分段错误。该代码包括一个发送方进程和一个接收方进程。发送方进程使用非阻塞发送将整数值发送到接收方进程1000000次。这只是一个测试代码。我在发送方进程的MPI_测试中收到一个分段错误,无法找出原因 int main(int argc, char* argv[]){ MPI_Init(&argc,&argv); int rank,nodes; int i,j; MPI_Status stat; int siz
int main(int argc, char* argv[]){
MPI_Init(&argc,&argv);
int rank,nodes;
int i,j;
MPI_Status stat;
int size,wait;
int msgs = atoi(argv[1]);
MPI_Comm_size(MPI_COMM_WORLD, &nodes);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Request req[msgs][nodes-1],req1;
if(rank==0){
size=2;
for(i=0;i<msgs;i++){
for(j=1;j<nodes;j++){
MPI_Isend(&size,1,MPI_INT,
j,0,MPI_COMM_WORLD,&(req[i][j-1]));
}
}
wait = 1;
i=0,j=0;
while(wait){
printf("at i=%d j=%d\n",i,j);
MPI_Test(&req[i][j], &wait, &stat);
wait = 1-wait;
if(!wait){
j++;
if(j==nodes-1){
j=0;
i++;
wait=1;
}
else{
wait=1;
}
if(i==msgs){
wait=0;
}
}
}
printf("Finished\n");
}
else{
for(i=0;i<msgs;i++){
MPI_Irecv (&size,1,MPI_INT,0,0,MPI_COMM_WORLD,&req1);
wait = 1;
while(wait){
MPI_Test(&req1, &wait, &stat);
wait = 1-wait;
}
if(size!=2){
printf("Received size=%d rank=%d\n",size,rank);
}
size=0;
}
printf("Finished rank=%d\n",rank);
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
}
然后给出分割错误
mpirun noticed that process rank 0 with PID 4576 exited on signal 11 (Segmentation fault).
这是一个典型的缓冲区溢出问题。在所有
malloc()
调用中,sizeof
的参数都是错误的。它应该是MPI\u状态
,而不是MPI\u测试
@hristoliev我已经编辑了我的代码。这是一个错误,但分段错误仍然存在。您的代码在技术上是错误的。您正在发布msgs*(nodes-1)
非阻塞发送,但您只存储并等待最后一个请求。这不是应该如何使用非阻塞操作。您必须存储非阻塞操作返回的每个请求,然后等待、测试它直到它完成,或者使用MPI\u request\u free()
释放它。通常不建议使用最后一种方法,因为在调用MPI_Finalize()
@hristoliev之前,您必须确保所有挂起的操作都已完成。我已按照您的建议合并了更改,但仍然存在分段错误。文件openmpi/lib/openmpi/mca\u btl\u vader中出现分段错误。因此在函数vader\u prepare\u src()中出现分段错误。可能是在等待非阻塞操作完成之前启动了太多非阻塞操作。由于每个未完成的请求都占用库中的某些资源,因此有一个实际的限制,这是一个典型的缓冲区溢出问题。在所有malloc()
调用中,sizeof
的参数都是错误的。它应该是MPI\u状态
,而不是MPI\u测试
@hristoliev我已经编辑了我的代码。这是一个错误,但分段错误仍然存在。您的代码在技术上是错误的。您正在发布msgs*(nodes-1)
非阻塞发送,但您只存储并等待最后一个请求。这不是应该如何使用非阻塞操作。您必须存储非阻塞操作返回的每个请求,然后等待、测试它直到它完成,或者使用MPI\u request\u free()
释放它。通常不建议使用最后一种方法,因为在调用MPI_Finalize()
@hristoliev之前,您必须确保所有挂起的操作都已完成。我已按照您的建议合并了更改,但仍然存在分段错误。文件openmpi/lib/openmpi/mca\u btl\u vader中出现分段错误。因此在函数vader\u prepare\u src()中出现分段错误。可能是在等待非阻塞操作完成之前启动了太多非阻塞操作。由于每个未完成的请求都会占用图书馆中的某些资源,因此存在实际限制。
mpirun noticed that process rank 0 with PID 4576 exited on signal 11 (Segmentation fault).