MPI_Allreduce无法正确同步

时间:2019-05-25 17:49:00

标签: parallel-processing synchronization mpi distributed-computing reduce

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发送数据,而减少操作将在不同的处理器上执行迭代。

我的想法正确吗?

0 个答案:

没有答案