mpi在c中如何扩展MPI_Type_create_subarray的使用?

时间:2018-02-23 15:31:42

标签: c mpi large-data hpc

如何使用 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);

1 个答案:

答案 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标准的一部分,因此如果您必须编写可移植代码,则不能选择此选项。