Parallel processing MPI\u类型\u索引可能会增加通信开销

Parallel processing MPI\u类型\u索引可能会增加通信开销,parallel-processing,mpi,hpc,Parallel Processing,Mpi,Hpc,最近我正在研究实现并行LBM方法。我发现,在执行流部分之前实现MPI_索引,甚至可能会导致额外的通信开销。例如,当我尝试使用MPI_类型_索引来定义新的MPI_类型时,它会从域中复制任意分布的部分或块数相对较小的部分,这可能会导致额外的开销 因此,我会问有经验的并行编程程序员我是否理解正确?对您的问题的回答与往常一样:这取决于。这取决于网络系统是否支持聚集读取(对于传出消息)和分散写入(对于传入消息),以及是否启用了异构支持 当数据在内存中不连续且网络不支持从主存收集的读取时,数据在发送之前必须

最近我正在研究实现并行LBM方法。我发现,在执行流部分之前实现MPI_索引,甚至可能会导致额外的通信开销。例如,当我尝试使用MPI_类型_索引来定义新的MPI_类型时,它会从域中复制任意分布的部分或块数相对较小的部分,这可能会导致额外的开销


因此,我会问有经验的并行编程程序员我是否理解正确?

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

当数据在内存中不连续且网络不支持从主存收集的读取时,数据在发送之前必须打包,因此必须制作额外的副本。当网络不支持分散写入主内存时,将数据解包到非连续区域也是如此

启用异构支持时,必须将所有基本数据项转换为独立于中间计算机的表示形式。转换后的数据进入中间缓冲区,稍后通过网络发送

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

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


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

此外,值得注意的是@Lbj\u x并不是因为MPI\u类型索引(或其他)增加了开销;是内存布局实现了这一点。收集分散在多个页面上的10个副本(比如说)比获得连续存储的10个副本(可能)更昂贵。但如果这是你必须发送的数据,那么它就是这样,你无论如何都要付出代价。MPI数据类型至少可以像您自己编写的任何东西一样有效地完成这项工作。