首页 > 解决方案 > 顺序并行 MPI 算法:如何使用 MPI 实现这种行为?

问题描述

我有以下问题,想知道如何在 MPI-Fortran 中实现这一点。

假设我的集群中有 N0 个节点,给定一个间隔 (1,N),我将它分成 N0 个段,用 (i1,i2) 表示,并假设每个 (i1,i2) 的计算时间是某个 T,完成平行。现在,如果我将每个子间隔 (i1,i2) 额外划分为 N0 个较小的子间隔,我们称之为 (a1,a2),在给定时间,我想按顺序处理每个 (i1,i2) 但每个(a1,a2) 并行,(i1,i2) 的计算时间是否为 T/N0,即相对于第一个分区显着减少?如果是这样,我怎样才能在 MPI 中实现这个想法?

感谢您的建议和帮助。

为了更新帖子,我想出了以下示意图。我希望它足够容易理解,在哪里

.

do i = 0, number_machine-1

   call MPI_BARRIER(MPI_COMM_WORLD, ierr)

   start = MPI_Wtime()

   call compute_my_quantity(A, sub_interval(i),
        sub_sub_interval(rank,i))

   end = MPI_Wtime()

   if (rank /= 0) then 
      call SEND_my_quantity(rank, A)
   else 
      do i_prime = 1, number_machine-1
         call RECEV_my_quantity(i_prime, A_sub(i_prime))
      end do
   end if
end do

我得到的是:每个 (a1,a2) 测量的时间仍然与

   start = MPI_Wtime()

   call compute_my_quantity(A, sub_interval(rank))

   end = MPI_Wtime()

   if (rank /= 0) then 
      call SEND_my_quantity(rank, A)
   else 
      do i_prime = 1, number_machine-1
         call RECEV_my_quantity(i_prime, A_sub(i_prime))
      end do
   end if

也许你可以告诉我这个算法在概念上有什么问题,使得 (a1,a2) 所需的时间与 (i1,i2) 相同?

标签: fortranmpi

解决方案


正如我从问题中了解到的那样,

你有一些任务(比如 N)被分成 N0 个段,每个段执行一些 N/N0 个任务。

在策略 1 中,您将其分布在 N0 个(或更多)等级中并并行工作。在策略 2 中,您从 N 个任务中选择一个任务并将该任务分配给 MPI 等级。同样,每个任务都是按顺序执行的。

从理论上讲,策略 1 总是比策略 2 快,因为通信会带来潜在的开销。在策略 2 中,会有很多(比策略 1 多 N0 倍)的通信。所以你的应用程序性能会下降。

理想的方法是使用混合编程模型,在其中您使用 MPI 在节点之间分配任务,并在每个节点中使用一些共享内存范例 (openMP) 来加速执行。基本上,它是您的策略 1 和策略 2 的组合。


推荐阅读