Я пишу приложение с использованием MPI, в котором главный узел должен посылать части изображения (считанные с использованием libpng) на подчиненные узлы. Я написал следующий код для распределения строк:
int num_rows_per_process = ceil(((float)height)/size);
if(rank == 0)
{
//Send the chunks to the other nodes
for(int i=1;i<size;i++)
{
int y;
for(y=0;y<num_rows_per_process;y++)
{
int row_index = i*num_rows_per_process+y;
if(row_index >= height)
break;
MPI_Send(row_pointers[row_index], width, MPI_UNSIGNED_CHAR, i, row_index, MPI_COMM_WORLD);
}
}
}
else
{
//Figure out how many rows will I get
row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * num_rows_per_process); //For the other processes, these are sub rows
for(int y=0;y<num_rows_per_process;y++)
{
int row_index = rank*num_rows_per_process+y;
if(row_index >= height)
{
row_pointers[row_index] = NULL;
continue;
}
row_pointers[y] = (png_byte*) malloc(row_bytes);
MPI_Recv(row_pointers[y], width, MPI_UNSIGNED_CHAR, 0, row_index, MPI_COMM_WORLD, &status);
}
}
MPI_Barrier(MPI_COMM_WORLD);
Размер / ширина строки - 9500, а высота - 6280 для конкретного изображения, которое я использую. Кроме того, тип данных png_byte
является просто typedef для unsigned char
. Когда я сравниваю данные, полученные подчиненными узлами, из всех 9500 строк изменяется только одна строка , и даже в этой конкретной строке только 16 байтов изменяются на 0 (эти байты также не являются граничными байтами). Я не понимаю, как это может произойти. Кто-нибудь может мне помочь?