arm*_*ndo 2 multithreading mpi openmp openmpi
这篇文章与之前将线程绑定到某些 MPI 进程相关。在这里,有人询问如何为 MPI 等级分配不同数量的 OpenMP 线程。一种可能性如下
$ mpiexec <global parameters>
-n n1 <local parameters> executable_1 <args1> :
-n n2 <local parameters> executable_2 <args2> :
...
-n nk <local parameters> executable_k <argsk>
Run Code Online (Sandbox Code Playgroud)
我不知道独立实例 executable_1、executable_2、...、executable_k 是如何相互通信的。我的意思是,如果在执行期间的某个时刻他们需要交换数据,他们是否使用内部通信器(在实例之间)和内部通信器(在同一实例中,例如可执行文件_1)?
谢谢。
作为该命令的结果启动的所有进程形成单个 MIMD/MPMD MPI 作业,即它们共享同一个世界通信器。第一n1排在跑executable_1,后面的n2排在跑executable_2,以此类推。
rank | executable
----------------------------------------+---------------
0 .. n1-1 | executable_1
n1 .. n1+n2-1 | executable_2
n1+n2 .. n1+n2+n3-1 | executable_3
.... | ....
n1+n2+n3+..+n(k-1) .. n1+n2+n3+..+nk-1 | executable_k
Run Code Online (Sandbox Code Playgroud)
通信只是通过在 中发送消息而发生MPI_COMM_WORLD。单独的可执行文件不会自动形成自己的通信器组。这就是 MPMD 与使用开始子作业的区别MPI_Comm_spawn- 子作业有自己的世界通信器,并且使用内部通信器与他们交谈,而 MIMD/MPMD 作业中的单独子作业则没有。
排名仍然可以通过查询 的MPI_APPNUM属性来找出它属于哪个应用程序上下文MPI_COMM_WORLD。:通过简单地使用appnum值作为颜色执行拆分,可以为每个上下文创建单独的子通信器(不同的上下文是由 分隔的命令):
rank | executable
----------------------------------------+---------------
0 .. n1-1 | executable_1
n1 .. n1+n2-1 | executable_2
n1+n2 .. n1+n2+n3-1 | executable_3
.... | ....
n1+n2+n3+..+n(k-1) .. n1+n2+n3+..+nk-1 | executable_k
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
554 次 |
| 最近记录: |