什么时候应该使用MPI_数据类型而不是手动序列化?

什么时候应该使用MPI_数据类型而不是手动序列化?,mpi,Mpi,当我需要MPI_Bcast一个64位整数时,这一切就开始了。由于MPI不知道如何处理它,我做了: template<typename T> inline int BcastObjects(T* pointer, int count, int root, MPI_Comm comm) { return MPI_Bcast(poin

当我需要MPI_Bcast一个64位整数时,这一切就开始了。由于MPI不知道如何处理它,我做了:

template<typename T>
inline int BcastObjects(T* pointer, 
                        int count, 
                        int root, 
                        MPI_Comm comm)
{
    return MPI_Bcast(pointer, 
                     count * sizeof(*pointer), 
                     MPI_BYTE, 
                     root,
                     comm);
}
然后我开始使用BCastObject发送一组结构。我想知道这样做是否可以

有关MPI_数据类型的手册重点介绍了如何使用它,而不是我为什么要使用它。

为什么不使用它


您总是可以使用
MPI\u Byte
或您所拥有的东西来模拟您自己的数据类型;数据类型的东西就在那里,所以你不必这么做。在许多情况下,这要容易得多;如果您想发送有“漏洞”的数据(例如,多维数组的一个片段,结构中有间隙的数据),您可以使用数据类型将其大致映射出来,而您必须手动计算字节字符串,并使用其他类似方法。当然,如果数据结构发生变化,在更高级别描述数据肯定不会那么脆弱。

在64位平台上,您可以使用MPI_LONG_LONG和MPI_UNSIGNED_LONG_LONG_LONG作为64位索引器。@Sergey我不知怎么错过了它。谢谢。功能手册记录了接口和语义,而不是MPI基础知识。在中有一整页(来自“数据类型”一章的第一页)解释了您可能需要派生数据类型的原因。所以答案是,当我要发送的数据结构不连续时,我需要它?我的第二个最佳猜测是将其用于您自己的MPI_Op?您能否定义自己的MPI_Op并将其用于MPI_Reduce?您可能永远都不需要它;您永远不需要集合,但它们使代码更短、更快、更健壮、更清晰。当然,您可以在自己的类型上创建自己的运算符(例如,请参阅此问答),但即使是这样,您也可以使用mpi_字节和计数;毕竟,所有的字节都在线路上。但是,如果您使用MPI数据类型而不是自己重新创建它们,那么您的代码将变得更简单、更短、更不容易出错、更不脆弱。
int64_t i = 0;
BcastObjects(&i, 1, root_rank, some_communicator);