boost :: mpi :: собирать параллельную обработку изображения - PullRequest
0 голосов
/ 21 марта 2020

Я хочу распараллелить обработку изображения, разделив его на части 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);

}
...