如何将自定义 MPI_Datatype 发送到不同的进程?

假设我在分配给程序的每个 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 的正确方法是什么。谢谢。


注意。

  1. 我知道无需与 MPI_Datatype 交流即可解决上述问题的其他方法。例如,可以传达本地数组大小,并在主进程内部的其他进程中手动重建 MPI_Datatype,然后在子数组的后续通信中使用它。这不是我要找的。​​p>

  2. 我希望传达自定义 MPI_Datatype 本身(如上面的示例所示),而不是数据类型的实例(这是可行的,如上面的示例代码所示) .

xzwilliams 回答:如何将自定义 MPI_Datatype 发送到不同的进程?

首先:您不能发送那样的数据类型。值 MPI_Datatype 不是 MPI_Datatype 类型的值。 (虽然这是一个可爱的想法。)您可以发送构造它的参数,然后在发送类型上重建它。

但是,您可能误解了 MPI 的性质。在您的代码中,工作人员和经理使用相同的数据类型,您有点假设每个人都有相同大小/形状的数据。这与将所有内容聚集在一起的经理不兼容。

如果您正在收集有关管理器进程的数据(通常不是一个好主意:您真的确定需要它吗?)那么贡献进程将数据放在一个小数组中,比如索引 0..99。因此,您可以将它们作为普通的连续缓冲区发送。 “经理”有一个更大的数组,并将所有贡献放在不相交的位置。所以管理器最多需要创建子数组类型来指示接收到的数据在大数组中的位置。

本文链接:https://www.f2er.com/14217.html

大家都在问