如果您不使用MPI_COMM_WORLD,可以给我一些例子吗?
谢谢!
答案 0 :(得分:4)
我可以想到两种情况:当你编写多线程代码或库时。
原因是MPI通信器是消息匹配上下文的一部分。如果您在来自库的MPI调用中使用MPI_COMM_WORLD
,并且还使用用户代码,则可能会匹配错误的消息。在库代码中使用特殊标记很脆弱,因为用户代码可能使用相同的标记。单独建立一个沟通者要容易得多。
多线程代码的问题是相同的 - 消息匹配,除了它有更多机会出错。例如,如果在多线程代码中使用集合调用,则不再使用标记来区分它们,并且将导致未定义的行为。
最后,删除对MPI_COMM_WORLD的依赖可以使您的代码更加模块化。例如,假设您为某些计算编写了一个类。稍后您可能希望将此类包含在另一个程序中,但仅对节点的子集执行计算。如果类构造函数为通信器提供了一个参数MPI_Comm_dup
s,并使用它 - 集成很容易。如果MPI_COMM_WORLD
被硬编码,那么一些重构将是有序的。
特别是在C ++中,您可能会在程序中封装程序的独立部分。将它们视为迷你库并使它们彼此独立可能是有益的,因此使用它们的代码不必担心组合可能如何起作用。