C++ MPI_Sendrecv冻结

C++ MPI_Sendrecv冻结,c++,runtime,mpi,C++,Runtime,Mpi,我试图演示我能想到的MPI_Sendrecv最简单的用法,即在两个MPI进程之间交换整数。但是,当我运行下面的代码时,它只是挂起MPI_Sendrecv调用,没有进一步的操作。有人能帮忙吗 #include <stdio.h> #include <mpi.h> int main(int argc, char *argv[]){ int rank; int numProcesses; int destinationProcess; int

我试图演示我能想到的MPI_Sendrecv最简单的用法,即在两个MPI进程之间交换整数。但是,当我运行下面的代码时,它只是挂起MPI_Sendrecv调用,没有进一步的操作。有人能帮忙吗

#include <stdio.h>
#include <mpi.h>

int main(int argc, char *argv[]){

    int rank;
    int numProcesses;
    int destinationProcess;
    int sourceProcess;
    int sendInt;
    int receiveInt;
    MPI_Status status;

    const int DEFAULT_INT = -9;

    /*Start MPI environment */
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &numProcesses);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    /* Abort if not exactly 2 processes */
    if(numProcesses != 2){
        std::cout << "This application is meant to be run with 2 processes." << std::endl;
        MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
    }

    /* Establish sending and receiving ranks */
    sendInt = rank;
    receiveInt = DEFAULT_INT;
    if(rank == 0){
        destinationProcess = 1;
        sourceProcess = rank;
    } else {
        destinationProcess = 0;
        sourceProcess = rank;
    }

    /* Display a message containing relevant info prior to MPI_Sendrecv call*/
    std::cout << "My rank is: " << rank << std::endl;
    std::cout << "My receiveInt is: " << receiveInt << std::endl;
    std::cout << "My sendInt is:" << sendInt << std::endl;
    std::cout << "Carrying out MPI_Sendrecv" << std::endl;

    MPI_Sendrecv(&sendInt, 1, MPI_INT, destinationProcess, 0 , &receiveInt, 1, MPI_INT, sourceProcess, 0, MPI_COMM_WORLD, &status);

    /* Display a message containing relevant info prior to MPI_Sendrecv call*/
    std::cout <<" MPI_Sendrecv carried out." << std::endl;
    std::cout << "My receiveInt is: " << receiveInt << std::endl;
    std::cout << "My sendInt is:" << sendInt << std::endl;


    MPI_Finalize();
}
#包括
#包括
int main(int argc,char*argv[]){
整数秩;
整数进程;
目的地进程;
int-sourceProcess;
int sendInt;
接受;
MPI_状态;
const int DEFAULT_int=-9;
/*启动MPI环境*/
MPI_Init(&argc,&argv);
MPI_Comm_大小(MPI_Comm_WORLD和numProcesses);
MPI通信等级(MPI通信世界和等级);
/*如果不是2个进程,则中止*/
if(numProcesses!=2){

std::cout您的程序无法编译…您应该从同一进程发送和接收
destinationProcess
。但是,您对
MPI\u Sendrecv()的调用
发送到
destinationProcess
好的,但需要从自身接收!嗨,Gilles,感谢您的响应。我希望进程秩0向进程秩1发送一个整数,反之亦然。当我在MPI\u Sendrecv调用之前添加一个std::cout语句时,我可以确认此代码不会告诉系统希望从自身接收。我还测试了在MPI_Sendrecv调用中交换sourceProcess和destinationProcess,但没有任何区别。@VeryLargeDog,@Gilles是正确的。例如,您希望秩0发送到秩1并从秩1接收。您想要的是
destinationProcess=sourceProcess=!rank
。您拥有的是
destinationProcess=!rank
sourceProcess=rank
Gilles和@ptb谢谢!这解决了我的问题!我按照ptb的解决方案设置了它,效果非常好。这不是我想象的工作方式,这确实帮助了我。