【发布时间】:2020-11-24 10:04:10
【问题描述】:
我有以下问题,想知道如何在 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 中实现这个想法?
感谢您的建议和帮助。
为了更新帖子,我提出了以下示意图。我希望它足够容易理解,在哪里
- i : 子区间的索引 (i1,i2)
- rank:这是当前节点的rank
- sub_sub_interval(rank, i):包含区间 (i1,i2) 的所有子区间 (a1,a2) 的变量。
.
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) 相同?
【问题讨论】:
-
如果我理解正确(我可能没有正确理解),您的问题可以改写为:将问题分解为许多小块以便分发到进程是比解决方案更快的途径将其分解为更少的大包裹?现成的答复将是:否。尽量减少您的程序所进行的通信量。
-
请记住,阿姆达尔定律为 any 并行程序设置了限制。对于涉及 MPI 的特定情况,您还需要考虑等级之间通信所需的时间。
-
是的,你是对的。我也注意到与我上面最初的帖子不同的算法。无论如何,与我的顺序代码相比,我确实使用 12 个节点及时获得了 10 倍。所以这是令人鼓舞的。最初,我确实天真地假设与您的问题相反。这导致上述组织效率低下。