デバッグ ビルドでは機能するが、リリース ビルドでは失敗するカーネルがあります。範囲外の読み取りまたは書き込みを行っていると思われますが、CUDA メモリ チェッカーはエラーを表示していません。そこで、次のカーネルを使用して範囲外の書き込みと読み取りを行うテストを行いました。
__global__ void addKernel(int *c, const int *a, const int *b)
{
int x[1];
for (int i(0); i < 100; ++i) {
x[i] = i;
}
int t(0);
for (int i(0); i < 100; ++i) {
t += x[i];
}
c[0] = t;
}
CUDA メモリ チェッカーは、範囲外の書き込みと読み取りをキャッチしませんでした。ループを 1,000,000 ラウンドに増やすことで、範囲外の書き込みを検出することができました。これにより、カーネルは i = 502,586 (2MB 範囲外) で一時停止しました。
これは、CUDA メモリ チェッカーが動作する予想される粒度ですか?また、範囲外の小さな書き込み (数バイトのオーダーで?) を検出するためにできることはありますか?