1

非常に基本的な CUDA プログラムで問題が発生しています。ホストとデバイスで 2 つのベクトルを乗算して比較するプログラムがあります。これは問題なく動作します。間違っているのは、学習目的でさまざまな数のスレッドとブロックをテストしようとしていることです。次のカーネルがあります。

__global__ void multiplyVectorsCUDA(float *a,float *b, float *c, int N){
    int idx = threadIdx.x;
    if (idx<N) 
        c[idx] = a[idx]*b[idx];
}

私は次のように呼んでいます:

multiplyVectorsCUDA <<<nBlocks, nThreads>>> (vector_a_d,vector_b_d,vector_c_d,N);

今のところ 1 に固定nBLocksしているので、ベクトル サイズNとスレッド数だけを変更しますnThreads。私が理解していることから、乗算ごとにスレッドがあり、N等しいnThreadsはずです。

問題は次のとおりです

  1. 最初にカーネルを呼び出しますがN=16nThreads<16これは機能しません。(これで結構です)
  2. それから私はそれを呼び出して、N=16うまくnThreads=16いきます。(再び期待どおりに動作します)
  3. しかし、私がそれを呼び出すとN=16nThreads<16まだ動作します!

最後のステップが最初のステップのように失敗しない理由がわかりません。PCを再起動すると、再び失敗します。

誰かが以前にこのようなことに遭遇したことがありますか、またはこの動作を説明できますか?

4

2 に答える 2

2

待って、それで 3 つすべてに続けて電話をかけているのですか。コードの残りの部分はわかりませんが、実行ごとに割り当てたグラフィックス メモリをクリアしていますか? そうでない場合は、最初は機能せず、同じ値を渡すと 3 回目は機能する理由と、再起動後にのみ機能する理由を説明できます (再起動すると、割り当てられたすべてのメモリがクリアされます)。

于 2010-07-02T20:13:41.133 に答える
1

自分の質問に答えてよいかどうかはわかりませんが、ホストとデバイスのベクトルを比較するときにコードにバグがあることに気付きました (コードのその部分は投稿されていません)。ご不便おかけしてすみません。削除できないので、誰かこの投稿を閉じてもらえませんか?

于 2010-07-03T03:25:21.450 に答える