2次元行列の値の平均を取る単純なカーネルと思ったことをどうやって作ろうとしているのですが、私は思考過程を真っ直ぐにするいくつかの問題を抱えています。cudaカーネルのブロックとスレッドの数と使い方
私のdeviceQuery出力によると、私のGPUは16MP、32cores/mp、最大ブロックは1024x1024x64で、最大スレッド/ブロック= 1024があります。
私はいくつかの大きな画像を処理しています。多分5000px x 3500pxかそのようなものです。私のカーネルの1つは、画像内のすべてのピクセルにわたって平均値をとっています。
既存のコードには、2D配列[rows] [cols]として保存されたイメージがあります。だからカーネルは、Cの中で、あなたが期待していたように見えます。中間の計算では、行の上のループと列の上のループです。
CUDAでこのコードの寸法計算部分を設定するにはどうすればよいですか?私はSDKのリダクションコードを見てきましたが、これは1次元配列のものです。それはsoemthing 2Dを持っているときのブロックとスレッドの数を設定する方法の任意の言及を持っていません。これは、セットアップのために意味をなすように見えるん
num_threads=1024;
blocksX = num_cols/sqrt(num_threads);
blocksY = num_rows/sqrt(num_threads);
num_blocks = (num_rows*num_cols)/(blocksX*blocksY);
dim3 dimBlock(blocksX, blocksY, 1);
dim3 dimGrid(num_blocks, 1, 1);
:私は実際にそうようにそれを設定する必要があるだろう考えていて、これは私がチャイムに誰か、助けが欲しいところです
?
そしてカーネル内で、特定の行または列上で動作するように、私は
rowidx =(blockIdx.x * blockDim.x)+ threadId.x colidx =(blockIdxを使用する必要があるだろう。 y * blockDim.y)+ threadId.y
少なくとも、私はそれが行と列を取得するために働くと思う。
カーネルの特定の行rと列cにどうすればアクセスできますか? CUDAプログラミングガイドでは、私は次のコードが見つかりました:
// Host code int width = 64, height = 64;
float* devPtr; size_t pitch;
cudaMallocPitch(&devPtr, &pitch, width * sizeof(float), height);
MyKernel<<<100, 512>>>(devPtr, pitch, width, height);
// Device code __global__ void MyKernel(float* devPtr, size_t pitch, int width, int height)
{
for (int r = 0; r < height; ++r)
{
float* row = (float*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c)
{
float element = row[c];
}
}
}
あなたは2次元配列を宣言するためにC言語でmalloc関数を使用したい方法に似ていますが、それは自分自身のカーネルでその配列にアクセスする一切の言及を持っているdoesntの。私のコードでは、私はそのcudaMallocPitch呼び出しを使用し、デバイス上の2D配列に私のデータを取得するmemcpyを実行するでしょうか?
ヒントありがとうございます!ありがとう!
iDivUPが何をしているのか分かっていれば、整数切り捨てのおかげでロジックを単純化することができます:return(a + b-1)/ b; –