fortran - 顺序并行 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 中实现这个想法?
感谢您的建议和帮助。
为了更新帖子,我想出了以下示意图。我希望它足够容易理解,在哪里
- i : 子区间的索引 (i1,i2)
- 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) 相同?
解决方案
正如我从问题中了解到的那样,
你有一些任务(比如 N)被分成 N0 个段,每个段执行一些 N/N0 个任务。
在策略 1 中,您将其分布在 N0 个(或更多)等级中并并行工作。在策略 2 中,您从 N 个任务中选择一个任务并将该任务分配给 MPI 等级。同样,每个任务都是按顺序执行的。
从理论上讲,策略 1 总是比策略 2 快,因为通信会带来潜在的开销。在策略 2 中,会有很多(比策略 1 多 N0 倍)的通信。所以你的应用程序性能会下降。
理想的方法是使用混合编程模型,在其中您使用 MPI 在节点之间分配任务,并在每个节点中使用一些共享内存范例 (openMP) 来加速执行。基本上,它是您的策略 1 和策略 2 的组合。
推荐阅读
- android - 如何减少页面之间跳转的延迟(片段/活动)
- javascript - 如何在条件渲染中预渲染 React 组件?
- react-native - 反应本机导航抽屉项目活动背景颜色
- java - 应该使用哪种类型的锁定来确保一次 1 个事务?
- powershell - 如何从计算机中自动移动计算机对象
- spring-cloud-dataflow - 如何将部署属性从 Stream - Spring Cloud Dataflow 处理器传递到 Task Launcher Dataflow 到组合任务和子任务
- c++ - 如何在 MacOS 上的 C/C++ 中模拟 cmd+v(粘贴)事件?
- typescript - 使用通用联合类型缩小类型
- python - Python:如何最好地更快地发现常见索引?
- php - 我正在尝试将数据和文件上传到数据库 我的文件已上传到文件夹但上传到数据库时出错