1

特定のカーネル内のすべての変数値を調べる方法があることを知りたいです。たとえば、threadIdx.x = 1 の場合、現在動作しているデータとそのデータの値は何ですか?

すべてが正しく機能しているので、私の質問は、「クイックウォッチ」または「ウォッチの追加」を使用して、通常のVSでできるように変数を表示する方法です.NSightでそれらに相当するものは何ですか? ありがとう、今から数時間苦労しています。

NSight を介してデバッグするときに、blockIdx、threadIDx 座標のみを表示する CUDA 情報ウィンドウと CUDA ワープ ウィンドウがあります。

   __global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;

    if(i<N)
        c[i]=a[i]*b[i];
    // DUmmy code
    if(i<2)
    int k=i;
}

私のカーネルはこのように呼び出されaddKernel<<<1,N>>>(dev_c,dev_a,dev_b)、私の #DEFINE N 10.

if と else の中にブレークポイントを入れます。ワープ ウィンドウの出力は次のように設定されています。

*(a+i)  *(b+i)  *(c+i)  i

 0          0     -1     0
 2          1     -1     1
 4          4     -1     2
 6          9     -1     3
 8         16     -1     4

だから、私のcは決してセットアップされません。どうして?ありがとうございました

PS マイナスをくれた人たちは、私の質問が -1 になるのを見て、いつも諦めてくれますか? 再度、感謝します

4

3 に答える 3

1

カーネルにいくつかのダミー行を追加した後、列 c の値が更新されたことを確認できました。それで、それが解決策でした。些細なことに聞こえるかもしれませんが、以前にダミー行を追加しようとしましたが、追加のダミー行が c の計算に使用されるスレッドではなく、他の変数でない限り機能しませんでした。つまり、要するに、新しいスレッド (またはカーネルで使用できるもの) を計算し、CUDA ワープ ウィンドウに表示する変数の後にそれらの余分な行を追加します。

于 2013-02-10T22:03:13.607 に答える
0

Compute Capability 2.1 (c[i] = 0) の 555m gt で同じ問題が発生しました。Compute Capability 3.0 を搭載した GTX 660 は正しい値を示しますが、c[i] = -1 になる場合があります。

「ダミー」行を使用すると、どのような場合でも問題なく動作します (行 c[i] = c[i] のブレークポイント)。

__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;
    c[i] = a[i] + b[i]; //if breakpoint will be here c[i] = -1 or 0
    c[i] = c[i]; //breakpoint here guarantees c[i] is correct
}
于 2014-04-15T19:32:49.007 に答える