根据MPI 2.2标准4.1节:要创建新的数据类型,我们必须定义一个类型映射,它是(类型,位移)对的序列。位移不是是积极的,增加的,也不是明显的。
答案 0 :(得分:1)
如果你发现这是唯一让你感到困惑的事情,那么你比我更聪明。但至于这个特殊的例子 - C联盟就是这样;为什么打字机不允许这样做?
答案 1 :(得分:1)
我开始写评论但是空间不足,所以这里有。首先,此代码编译并运行我可以访问的HP-MPI实现:
#include <mpi.h>
int main(int argc, char* argv[])
{
MPI_Init(&argc, &argv);
int count = 2;
int lengths[] = { 1, 1 };
MPI_Aint disp[] = { 0, 0 };
MPI_Datatype types[] = { MPI_DOUBLE, MPI_CHAR };
MPI_Datatype weird_type;
MPI_Type_struct(count, lengths, disp, types, &weird_type);
MPI_Type_commit(&weird_type);
MPI_Finalize();
return 0;
}
但是,{ (double, 0), (char,0) }
类型映射的行为不会像union一样:如果使用此typemap发送数据,则相同的内存地址将首先解释为double
,然后解释为{{1并且将发送两个值(假设实现不会崩溃)。
我只能想到这种行为的一个似是而非的用例:考虑类型映射char
。使用此类型发送{ (MPI_CHAR, 0), (MPI_BYTE,0) }
变量将在第一种情况下执行表示转换,但不在第二种情况下执行:这样,您可以检查发送方和接收方计算机上的字符编码是否相同。当然还有其他方法可以做到这一点,但仍然有选择。虽然更可能的情况是标准本身并不涉及异国特殊情况。
另外,关于负位移:当我不得不从链接数据结构(例如图表)传递数据时,我实际上使用过这些位移。这不适合胆小的人,但这是我的算法的伪代码:
char
希望你能从那里看到负位移的重要性:不知道各种节点在内存中的位置,所以一些节点完全有可能位于比我们开始遍历图形的位置更早的位置。 / p>