0

次のように、mallocを使用してスペースを割り当てている単純なカーネルがあります。

__global__ void chainKernel() {
    float* __restrict__ boo = (float*)malloc(sizeof(float));
    *boo = 0;
    *boo = *boo + 100;
    return;
}

ブレークポイントを設定する*boo = *boo + 100と、*boo の内容が見えなくなります。代わりにOperation is not valid due to the current state of the object、デバッガー ウィンドウの変数の横に表示されます。ただし、を削除する__restrict__と、値が正しく表示されます。これは正常な動作ですか?

私のシステム: CUDA 5.5.20、Nsight 3.1.0.13141、Windows 7 x64、VS2010、GeForce GTX Titan。

4

1 に答える 1

3

の利点の 1 つは__restrict__、コンパイラが最適化をより積極的に行えることです。コンパイラが完全に最適化できるこのような単純なコードがある場合、__restrict__キーワードはコンパイラがそれを行うのに役立つ場合があります。

デバッガーで変数を検査できない一般的な理由の 1 つは、ローカル (予期しないときに変数がスコープ外になる) またはグローバル (完全に最適化されて除去された変数) のコンパイラーの最適化によるものです。 .

この質問で示したカーネルの定義は役に立たないことに注意してください。したがって、コンパイラは最適化を行っている可能性があります。

これを回避するには (この場合)、printf("%f", *boo);最後の代入の直後にステートメントをboo配置すると、コンパイラは変数を最適化できなくなります。-Gデバッグにもスイッチを使用する必要があります。

于 2013-08-20T13:22:49.137 に答える