MPI 运行 可以作为 OpenMP 的基于任务的程序吗?
Can MPI run a task-based program as OpenMP?
我只对 OpenMP 和 MPI 之间的区别感兴趣。
MPI 是否也可以像 OpenMP 中的 'task' 那样并行化 while 和递归函数?
如果 MPI 可以 运行 task-based program,那么 reduction on task 也可以吗?
您不应该将 MPI 视为并行化操作:它本质上是基于分布式内存,因此您应该从对数据进行分区开始,然后表达对每个数据子集的操作。在 while
循环的特定情况下,如果每次迭代对应于要操作的不同数据项,MPI 只能对其执行某些操作。
或者将 MPI 程序视为由固定数量的任务组成:MPI 进程。这些“任务”是在您的 MPI 运行 启动时创建的,并且它们一直存在到 运行.
结束
因此:MPI 和 OpenMP 建立在非常不同的模型上。有时您可以在两者之间进行翻译,但通常不能。一个明显的情况是数组上的并行循环:然后 OpenMP 将数据空间划分为线程,而在 MPI 中,您将数据空间划分为进程。
正如@HighPerformanceMark 所说,如果你想要动态任务,你必须在 manager/worker 模型中编程。但是,请注意,这可能涉及移动大量数据,因此不能保证并行加速。
我只对 OpenMP 和 MPI 之间的区别感兴趣。 MPI 是否也可以像 OpenMP 中的 'task' 那样并行化 while 和递归函数? 如果 MPI 可以 运行 task-based program,那么 reduction on task 也可以吗?
您不应该将 MPI 视为并行化操作:它本质上是基于分布式内存,因此您应该从对数据进行分区开始,然后表达对每个数据子集的操作。在 while
循环的特定情况下,如果每次迭代对应于要操作的不同数据项,MPI 只能对其执行某些操作。
或者将 MPI 程序视为由固定数量的任务组成:MPI 进程。这些“任务”是在您的 MPI 运行 启动时创建的,并且它们一直存在到 运行.
结束因此:MPI 和 OpenMP 建立在非常不同的模型上。有时您可以在两者之间进行翻译,但通常不能。一个明显的情况是数组上的并行循环:然后 OpenMP 将数据空间划分为线程,而在 MPI 中,您将数据空间划分为进程。
正如@HighPerformanceMark 所说,如果你想要动态任务,你必须在 manager/worker 模型中编程。但是,请注意,这可能涉及移动大量数据,因此不能保证并行加速。