如何使用 MPI_Type_create_subarray 传递一个字符数组,但字符数非常大,类型为unsigned long long int 如果使用14个等级,则总行(total_nrows)= 31,613,582,882以及每个等级(real_rows3)写入的行数约为2,580,689,006。
unsigned long long int globalsizes[2] = {total_nrows, 365};
unsigned long long int localsizes [2] = {real_rows3, 365};
unsigned long long int starts[2] = {startrow, 0};
MPI_Datatype localarray;
MPI_Type_create_subarray(2, globalsizes, localsizes, starts, MPI_ORDER_C, MPI_CHAR, &localarray);
答案 0 :(得分:1)
长话短说,你不能。
来自MPI标准:
int MPI_Type_create_subarray(int ndims,
const int array_of_sizes[],
const int array_of_subsizes[],
const int array_of_starts[],
int order,
MPI_Datatype oldtype,
MPI_Datatype *newtype)
参数为int
,因此存在2^31-1
的内在限制。
话虽如此,您可以通过使用中间(和更大)数据类型来实现类似的结果。
例如,可以看到2^32 MPI_CHAR
的数组是2^22
2^10 MPI_CHAR
个向量的数组。这显然不适用于任何数字,但这可能对您有所帮助。
另一种选择是使用BigMPI。
基本上,int
(32位)替换为MPI_Count
(64位)。
请记住,BigMPI是不 MPI标准的一部分,因此如果您必须编写可移植代码,则不能选择此选项。