Udacityコースのレッスン 1 の最後の問題を解決しようとしていますが、タイプミスしただけなのか、実際のコードが間違っているのかわかりません。
void your_rgba_to_greyscale(const uchar4 * const h_rgbaImage, uchar4 * const d_rgbaImage, unsigned char* const d_greyImage, size_t numRows, size_t numCols)
{
size_t totalPixels = numRows * numCols;
size_t gridRows = totalPixels / 32;
size_t gridCols = totalPixels / 32;
const dim3 blockSize(32,32,1);
const dim3 gridSize(gridCols,gridRows,1);
rgba_to_greyscale<<<gridSize, blockSize>>>(d_rgbaImage, d_greyImage, numRows, numCols);
cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError());
}
他の方法は次のとおりです。
void rgba_to_greyscale(const uchar4* const rgbaImage, unsigned char* const greyImage, int numRows, int numCols)
{
int x = (blockIdx.x * blockDim.x) + threadIdx.x;
int y = (blockIdx.y * blockDim.y) + threadIdx.y;
uchar4 rgba = rgbaImage[x * numCols + y];
float channelSum = 0.299f * rgba.x + 0.587f * rgba.y + 0.114f * rgba.z;
greyImage[x * numCols + y] = channelSum;
}
エラーメッセージには次のように記載されています。
libdc1394 error: failed to initialize libdc1394
Cuda error at student_func.cu:76
unspecified launch failure cudaGetLastError()
we were unable to execute your code. Did you set the grid and/or block size correctly?
しかし、その後、コードがコンパイルされたと表示されます。
Your code compiled!
error output: libdc1394 error: Failed to initialize libdc1394
Cuda error at student_func.cu:76
unspecified launch failure cudaGetLastError()
行 76 は最初のコード ブロックの最後の行であり、私が知る限り、何も変更していません。76 行目は次のとおりです。
rgba_to_greyscale<<<gridSize, blockSize>>>(d_rgbaImage, d_greyImage, numRows, numCols);
の宣言が実際には見つかりませんcudaGetLastError()
。
私は主に、グリッド/ブロックの寸法の設定に関する理解と、ピクセル位置の 1D 配列とスレッド間のマッピングに関して最初の方法のアプローチが正しかったかどうかに関心があります。
編集:
私は何かを誤解したと思います。numRows
縦のピクセル数ですか?そしてnumCols
、ピクセルは水平方向ですか?
私のブロックは 8 x 8 のスレッドで構成されています。各スレッドは 1 ピクセルを表していますか? gridRows
もしそうなら、画像が正方形ではないので、計算時に4で割る必要があったのはそのためだと思いますか? 2:1 の列: 行のブロックを作成することもできたと思います。
編集 2:
2:1 の比率になるようにブロックを変更しようとしたところ、同じ数で割ることができnumRows
ましnumCol
たが、下部と側面に空白の領域が表示されました。下部と側面の両方に空白の領域があるのはなぜですか。グリッドまたはブロックごとに の y 次元を変更していません。