Я пишу программу, в которой процесс 0 отправляет части изображения другим процессам, которые преобразуют (длинную операцию) эту часть и отправляют обратно в ранг 0. У меня есть проблема с одна вещь. Чтобы воспроизвести мою проблему, я написал простой пример. Изображение размером 512x512px разделяется на 4 части (вертикальные полосы) процессом 0. Следующие другие процессы сохраняют эту часть на диске. Проблема в том, что каждый процесс сохраняет одну и ту же часть. Я обнаружил, что изображение разделено на части правильно, но проблема, вероятно, связана с отправкой данных. Что случилось в моем коде?MPI - отправка частей изображения в разные процессы
Пробег:
mpirun -np 5 ./example
Главная:
int main(int argc, char **argv) {
int size, rank;
MPI_Request send_request, rec_request;
MPI_Status status;
ostringstream s;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank == 0) {
Mat mat = imread("/home/user/original.jpg", CV_LOAD_IMAGE_COLOR);
if (!mat.data) exit(-1);
int idx = 1;
for (int c = 0; c < 512; c += 128) {
Mat slice = mat(Rect(c, 0, 128, 512)).clone();
MPI_Isend(slice.data, 128 * 512 * 3, MPI_BYTE, idx, 0, MPI_COMM_WORLD, &send_request);
idx++;
}
}
if (rank != 0) {
Mat test = Mat(512, 128, CV_8UC3);
MPI_Irecv(test.data, 128 * 512 * 3, MPI_BYTE, 0, 0, MPI_COMM_WORLD, &rec_request);
MPI_Wait(&rec_request, &status);
s << "/home/user/p" << rank << ".jpg";
imwrite(s.str(), test);
}
MPI_Finalize();
return 0;
}