2

AMD ビデオ カードで OpenCL を使用しており、Linux に最新のドライバーがあります。

次のようなことをすると:

int a = get_group_id(0) > 0 ? vector[ get_group_id(0)-1 ].word[ id ] : 0;

間違った結果が得られます。しかし、barrier(CLK_LOCAL_MEM_FENCE);この後に a を使用すると、正しい結果が得られます。

なぜそれが起こっているのですか?

Ps1.: Linux と Windows の両方で NVIDIA ビデオ カードを使用すると、バリアを使用せずに正しい答えが得られます。

ブロックは ( __global *input, __global *output を使用):

int a = get_group_id(0) > 0 ? vector[ get_group_id(0)-1 ].word[ id ] : 0;
int b = get_group_id(0) > 0 ? c + a : a;
output[b + id] = input[ d + id ]; //Last kernel line

128 ワークグループ サイズを使用しています。HD 6790で試しました-linux

ありがとう

4

1 に答える 1

0

以前に報告したこのバグに似ているようです: http://devgurus.amd.com/thread/158479

残念ながら、これはコンパイラのバグであり、ローカル バリアを使用して AMD が修正するまで待つ以外にできることはあまりありません。

(リンクされたトピックで提案されているように、ローカルの mem_fence は、コンパイラがこのエラーを発生させないようにするのに実際には十分であることに注意してください。)

于 2012-03-26T20:05:33.713 に答える