MPI - несоответствие между данными, отправленными и полученными - PullRequest
0 голосов
/ 04 марта 2020

Я пишу приложение с использованием 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 (эти байты также не являются граничными байтами). Я не понимаю, как это может произойти. Кто-нибудь может мне помочь?

...