进行强制类型转换并不是解决方案,因为它只会截断长的计数。这里有两个障碍需要克服-一个容易,一个困难。
容易的障碍是计数参数的 int
类型。你可以通过创建一个更小的连续类型,并将数据作为新数据类型的倍数发送来解决这个问题。以下是一个示例代码:
// Data to send
int data[1000];
// Create a contiguous datatype of 100 ints
MPI_Datatype dt100;
MPI_Type_contiguous(100, MPI_INT, &dt100);
MPI_Type_commit(&dt100);
// Send the data as 10 elements of the new type
MPI_Send(data, 10, dt100, ...);
MPI_Type_contiguous
的count
参数是int
类型,使用此技术可以发送多达(231-1)2 = (262 - 232 + 1)个元素。如果这还不够,您可以从dt100
数据类型创建一个新的连续数据类型,例如:
// Create a contiguous datatype of 100 dt100's (effectively 100x100 elements)
MPI_Datatype dt10000;
MPI_Type_contiguous(100, dt100, &dt10000);
MPI_Type_commit(&dt10000);
如果您的原始数据大小不是新数据类型大小的倍数,您可以创建一个结构数据类型,其第一个元素是连续数据类型的
int(data_size / cont_type_length)
个元素的数组,第二个元素是基本数据类型的
datasize % cont_type_length
个元素的数组。以下是示例:
int data[260];
MPI_Datatype dt260;
int blklens[2];
MPI_Datatype oldtypes[2];
MPI_Aint offsets[2];
blklens[0] = 2;
offsets[0] = 0;
oldtypes[0] = dt100;
blklens[1] = 60;
offsets[1] = blklens[0] * 100L * sizeof(int);
oldtypes[1] = MPI_INT;
MPI_Type_create_struct(2, blklens, offsets, oldtypes, &dt260);
MPI_Type_commit(&dt260);
MPI_Send(data, 1, dt260, ...);
MPI_Aint
是一个可以容纳偏移量的整数,它比int
在LP64系统上能够表示更大的偏移量。请注意接收方必须构建相同的数据类型,并在MPI_Recv
中类似地使用它。然而,接收任意非整数数量的连续数据类型有些困难。
这是一个简单的障碍。不那么简单的障碍出现在MPI实现内部不使用长计数的情况下。在这种情况下,MPI通常会崩溃或只发送部分数据,或者可能会发生奇怪的事情。即使没有构造特殊的数据类型,这样的MPI实现也可能会崩溃,只需将类型为MPI_INT
的INT_MAX
个元素发送即可,因为总消息大小将是(231 - 1) * 4 = 233 - 4。如果是这种情况,你唯一的逃脱方式是手动分割消息并在循环中发送/接收。