2

大きな画像を処理するカーネルがあります (OpenCL 1.1、データ型は image2d_t)。この画像の特定の領域のみを処理したい場合があります。明らかな解決策は、グローバル ワーク オフセットを使用することです。これによりパフォーマンスが向上することを期待していますが、これまでのところ、ゼロ以外のオフセットで実行時間が悪化するだけです!

// Image is 4096x4096 pixels. Local work size is 8x8.
//
// Example A:
globalWorkSize = { 4096, 4096 };
globalWorkOffset = { 0, 0 };
// Execution time is 38 seconds
//    
// Example B:
globalWorkSize = { 3296, 3296 };
globalWorkOffset = { 400, 400 };
// Execution time is 58 seconds <------------------ ?!
//
// Example C: Cropped image @ 3296x3296 pixels
globalWorkSize = { 3296, 3296 };
globalWorkOffset = { 0, 0 };
// Execution time is 28 seconds

なぜ私がこれらの結果を得たのか誰か説明してもらえますか?

4

2 に答える 2

1

画像を使用することは正しい選択のように思えますが、常にそうであるとは限りません。

ピクセル間の補間が必要なく、境界線の色の処理も必要ない場合は、画像に対してバッファーを使用する方がよい場合があります。

境界色を処理する場合でも、エッジ領域とバッファーを処理する個別のカーネルを使用すると、全体的に優れたパフォーマンスが得られる可能性があります。

画像のパフォーマンスが向上する理由は、メモリから一度に複数のピクセルをロードできるためです。一部のアーキテクチャでは、命令が一度に 128 ビットをロードできます。

実際の質問になると、私の推測では、hw はオフセットと作業 ID を使用して各ピクセルの実際の座標を計算します。

于 2017-03-12T19:23:21.260 に答える