У меня следующая проблема:
В моем коде я определил эту матрицу:
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
В чем проблема?
Заранее спасибо.