fortran - 即使某些等级不参与,MPI_IBcast 是否也能保证发送
问题描述
我正在创建一个 MPI 程序,我试图在它们完成计算后立即将相同的数据发送到所有进程。这些进程的计算时间可能有很大差异,所以我不希望一个处理器等待另一个处理器。
保证根进程总是先发送。
我知道 MPI_Bcast 充当 Barries,所以我尝试了 MPI_IBcast:
program main
use mpi
implicit none
integer rank, nprcos, ierror, a(10), req
call MPI_INIT(ierror)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nprcos, ierror)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
a = rank
if(rank /= 2) then
call MPI_IBCAST(a, size(a), MPI_INTEGER, 0, MPI_COMM_WORLD, req, ierror)
call MPI_WAIT(req, MPI_STATUS_IGNORE, IERROR)
endif
write (*,*) 'Hello World from process: ', rank, 'of ', nprcos, "a = ", a(1)
call MPI_FINALIZE(ierror)
end program main
从我的实验看来,无论哪个等级“抵制” MPI_IBcast,它总是适用于所有其他等级:
> $ mpifort test.f90 && mpiexec --mca btl tcp,self -np 4 ./a.out
Hello World from process: 2 of 4 a = 2
Hello World from process: 1 of 4 a = 0
Hello World from process: 0 of 4 a = 0
Hello World from process: 3 of 4 a = 0
这是有保证的行为还是仅特定于我的 OpenMPI 实现?我还能如何实现这一点?我只能想到 MPI_Isends 上的循环。
解决方案
不,这不能保证,传播者中的所有级别都应该参与。在 MPI 中,这是集体通信的定义。
推荐阅读
- javascript - e.slice 不是函数
- druid - Druid - 防止在每次 CSV 摄取时创建新分区
- scala - Spark 与 Scala:通过在每个可能对上执行函数来计算表
- laravel - Laravel Sanctum 在不创建新令牌的情况下检索 PlainTextToken
- javascript - 是否可以在没有网络访问和服务器的情况下在本地使用反应?
- python - 将集合列表转换为字典
- python - 计算没有 sklearn 的机器学习模型的准确率
- c - 在 C 链表中从高到低对数字进行排序
- html - 显示超出下拉 div 的图像
- c# - 使用取消按钮时的 ASP.NET MVC 路由