因此,我试图找出使用C代码中的MPI在处理器之间发送和接收信息的通信开销。
我需要在发送和接收中都传递一个缓冲区,但我要做的只是计算两个处理器之间进行n次通信所需的时间。
这是我的全部代码:

main(int argc, char** argv){

int n;
int rank;
int time;
int i;
MPI_Status status;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if(rank == 0){
    n = atoi(argv[1]);
    printf("Size of data set = %d\n", n);
}

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

for(i = 0; i < n; i++){
    if(rank == 0){
        MPI_Send(&n, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
    }

    else{
        MPI_Recv(&n, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
    }
}

MPI_Barrier(MPI_COMM_WORLD);

time = clock();
printf("Time: %d\n", time);

MPI_Finalize();
}

我做了一些测试,发现当我取出for循环时,它的工作方式是我想要的那么,导致无限循环或seg故障的for循环有什么问题呢?

最佳答案

有两个问题:
1)没有签入代码以确保它接收到“数据集大小”如果您在没有有效命令行选项的情况下启动代码,它将segfault,或者根据您的系统,以不可预知的方式继续。
2)发送和接收中的标记不匹配标记必须匹配才能成功通信如果没有匹配的标记,Recv将永远等待,直到找到匹配的发送send等待找到匹配的接收。
将MPI通信世界旁边的receive中的1更改为0,代码将正常运行。

关于c - MPI_Send和MPI_Recv开销,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2394448/

10-11 19:35