从我在超级计算课上学到的东西,我知道 MPI 是一个通信(和数据传递)接口。
我很困惑,当你在 C ++ 程序中运行一个函数,并希望每个处理器执行一个特定的任务。
例如,质数搜索(在超级计算机中非常流行)。假设我有一个值范围(531-564,某个任意范围),并说我有 50 个进程,我可以对每个数字进行一系列评估。如果 root(进程 0)要检查 531 并知道质数,则我可以使用 8 个进程(1-8)来评估质数状态。如果该数字可被任何数字 2-9 整除,并且余数不为 0,
对于将数据传递给每个进程的 MPI,是否有可能让这些进程执行这些操作?
对我来说最困难的部分是理解,如果我在原始的 C ++ 程序中执行一个动作,发生的进程可以分配在几个不同的进程上,那么在 MPI 中我如何构建这个?或者我的理解是完全错误的?
最大的想法是将数据传递给进程,而不是将函数发送到进程。
每个 MPI 进程都在运行相同的程序,但这并不意味着它们在做同样的事情。不同的进程可以运行代码的不同分支,这取决于进程的 id (或“rank”),实际上是完全独立的。像任何分布式计算一样,参与者确实需要就如何通信达成一致。
MPI 中最基本的策略是分散收集,其中“主”进程(通常是等级为 0 的进程)将在对等方(包括主进程本身)之间平均分配一组工作,让他们都调用分散,对等方将完成工作,然后所有对等方将调用聚集以将结果发送回主。
在您的主要算法示例中,构建一个整数数组,将其“分散”到所有对等端,每个对等端将运行其数组,如果它是素数,则保存 1,如果不是,则“收集”结果以掌握。
作为伪代码:
main():
int x[n], n = 100
MPI_init()
// prepare data on master
if rank == 0:
for i in 1 ... n, x[i] = i
// send data from x on root to local on each process in world
MPI_ter(x, n, int, local, n/k, int, root, world)
for i in 1 ... n/k
result[i] = 1 // assume prime
if 2 divides local[i], result[i] = 0
if 3 divides local[i], result[i] = 0
if 5 divides local[i], result[i] = 0
if 7 divides local[i], result[i] = 0
// gather reults from local on each process in world to x on root
MPI_gather(result, n/k, int, x, n, int, root, world)
// print results
if rank == 0:
for i in 1 ... n, print i if x[i] == 1
MPI_finalize()
有很多细节要填写,如适当的声明,并处理这样的事实,即一些行列将有比其他人更少的元素,使用适当的 C 语法等,但得到他们的权利并不能帮助解释整体情况。
特别重要的是,如果进程 a 向进程 b 调用 MPI_send,那么进程 b 最好从进程 a 调用 MPI_recv。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(68条)