【发布时间】:2022-01-05 06:35:25
【问题描述】:
下面是结构体声明和代码:
struct cell_struct {
int x, y;
bool isWater, isPort, isRock;
struct port_struct port_data;
struct ship_struct *ships_data[MAX_SHIPS_PER_CELL];
int number_ships;
};
struct ship_struct {
int route, totalHoursAtSea, hoursAtSeaThisJourney, id, numberPassengers, euclideanPlannedDistance;
bool willMoveThisTimestep;
};
// Data associated with each port
struct port_struct {
int shipsInPastHundredHours[10];
int port_index, passengersShipped;
double totalFeesCollected;
};
struct cell_struct *domain_test;
domain_test = (struct cell_struct *) malloc(
sizeof(struct cell_struct) * (mpi_info->local_size_x + 2) * simulation_configuration->size_y);
使用以下发送和接收,我能够发送和接收 domain_test,但在发送和接收后无法从 domain_test 访问 ship_data。有什么帮助吗?
MPI_Send(&domain_test[mpi_info->local_size_x_end * simulation_configuration->size_y + i], sizeof(struct cell_struct), MPI_BYTE, 1, i, MPI_COMM_WORLD);
MPI_Recv(&domain_test[0],sizeof(struct cell_struct) * simulation_configuration->size_y, MPI_BYTE, 0, 0, MPI_COMM_WORLD, &status);
【问题讨论】:
-
没有简单的方法。一种选择是创建派生数据类型,以便您可以一次性发送/接收,但这有点乏味。另一种选择是“内联”
ships_data(例如声明struct ship_struct ships_data[MAX_SHIPS_PER_CELL];)。另一种选择是一次发送一个ships_data。最后但同样重要的是,您可以使用临时缓冲区和MPI_Pack()/MPI_Unpack()您的数据,以便一次性发送/接收缓冲区。