Я хочу распараллелить обработку изображения, разделив его на части X * Y, обработать каждую часть, а затем использовать сборку, чтобы собрать все вместе в конце процесса, но каждый раз получаю плохо упорядоченный вектор данных (возможно также дублирование) Оригинал Результат
image_data_t data;
image_data_t data2;
if (world.rank() == 0) {
int x0 = (width*world.rank()/xPart);
int y0 = (height*world.rank()/yPart);
int x1 = (width*(world.rank() + 1)/xPart);
int y1 = (height*(world.rank() + 1)/yPart);
data = blur(data1, width, height, radius, x0, y0, x1, y1);
gather(world, data.data(), data.size(), data2, 0);
std::chrono::time_point<std::chrono::system_clock> t2 = std::chrono::system_clock::now();
writePnm("output.pnm", width, height, data2);
std::chrono::time_point<std::chrono::system_clock> t3 = std::chrono::system_clock::now();
// display computation times
/*std::chrono::duration<double> readTime = t1 - t0;
std::chrono::duration<double> blurTime = t2 - t1;
std::chrono::duration<double> writeTime = t3 - t2;*/
std::chrono::duration<double> totalTime = t3 - t0;
std::cout << world.size() - 1<< ' ' << radius << ' ' << totalTime.count() << std::endl;
} else {
int x0,x1,y0,y1;
///std::cout << world.rank() << std::endl;
int rest1 = world.rank()/xPart;
x0 = (width*(world.rank() % xPart)/xPart);
x1 = x0 + width/xPart ;
int rest2 = world.rank()/yPart;
y0 = (height*(world.rank() % yPart)/yPart);
y1 = y0 + height/yPart;
data = blur(data1, width, height, radius, x0, y0, x1, y1);
unsigned char * arr = (unsigned char *) malloc(data.size() * sizeof(unsigned char));
for(int i = 0; i < data.size(); i++){
arr[i] = data.at(i);
}
gather(world, data.data(), data.size(), 0);
}