MPI有点新,但是我正在查看代码,但似乎没有正确使用MPI_Allreduce()
。
这是代码段(在Fortran中,但其他人应该可以读取)。
do n = 1, ntts_total !ntts_total is some large number
send_buffer(1) = some_array(n) !send_buffer is a size 2 array of doubles
send_buffer(2) = proc_id
!recv_buffer is a size 2 array of doubles
call MPI_Allreduce(send_buffer, recv_buffer, nprocs, MPI_2DOUBLE_PRECISION, MPI_MINLOC, MPI_COMM_WORLD, ierr)
if (proc_id == INT(recv_buffer(2))) then
this%n_tots = this%n_tots + 1
my_id(this%n_tots) = n
end if
end do
他们试图做的是每次循环,每个进程将一些值存储在some_array中,并将处理器ID分别存储为send_buffer
中的第一和第二个元素。然后,他们使用MPI_Allreduce
查找最小元素以及最小元素所在的处理器排名,然后将结果分配给所有处理器。
然后他们进行if检查。
但是我认为在当前状态下,同步已关闭。我认为MPI_barrier()
应该在MPI_Allreduce()
之前和之后调用,如下所示:
call MPI_barrier(MPI_COMM_WORLD, ierr)
!recv_buffer is a size 2 array of doubles
call MPI_Allreduce(send_buffer, recv_buffer, nprocs, MPI_2DOUBLE_PRECISION, MPI_MINLOC, MPI_COMM_WORLD, ierr)
call MPI_barrier(MPI_COMM_WORLD, ierr)
如果前后没有障碍,则每个处理器都不会同步,这可能会导致处理器1从n = 1发送数据,处理器2从n = 2发送数据,而减少操作将在不同的处理器上执行迭代。
我的想法正确吗?