gpt4 book ai didi

c - MPI_Send 和 MPI_Recv 开销

转载 作者:太空宇宙 更新时间:2023-11-03 23:57:19 24 4
gpt4 key购买 nike

所以我试图找出在 C 代码中使用 MPI 的处理器之间发送和接收信息的通信开销。

我需要在发送和接收中传递一个缓冲区,但我只想计算两个处理器之间进行通信需要多长时间。

这是我的全部代码:

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 循环时,它按照我想要的方式工作。那么导致无限循环或段错误的 for 循环有什么问题呢?

最佳答案

有两个问题:

1) 代码中没有检查以确保它收到“数据集的大小”。如果您在没有有效命令行选项的情况下启动代码,它将出现段错误,或者根据您的系统,以不可预测的方式继续。

2) 发送和接收中的标签不匹配。标签必须匹配才能成功通信。如果没有匹配的标签,Recv 将永远等待直到找到匹配的发送。并发送等待直到找到匹配的接收。

将 MPI_COMM_WORLD 旁边的 receive 中的 1 更改为 0,代码将正常运行。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com