これが私のコードです:
int threadNum = BLOCKDIM/8;
dim3 dimBlock(threadNum,threadNum);
int blocks1 = nWidth/threadNum + (nWidth%threadNum == 0 ? 0 : 1);
int blocks2 = nHeight/threadNum + (nHeight%threadNum == 0 ? 0 : 1);
dim3 dimGrid;
dimGrid.x = blocks1;
dimGrid.y = blocks2;
// dim3 numThreads2(BLOCKDIM);
// dim3 numBlocks2(numPixels/BLOCKDIM + (numPixels%BLOCKDIM == 0 ? 0 : 1) );
perform_scaling<<<dimGrid,dimBlock>>>(imageDevice,imageDevice_new,min,max,nWidth, nHeight);
cudaError_t err = cudaGetLastError();
cudasafe(err,"Kernel2");
これは私の2番目のカーネルの実行であり、データの使用に関しては完全に独立しています。 BLOCKDIM
は512、nWidth and nHeight
も512であり、cudasafe
は対応するエラーコードの文字列メッセージを出力するだけです。コードのこのセクションでは、カーネル呼び出しの直後に構成エラーが発生します。
このエラーの原因は何ですか?
このタイプのエラーメッセージは、起動設定パラメーターを頻繁に参照します(この場合のグリッド/スレッドブロックの寸法は、他の場合には共有メモリなどである可能性もあります)。このようなメッセージが表示された場合は、カーネルを起動する前に実際の構成パラメーターを出力して、間違いがないかどうかを確認することをお勧めします。
あなたはBLOCKDIM
= 512と言いました。あなたはthreadNum = BLOCKDIM/8
so threadNum
=64。スレッドブロック構成は次のとおりです。
dim3 dimBlock(threadNum,threadNum);
したがって、64 x 64スレッドのブロック、つまりブロックあたり4096スレッドを起動するように求めています。これは、どの世代のCUDAデバイスでも機能しません。現在のすべてのCUDAデバイスは、ブロックあたり最大1024スレッドに制限されています。これは、3つのブロックの寸法の積です。
最大寸法は、CUDAプログラミングガイドの 表14 に記載されており、deviceQuery
CUDAサンプルコードからも入手できます。
前の回答に追加するだけで、コードで許可されている最大スレッドを見つけることができるため、使用するスレッドの数をハードコーディングすることなく他のデバイスで実行できます。
struct cudaDeviceProp properties;
cudaGetDeviceProperties(&properties, device);
cout<<"using "<<properties.multiProcessorCount<<" multiprocessors"<<endl;
cout<<"max threads per processor: "<<properties.maxThreadsPerMultiProcessor<<endl;