非常に基本的な 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
はずです。
問題は次のとおりです
- 最初にカーネルを呼び出しますが
N=16
、nThreads<16
これは機能しません。(これで結構です) - それから私はそれを呼び出して、
N=16
うまくnThreads=16
いきます。(再び期待どおりに動作します) - しかし、私がそれを呼び出すと
N=16
、nThreads<16
まだ動作します!
最後のステップが最初のステップのように失敗しない理由がわかりません。PCを再起動すると、再び失敗します。
誰かが以前にこのようなことに遭遇したことがありますか、またはこの動作を説明できますか?