假设我在分配给程序的每个 MPI 进程上为不同大小的子数组创建自定义 MPI_Datatype
。现在我希望将这些子数组发送到主进程,并将它们逐块组装成一个更大的数组。主进程不知道其他进程上的各个数据类型(由本地大小定义)。因此,我可能会天真地尝试通过以下方式将这些自定义数据类型发送到主进程。
MPI_Datatype localarr_type;
MPI_Type_create_subarray( NDIMS,array_size,local_size,box_corner,MPI_ORDER_C,MPI_FLOAT,&localarr_type );
MPI_Type_Commit(&localarr_type);
if (rank == master)
{
for (int id = 1; id < nprocs; ++id)
{
MPI_Recv( &localarr_type,1,MPI_Datatype,id,tag1[id],comm_cart,MPI_STATUS_IGNORE );
MPI_Recv( big_array,localarray_type,tag2[id],MPI_STATUS_IGNORE );
}
}
else
{
MPI_Send( &localarr_type,master,tag1[rank],comm_cart );
MPI_Send( local_box,localarr_type,tag2[rank],comm_cart );
}
然而,这会导致编译错误,其中包含来自 GNU 和 CLANG 编译器的以下错误消息,以及来自英特尔编译器的后一条错误消息。
/* GNU OR CLANG COMPILER */
error: unexpected type name 'MPI_Datatype': expected expression
/* INTEL COMPILER */
error: type name is not allowed
这意味着要么 (1) 我试图以错误的方式将自定义 MPI_Datatype
发送到不同的进程,要么 (2) 这根本不可能。我想知道它是哪个,如果是 (1),我想知道传达自定义 MPI_Datatype
的正确方法是什么。谢谢。
注意。
我知道无需与
MPI_Datatype
交流即可解决上述问题的其他方法。例如,可以传达本地数组大小,并在主进程内部的其他进程中手动重建MPI_Datatype
,然后在子数组的后续通信中使用它。这不是我要找的。p>-
我希望传达自定义
MPI_Datatype
本身(如上面的示例所示),而不是数据类型的实例(这是可行的,如上面的示例代码所示) .