2017-01-27 4 views
1

イメージ上にフィルタを実行しています。垂直パスとそれに続く水平パスを実行します。このタスクの機能は両方のパスで同じですが、引数値のみが変更されます。私はループで関数を呼び出しています。その関数の演算をベクトル化するには、2つのパスに対して別々の関数呼び出しを書く必要があります。ループは水平パスと垂直パスのために別々になりました。この変更のために「if条件」が追加されました。計算がベクトル化されても、カーネルの実行に時間がかかります。私はコードを何度も実行しており、ベクトル化されたコードで取られた平均時間は元のコードよりも長くなっています。それは "if条件"がコードに組み込まれているためですか?"条件が" OpenCLのカーネル実行のパフォーマンスに影響を与える場合は?

オリジナルコード

global int* a; 

for(int i = 0; i < 4; i++) 
{ 
    filter(a + i, b, c); 
} 

修正コード

global int* a; 

if(offset == 1) 
for(int i = 0; i < 4; i++) 
{ 
    filter_vertical(a + i, b, c); 
} 
else 
    filter_horizontal(a, b, c); 
+0

サンプルコードの一部を表示してください。 'if'文の使い方は、答えを変えるかもしれません。 –

答えて

1

あなたがoffset == 1を意味しましたか?

if(offset = 1) 

は、スレッドごとに「特別な待ち時間」であるオフセットに1を割り当てます。これはオリジナルよりも遅いです。しかし、GPU SIMDのようないくつかのアーキテクチャーは、同じブランチオプションでないときに並列SIMDパイプラインにバブルを埋め込むため、ブランチのパターンに応じて性能を上下に変化させますネイバーのパイプラインと一緒に他の波面スレッドの職業の機会に残されているので、もし彼らがニューライトを埋めることができなければ、パフォーマンスは低下します。より多くのパフォーマンスのために

filter_vertical(a , b, c); 
    filter_vertical(a + 1, b, c); 
    filter_vertical(a + 2, b, c); 
    filter_vertical(a + 3, b, c); 

for(int i = 0; i < 4; i++) 
{ 
    filter_vertical(a + i, b, c); 
} 

は、より多くの命令キャッシュを必要としますが、以下の枝を必要とする、より少ないメモリ使用量の少ないサイクルを必要とします。

オフセット== 1のケースをグループ化することができれば、メモリアクセス操作が影響を与えない場合は速くなります。

関連する問題