es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo enviar y recibir una estructura anidada con un arreglo de estructuras usando punteros en MPI?

Aquí están las declaraciones de estructuras y el código a continuación:

struct cell_struct {
    int x, y;
    bool isWater, isPort, isRock;
    struct port_struct 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;
};

// Datos asociados a cada puerto
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);

Usando los siguientes Send y Recv, pude enviar y recibir domain_test, pero no pude acceder a ships_data de domain_test después de enviar y recibir. ¿Alguna ayuda en esto?

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);
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema de no poder acceder a ships_data desde domain_test después de enviar y recibir podría deberse al hecho de que MPI envía y recibe datos como bloques contiguos de memoria. En el caso de la estructura cell_struct, ships_data es un arreglo de punteros, que puede no ser contiguo en memoria con el resto de los campos de la estructura.

    Una solución podría ser aplanar la estructura en un bloque contiguo de memoria antes de enviar, y luego reconstruir la estructura en el extremo receptor. Esto se puede hacer utilizando las funciones MPI_Pack y MPI_Unpack.

    Alternativamente, podrías utilizar MPI_Type_create_struct para crear un tipo de dato personalizado que describa la disposición de la estructura e incluya el arreglo ships_data. Este tipo de dato luego se puede utilizar en las llamadas MPI_Send y MPI_Recv para enviar y recibir correctamente los datos.

    También es importante verificar que las llamadas MPI_Send y MPI_Recv se estén utilizando correctamente, con parámetros coincidentes para el tamaño de los datos, el tipo de dato y el comunicador, y que se estén utilizando de manera adecuada las rutinas de comunicación MPI necesarias, como MPI_Barrier o MPI_Isend/MPI_Irecv.

Comments are closed.