Отправить 2D массив структур в блоках в MPI и C - PullRequest
0 голосов
/ 29 августа 2018

У меня следующая проблема:

В моем коде я определил эту матрицу:

typedef struct
{
    float valor_actual;
            int direccion;

} punto;
punto matriz[X][Y];

Кроме того, объявлен пользовательский тип mpi_punto:

MPI_Datatype mpi_punto;

int count = 2;
int blocklens[] = {1,1};

MPI_Aint indices[2];
MPI_Type_extent(MPI_DOUBLE, &indices[0]);
MPI_Type_extent(MPI_DOUBLE, &indices[1]);


MPI_Datatype old_types[] = {MPI_FLOAT,MPI_INT}; 

MPI_Type_struct(count,blocklens,indices,old_types,&mpi_punto);
MPI_Type_commit(&mpi_punto); 

Затем главный процесс (Rank = 0) отправляет матрицу другим процессам. Матрица разделена на столбцы:

if (rango == 0) //Proceso maestro
{
//Inicializamos la matriz
    for (i=0; i< X; i++)
    {
        for (j=0; j < Y; j++)
        {
            matriz[i][j].valor_actual= 0.0;

        }
    }

col_por_proceso = Y/num_esclavos;
resto = Y%num_esclavos;
desplz = 0;
for (i=1; i<=num_esclavos; i++)
{
        MPI_Send(&matriz[0][desplz],X*columnas,mpi_punto,i,1,MPI_COMM_WORLD);


        desplz = desplz + columnas;
} .....

Это код для других процессов:

if (rango != 0) //Procesos
{

          MPI_Recv(&matriz[0][desplz],X*columnas,mpi_punto,0,1,MPI_COMM_WORLD,&estado);

          matriz[0][rango].valor_actual = 4.0;

          printf("proceso %d -> %8.1f\n",rango, matriz[0][rango].valor_actual);

          MPI_Send(&matriz[0][desplz], X*columnas, mpi_punto, 0, 4, MPI_COMM_WORLD);

}

В приведенном выше коде каждый процесс заполняет ячейку matriz[0][number of Rank of the process] номером 4.0 и отправляет свой блок матрицы мастеру.

Мастер собирает данные из процессов, и когда я печатаю результат, все значения матрицы равны 0,0, и ни одна ячейка не имеет значения 4,0. Я хочу напечатать значение поля valor_actual, и это поле принадлежит структуре punto. Каждая ячейка в матрице имеет структуру punto.

for (j = 0; j < Y; j++) 
    { 
                printf("maestro (%d y %d) %8.1f\n",0,j, matriz[i][j].valor_actual);


    }

Однако вместо отправки матрицы структур мастер отправляет матрицу с плавающей точкой (float matrix[X][Y]), а затем, когда я печатаю результат, ячейки в строке 0 имеют значение 4,0

В чем проблема?

Заранее спасибо.

...