0

matlab で cuda\jacket を使用すると、if ステートメントの応答が非常に遅くなります。(単純な for ループと if 条件を使用して極大値を見つける同じコードで 5 秒対 0.02 秒)

GPU プログラミングは初めてなので、以前のmatlab if ステートメントと CUDA SO の議論を見たときに、何かが足りないと感じました。コードをベクトル化した方がよいことを知るために、cuda を使用する必要はありません。ただし、とにかく if ステートメントを使用する必要がある場合があります。たとえば、2D 画像のピクセル (m(a,b) など) が 8 つの最近傍の極大値であるかどうかを調べたいと思います。matlab でこれを行う簡単な方法は、if ステートメントで 8 つの論理条件を使用することです。

m(a,b)>m(a-1,b-1) & m(a,b)>(a,b-1) & m(a,b)>(a+1,b-1)の場合& ... すべての最近傍について

これを解決する (またはベクトル化する) 方法を教えていただければ幸いです...

4

2 に答える 2

2

複数の「if」ステートメント (またはその他の条件付きステートメント) を使用する際の問題は、ステートメントごとに、結果が gpu からホストにコピーされ、コストがかかる可能性があることです。

最も簡単な方法は、次の方法でベクトル化することです。

window = m(a-1:a+1, b-1:b+1);
if all(window(:) <= m(a,b))
% do something
end

if / else 条件が何をしているかを示すことができれば、これをさらに最適化できます。つまり、if/else コードを投稿して、他の最適化が利用可能かどうかを確認してください (つまり、if 条件を完全に削除する方法を調べてください)。

編集

新しい情報があれば、できることは次のとおりです。

for j = 1:length(y)
 a = x(j);
 b = y(j);
 window = d(a-1:a+1, b-1:b+1);
 condition = all(window(:) <= d(a,b));
 M(a, b) = condition + ~condition * M(a,b);
end

gfor ループを使用すると、さらに高速化できます。

gfor j = 1:length(y)
 a = x(j);
 b = y(j);
 window = d(a-1:a+1, b-1:b+1);
 condition = all(window(:) <= d(a,b));
 M(a, b) = condition + ~condition * M(a,b);
gend
于 2012-08-07T20:03:19.253 に答える
1

組み込み関数の使用

すでに最適化されている最も簡単なアプローチは、おそらくimregionalmax関数を使用することです。

maxinI = imregionalmax(I, CONN); 

必要な接続はどこCONNですか(あなたの場合は8)。

ただし、これimregionalmaxは画像処理ツールボックスの一部であることに注意してください。

max機能の使用

その 1 つのピクセルだけが隣接するピクセルの極大値であるかどうかを確認しようとしている場合は、おそらく次のようにするでしょう。

if  m(a,b) == max(max(m( (a-1) : (a+1), (b-1) : (b+1))))

あるいは、max場合によっては、2つ取るよりも、形を変えた方が速いかもしれませんが、

if  m(a,b) == max(reshape (m( (a-1) : (a+1), (b-1) : (b+1)), 9,1)  )

max機能なし

max最後に、これまでよりもベクトル化された形式でも可能な関数を完全に回避したい場合、つまり

if  all(reshape( m(a,b) >= m( (a-1) : (a+1), (b-1) : (b+1)), 9,1))
于 2012-08-06T18:11:48.807 に答える