MPI_测试上的信号11(分段故障)

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

我在以下代码中收到MPI_测试的分段错误。该代码包括一个发送方进程和一个接收方进程。发送方进程使用非阻塞发送将整数值发送到接收方进程1000000次。这只是一个测试代码。我在发送方进程的MPI_测试中收到一个分段错误,无法找出原因

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).