2016-07-06 10 views
0

最近私はcudaを試していますが、次のcudaカーネルに問題がありました。このcudaカーネル内のローカル変数?

__global__ void addKernel(float *c, const float *a, const float *b, int nsize) 
{ 
    int blockID = blockIdx.x + blockIdx.y*gridDim.x; 
    int i = blockID*blockDim.x+threadIdx.x; 
    if (i < nsize){ 
     c[i] = a[i] + b[i]; 
    } 
    float k = c[i]; 
}` 

このカーネルは、単純なベクターの追加に使用されます。最後の文float k = c[i];がなければ正常に動作します。しかし、私はこのステートメントを追加した後、コードを実行するとunspecified launch failureエラーが表示されます。誰にでもこのカーネルの何が問題なのか教えてくれますか?

答えて

1

実際のデバイスメモリ割り当てと、このカーネル(ブロック、スレッドなど)の起動方法を含めて、完全なコードを表示してください。しかし、あなたは仕事の大きさ(すなわち、ベクトルの長さ)をカバーするのに十分なスレッド以上を起動している可能性が非常に高いです。これはかなり一般的なCUDAの習慣です。

あなたはそれがあなたのカーネルでスレッド・チェックを含めるのが通例だが、それを行う:

if (i < nsize){ 

実際に索引付けに慣れるi値は、すなわちベクトル長内(有効であることを確認するために、 )。

しかし、あなたは(if文のすなわち外体)外スレッドチェックをこの文を含むことによって、物事が壊れました:いずれかのために、

float k = c[i]; 

今は中iを計算しましたあなたのカーネルでは、その場所のcベクトルへのインデックス付けを試行します。でも、insizeより大きい場合は、おそらくcベクトルの長さです。

この文は、ベクトル割り当てのcの範囲外にインデックスを設定している可能性が最も高いです。恐らく、hereのような方法を使って、もう少しデバッグして確認できます。

+0

ありがとうございます!私は間違いを今理解しています。 – andy90

+0

例外として、デバッグスイッチ( '-G')でコードをコンパイルしている場合は、この特定の場合のこのエラーは/それ自身を明示すべきです。リリースモードでは、コンパイラはカーネル内の最後のステートメントがグローバルステートに影響を与えないことを認識し、最適化します。それにもかかわらず、コードは書かれたとおりに破られます。 –

+0

はい、そうです。私はそれを確認しました。@ Robert – andy90

関連する問題