1

デバイスのメモリ配列に継続的に格納されているM、それぞれのサイズの一連のシングル チャネル イメージがあります。NxN(Nは 2 のべき乗ではありません。) したがって、配列の長さはMxNxNです。これらの各画像のすべてのピクセルの合計を見つける必要があります。したがって、出力はM画像ごとに 1 つの値になります。

すべてのピクセルの画像インデックスを保持する追加の配列を生成し、このインデックスをreduce_by_key各画像 (セグメント) に使用しています。これreduce_by_keyはかなり遅いようで、これらのピクセルで行っている他のすべてよりも時間がかかります。

セグメントがすべて同じサイズである場合、このセグメント化された削減合計を行うためのより高速な方法はありますか?

4

1 に答える 1

1

OpenCV は、CUDA で実装された行列削減 API を提供します。ここで見つけることができます。

http://docs.opencv.org/modules/gpu/doc/matrix_reductions.html#gpu-reduce

追加のサードパーティ ライブラリを含めたくない場合は、cublas を使用できます。この場合、タスクは次のように matlab コードで表すことができます。

result(1:M) = sum(images(1:N*N, 1:M), 1);

これはと同等です

result(1:M) = ones(1, N*N) * images(1:N*N, 1:M);

cublas<t>gemv()これは行列とベクトルの乗算演算であり、CUBLAS が提供するBLAS 2 関数によって効率的に実行できます。

http://docs.nvidia.com/cuda/cublas/index.html#cublas-lt-t-gt-gemv

一方、reduce_by_key()タスクに を使用する場合、画像インデックスの追加の配列を生成する必要はありません。Thrust の Fancy イテレーターは、この状況に合わせて設計されており、グローバルなメモリ帯域幅の要件を軽減します。

詳細については、この回答を参照してください。

CUDA で行列の行を減らす

于 2013-09-30T11:17:38.763 に答える