【问题标题】:MPI send and receive struct of structsMPI 发送和接收结构体
【发布时间】:2011-07-04 20:45:58
【问题描述】:

如何通过 MPI 发送和接收这种类型的结构?

struct controlPoint{
    int hour,minute,second,x,y,z;
};

struct flight{
    int flightNum, controlNum;
    vector<controlPoint> point;
};

vector<flight> flights;

示例代码会很有帮助

【问题讨论】:

    标签: c++ c mpi


    【解决方案1】:

    您需要调用user-defined datatypes 的魔力。首先,为controlPoint 定义一个MPI_Contiguous 数据类型:我们称之为cp_type。接下来,您需要一个MPI_Struct 来代表flight,我们将其称为flight_type。这有点棘手,因为您无法通过 MPI 传递 vector(没有来自例如 Bost 的外部帮助)。幸运的是,您实际上并不需要:vector 保证连续存储,就像数组一样。因此,您的 MPI_Struct 将由 2 个块组成:第一个块有两个偏移量为 0 的整数(flightNumcontrolNum),第二个块有 point.size()cp_types,偏移量为 @ 987654334@。这样,您只发送来自vector 的数据,而不发送其实现细节。在此之后,您可以将结构作为 flight_type 的单个元素发送。

    接收几乎是微不足道的:只需定义与上述相同的 MPI 数据类型,并将您的数据作为该类型的单个副本接收。但是请注意,您接收到的 flight 结构将需要在其 point 向量中有足够的空间来接收所有内容。您可以在定义 MPI 数据类型之前只resize() 它:这样,将分配足够的空间,并且在接收期间将覆盖值。

    【讨论】:

    • MPI_datatype = cp_type, flight_type; MPI_Type_contiguous(6, MPI_INT, &amp;cp_type); MPI_Type_struct(2, {2,3} , MPI_Aint *array_of_displacements, {MPI_INT,cp_type}, &amp;flight_type); MPI_Send(flights, flights.size(), flight_type, n, 1, MPI_COMM_WORLD); @suszterpatt 我想我明白了,但我不知道在“位移数组”中具体写什么。
    • int a[2] = {2,3}; MPI_Aint b[2] = {0,2*sizeof(int)}; MPI_Datatype cp_type, flight_type; MPI_Type_contiguous(6, MPI_INT, &amp;cp_type); MPI_Datatype c[2] = {MPI_INT,cp_type}; MPI_Type_struct(2, a, b, c, &amp;flight_type); MPI_Send(&amp;flights, 1, flight_type, n, 1, MPI_COMM_WORLD); @suszterpatt 这是我的代码我收到一个致命错误“无效数据类型”、“错误堆栈”、“数据类型尚未提交”
    • @Ben:两件事。首先,使用MPI_Address() 找到point[0] 的地址,并将其用作位移向量的第二个元素。这就是实际数据所在的位置。 2 ints 在结构开始之后是 vector 对象的开始位置,但数据可能保存在内存中的其他位置。第二:您必须在定义 MPI 数据类型后使用MPI_Commit() 提交它们。您收到该错误是因为您尝试使用未提交的连续数据类型定义结构。
    • @suszterpatt 我有一个结构“flight”的向量,所以这意味着我必须找到向量中每个变量的地址。但是我无法定义结构,因为地址每次都不同。我试图只发送结构的一个元素,并且我使用了 MPI_Commit 和 MPI_Address 我还在接收器中创建了一个空的“飞行”结构以被覆盖,但它仍然无法正常工作。也许有一种简单的方法可以用 MPI_Pack 做到这一点?
    • @Ben:您可以重新定义(并重新提交)具有不同位移的数据类型并逐个发送结构。或者,虽然我不推荐它,但为每个元素定义一个单独的数据类型,然后为flights 的整个向量定义另一个结构。您可以尝试 MPI_Pack,但请记住,它总是会创建数据副本,这可能会很昂贵。
    猜你喜欢
    • 2013-04-15
    • 2018-03-12
    • 2013-12-20
    • 2016-06-15
    • 2012-03-13
    • 1970-01-01
    • 2016-10-03
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多