C 什么';这是mpi派生数据类型的优点
让我们假设我的3d procs网格需要与所有最近的邻居通信2d阵列。我可以简单地将2d数组存储为1d数组,以使数据连续并使用send/recv。如果改用Mpi_type_vector(例如,Mpi_类型_vector),我是否可以期望任何性能优势?基本上,您可以手动将数据打包/解包到连续缓冲区或使用派生数据类型C 什么';这是mpi派生数据类型的优点,c,mpi,C,Mpi,让我们假设我的3d procs网格需要与所有最近的邻居通信2d阵列。我可以简单地将2d数组存储为1d数组,以使数据连续并使用send/recv。如果改用Mpi_type_vector(例如,Mpi_类型_vector),我是否可以期望任何性能优势?基本上,您可以手动将数据打包/解包到连续缓冲区或使用派生数据类型 手动打包/解包需要更多的代码和内存,但打包/解包时间可以通过OpenMP来缩短 派生数据类型需要更少的代码、更少的内存,但数据通常在后台打包/解包,这通常由单个线程执行 底线是,使用
- 手动打包/解包需要更多的代码和内存,但打包/解包时间可以通过
来缩短OpenMP
- 派生数据类型需要更少的代码、更少的内存,但数据通常在后台打包/解包,这通常由单个线程执行
底线是,使用派生数据类型可以节省将数据复制到缓冲区或从缓冲区复制数据的时间,但可能并不总是最快的选择。刚刚在Cray xe6上运行了几个基准测试,使用派生数据类型的速度似乎是前者的10倍左右。我想有一些优化正在进行,但我不知道它可能是什么。另一方面,在我的本地机器上,使用mpi派生的数据类型会导致更大的通信时间—非常好的反馈!引擎盖下的打包/解包可以是多线程的,和/或硬件可以支持发送/接收非连续缓冲区。