私は元々、画像のすべてのピクセルを反復処理し、データに対してさまざまな操作を行うシングルスレッドループを持っています。
私が使用しているライブラリでは、画像からピクセルを取得するには、一度に 1 行ずつ行う必要があります。この目的malloc
のために、1 行のピクセルをホストできるメモリ ブロック ( BMM_Color_fl
1 ピクセルの 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
に置き換えました。vector
reserve