这是我创建的一个函数,目的是在所有处理器上逐个运行带有参数
func
的函数 inputs
。
这主要是针对println
的订单,但不限于。
编辑:我忘记包含下一个/上一个处理器调用,所以我现在将其嵌入。
function MPI_OneByOne(::Val{my_ID},::Val{Total_Proc},func::Function,inputs...) where {my_ID,Total_Proc}
if !Base.isequal(my_ID,zero(my_ID))
# Wait for previous processor to finish
MPI.recv(comm; source=mod( MPI.Comm_rank(comm)-1, MPI.Comm_size(comm)))
end
println(my_ID," ======================================")
func(inputs...)
if !Base.isequal(my_ID,Total_Proc-one(Total_Proc))
# All but last processor need to push the next one to act
MPI.send(nothing, comm; dest= mod(MPI.Comm_rank(comm)+1, MPI.Comm_size(comm)))
end
MPI.Barrier(comm)
end
这个想法是从第一个过程开始,而其他过程则等待接收。 第一个完成,触发发送到#2。 #2 做这件事,通过发送触发#3,等等。
正如您所料,这并没有按预期工作,并且函数的输出(特别是当使用一些比单个值更长的输入时)不受控制或不受顺序控制。 我做错了什么?