2

私は元々、画像のすべてのピクセルを反復処理し、データに対してさまざまな操作を行うシングルスレッドループを持っています。

私が使用しているライブラリでは、画像からピクセルを取得するには、一度に 1 行ずつ行う必要があります。この目的mallocのために、1 行のピクセルをホストできるメモリ ブロック ( BMM_Color_fl1 ピクセルの RGBA データを 4 つの float 値として含む構造体でありGetLinearPixels()、ビットマップから 1 行のピクセルをBMM_Color_fl配列にコピーします)。

BMM_Color_fl* line = (BMM_Color_fl*)malloc(width * sizeof(BMM_Color_fl));
for (int y = 0; y < height, y++)
{   
    bmp->GetLinearPixels(0, y, width, line); //Copy data of row Y from bitmap into line.
    BMM_Color_fl* pixel = line; //Get first pixel of line.
    for (int x = 0; x < width; x++, pixel++) // For each pixel in the row...
    {
        //Do stuff with a pixel.
    }
}
free(line);

ここまでは順調ですね!

このループの実行時間を短縮するために、 を使用して並行バージョンを作成しましたparallel_for。これは次のようになります。

parallel_for(0, height, [&](int y)
{   
    BMM_Color_fl* line = (BMM_Color_fl*)malloc(width * sizeof(BMM_Color_fl));
    bmp->GetLinearPixels(0, y, width, line);
    BMM_Color_fl* pixel = line;
    for (int x = 0; x < width; x++, pixel++)
    {
        //Do stuff with a pixel.
    }
    free(line);
});

マルチスレッド ループは既に元のループよりも高速ですが、すべてのスレッドが同じメモリ ブロックを使用することは不可能であることに気付きました。そのため、現在、ループの反復ごとにメモリを割り当てて解放しています。ループの繰り返しよりもスレッド。

私の質問は、各スレッドmallocに正確に 1 行のバッファーを持たせ、それを繰り返し使用する (そして理想的には、最後に解放する)ことができるかどうか、またどのようにすればよいかということです。

  • 免責事項として、私は初心者の C++ ユーザーであると述べなければなりません。

提案されたソリューションの実装:

Concurrency::combinable<std::vector<BMM_Color_fl>> line;

parallel_for(0, height, [&] (int y)
{
    std::vector<BMM_Color_fl> lineL = line.local();
    if (lineL.capacity() < width) lineL.reserve(width);

    bmp->GetLinearPixels(0, y, width, &lineL[0]);

    for (int x = 0; x < width; x++)
    {
         BMM_Color_fl* pixel = &lineL[x];
         //Do stuff with a pixel.
    }       
});

提案されたように、缶詰にして+mallocに置き換えました。vectorreserve

4

2 に答える 2

0

各スレッドにparallel_for()を呼び出させる代わりに、メモリを割り当てる別の関数を呼び出し、parallel_for()を呼び出してから、メモリを解放します。

于 2012-02-11T15:43:31.137 に答える
0

Concurrency::combinableクラスを使用してこれを実現できます。コードを投稿するのが面倒ですが、可能だと確信しています。

于 2012-02-11T19:07:03.500 に答える