0

カーネルのif句に依存してcudaプログラムがクラッシュするという非常に奇妙な動作が発生しました。このコードは問題なく動作します (同じ手順、おそらくコンパイラがこれを最適化しますか?):

... 
if( value == 0 )
{
  result = make_float4(0,0,1,0.01);
}
else
{
  result = make_float4(0,0,1,0.01);
}
...

これに変更

... 
if( value == 0 )
{
  result = make_float4(0,0,1,0.01);
}
else
{
  result = make_float4(1,0,1,0.01);
}
...

次のカーネルを呼び出すときに、不特定の起動エラーでプログラムがクラッシュします。問題は、結果の値ではなく、条件付き実行にあるようです。cudaGetLastError() をチェックしてもエラーは返されません。

誰もが同様の問題を抱えていましたか、それともスレッド発散制限のようなものはありますか? これをさらにデバッグする方法はありますか?

4

1 に答える 1

0

私の質問へのコメントの助けを借りて、私は自分で答えを見つけました:コードの前にエラーがありました。の計算が問題でした。そこで、境界外アクセスの配列を実行しましたが、if 条件の両方のステートメントが同じである場合、コンパイラはこれを最適化するようです。

これ:

...
int value = stupidArray[wrongIndex];

if( value == 0 )
{
  result = make_float4(0,0,1,0.01);
}
else
{
  result = make_float4(0,0,1,0.01);
}
...

これに最適化されました:

...
result = make_float4(0,0,1,0.01);
...

したがって、この場合、エラーは生成されませんでした。

于 2013-04-15T08:20:19.400 に答える