1

画像に対して特定の些細な操作を実行する必要があります(この場合はネガティブ)。画像を再帰的に等角に分割し、MPIを使用して並列処理する必要があると言われています。

シーケンシャル画像処理クラスでこれを行うための関数を作成しました。

void recursive_negative_helper(int x, int y, int WIDTH, int HEIGHT)
{
    /* recurse until dimensions become odd, to avoid corruption of image
      (equal sized rectangles only) */
    if( (WIDTH&1) || (HEIGHT&1) )
    {
        uint8_t color[BPP];
        for(int i=y ; i<y+HEIGHT ; i++)
        {
            for(int j=x ; j<x+WIDTH ; j++)
            {
                    get_pixel(color,i,j);
                    for(int k=0 ; k<BPP ; k++)
                        color[k] = 255-color[k];
                    set_pixel(color,i,j);
            }
        }
        return;
    }
    recursive_negative_helper(x        , y         , WIDTH/2, HEIGHT/2);
    recursive_negative_helper(x+WIDTH/2, y         , WIDTH/2, HEIGHT/2);
    recursive_negative_helper(x        , y+HEIGHT/2, WIDTH/2, HEIGHT/2);
    recursive_negative_helper(x+WIDTH/2, y+HEIGHT/2, WIDTH/2, HEIGHT/2);
}

void recursive_negative()
{
    recursive_negative_helper(0,0,width,height);
}

私は初めてMPIを学び、これを並行して行う方法を理解するのに苦労しています。1つの方法は、4つに分割し、各部分をプロセスに割り当てることだと思います。私のアプリケーションにはそれで十分です!しかし、どうすれば任意の数のプロセスに対してそれを行うことができますか?

誰か助けてもらえますか?また、可能であれば、MPI擬似コードを投稿してください。そうすれば、より明確に視覚化できます。

4

1 に答える 1

1

あなたの場合、並列処理を行うためにOPENMP ( http://openmp.org/wp/ ) を使用することをお勧めします。単純なループを最適化するための構成とコンパイルは簡単です。コードの変更も簡単です。しかし、再帰処理についてはよくわかりませんので、注意するか、非再帰的な実装を使用してください。いくつかのチュートリアルとガイド: http://bisqwit.iki.fi/story/howto/openmp/

于 2013-01-27T05:03:38.280 に答える