【发布时间】:2013-07-01 15:31:25
【问题描述】:
我正在尝试在 EPOS 操作系统中实现 MPI 协议。好吧,其实我不明白如何实现 MPI_Comm。它被定义为“MPI 用来确定通信中涉及哪些进程的基本对象”。在某些实现中 我在互联网上发现它被实现为 typedef int MPI_Comm,但我怎么知道 使用 int MPI_Comm 的通信涉及哪些进程?任何想法?
谢谢。
【问题讨论】:
我正在尝试在 EPOS 操作系统中实现 MPI 协议。好吧,其实我不明白如何实现 MPI_Comm。它被定义为“MPI 用来确定通信中涉及哪些进程的基本对象”。在某些实现中 我在互联网上发现它被实现为 typedef int MPI_Comm,但我怎么知道 使用 int MPI_Comm 的通信涉及哪些进程?任何想法?
谢谢。
【问题讨论】:
当实现为 MPI_Comm 使用 int 时,它实际上将它用作对内部数组的引用,在该数组中它在内部跟踪通信器的所有必要信息。
【讨论】:
好像有两种方法,几乎是一样的。
第一个是typedef int MPI_Comm,并使用该值作为索引到一些维护实际信息的内部数据结构中。
第二个是typedef struct comm_info* MPI_Comm,其中通信器(或任何其他 MPI 类型)是指向内部结构的直接指针。 OpenMPI 采用这种方法。
使用 int 的优点是,只要内部数据结构是同步的,在所有处理器上使用相同的索引可能会更容易。
但是,既然 OpenMPI 和 MPICH 已经做了这么多并且是开源的,为什么还要重新发明轮子呢?特别是 MPICH 许可证非常宽松。如此之多,以至于很多供应商都在其上建立了自己的商业 MPI 库。查看their license。
【讨论】:
MPI_COMM_WORLD这样的内置通信器,用户必须首先使用MPI_Comm_create创建通信器。你可以把你的初始化放在那里。请记住,让该通信器中的所有处理器在“相同”时间使用相同参数调用MPI_Comm_create 也取决于用户。这应该允许您通过让每个处理器提出相同的结构'x'来初始化结构而不传递任何消息。