MPI_type_index可能会增加通信开销

时间:2014-07-02 22:49:38

标签: parallel-processing mpi hpc

最近我正致力于实现并行LBM方法。我发现在执行流部分之前实现MPI_index时,它甚至可能导致额外的通信开销。例如,当我尝试使用MPI_type_index定义新的MPI_type时,它会从域中复制某个部分,该部分是任意分布的,或者块编号相对较小,这可能会导致额外的开销。

因此,如果我理解正确,我会问经验丰富的并行编程程序员吗?

1 个答案:

答案 0 :(得分:3)

您的问题的答案与往常一样:取决于。这取决于网络系统是否支持收集的读取(用于传出消息)和分散的写入(用于传入的消息),以及是否启用了异构支持。

当数据在内存中不连续且网络不支持从主内存收集的读取时,数据必须在发送之前打包,因此必须另外复制。当网络不支持分散写入主存储器时,这同样适用于将数据解压缩到非连续区域。

启用异构支持时,必须将所有原始数据项转换为与机器无关的中间表示。转换后的数据进入中间缓冲区,稍后通过网络发送。

详细阐述Jonathan Dursi的评论。 MPI数据类型本身不会产生网络通信开销。它是在开销产生的通信操作之前发生的数据打包和解包。 MPI数据类型基本上是在构造或解构消息时应如何从内存中读取数据或将数据写入内存的配方。通过适当的网络硬件,可以理解收集的读取和分散写入可以对该硬件进行适当编程的MPI实现,可以将MPI数据类型中的指令转换为一组读取或写入向量,然后让网络适配器完成包装和拆包的繁重工作。如果网络不支持此类操作或MPI实现不知道如何将该操作卸载到硬件,则打包必须在软件中进行,并且通常涉及中间缓冲区。那是开销的来源。正如Jonathan Dursi已经指出的那样,MPI中的数据类型packer / unpacker例程经过了极大优化,它们通常尽可能高效地工作(只需看看Open MPI源代码,看看它们在多大程度上进行调优以获得最佳效果缓存利用率)。因此,如果您的算法需要索引数据类型或数据项之间有漏洞的任何其他类型的数据类型,只需构造适当的MPI数据类型并使用它。

支持此类操作的示例网络互连是InfiniBand。每个发送或操作请求都提供有所谓的分散/聚集元素(SGE)列表。我没有深入研究不同的MPI实现,也不知道他们是否能够利用SGE来跳过软件打包阶段。尽管如此,这可能不会很好地解决大量分散的数据项目。

另请注意,对于连续数据类型,数据元素之间没有填充以及此类数据类型的数组,不需要打包或解包。在这种情况下,整个内存块按原样发送到另一个进程(除非系统是异构的)。