【发布时间】: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;
示例代码会很有帮助
【问题讨论】:
如何通过 MPI 发送和接收这种类型的结构?
struct controlPoint{
int hour,minute,second,x,y,z;
};
struct flight{
int flightNum, controlNum;
vector<controlPoint> point;
};
vector<flight> flights;
示例代码会很有帮助
【问题讨论】:
您需要调用user-defined datatypes 的魔力。首先,为controlPoint 定义一个MPI_Contiguous 数据类型:我们称之为cp_type。接下来,您需要一个MPI_Struct 来代表flight,我们将其称为flight_type。这有点棘手,因为您无法通过 MPI 传递 vector(没有来自例如 Bost 的外部帮助)。幸运的是,您实际上并不需要:vector 保证连续存储,就像数组一样。因此,您的 MPI_Struct 将由 2 个块组成:第一个块有两个偏移量为 0 的整数(flightNum 和 controlNum),第二个块有 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, &cp_type); MPI_Type_struct(2, {2,3} , MPI_Aint *array_of_displacements, {MPI_INT,cp_type}, &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, &cp_type); MPI_Datatype c[2] = {MPI_INT,cp_type}; MPI_Type_struct(2, a, b, c, &flight_type); MPI_Send(&flights, 1, flight_type, n, 1, MPI_COMM_WORLD); @suszterpatt 这是我的代码我收到一个致命错误“无效数据类型”、“错误堆栈”、“数据类型尚未提交”
MPI_Address() 找到point[0] 的地址,并将其用作位移向量的第二个元素。这就是实际数据所在的位置。 2 ints 在结构开始之后是 vector 对象的开始位置,但数据可能保存在内存中的其他位置。第二:您必须在定义 MPI 数据类型后使用MPI_Commit() 提交它们。您收到该错误是因为您尝试使用未提交的连续数据类型定义结构。
flights 的整个向量定义另一个结构。您可以尝试 MPI_Pack,但请记住,它总是会创建数据副本,这可能会很昂贵。