1

Udacity ビデオ コース (コースは 2 歳です) から CUDA GPU プログラミングを学び始めています。Nvidia GeForce GT 630M GPUで、Visual Studio Express 2012 (学生版のため、CUDA デバッグのすべての機能が利用できるわけではありません) でCUDA 5.5 を使用しています。

いくつかのベクトル加算とその他の単純な操作を実装しました。

、RGB 画像を Grayscale に変換しようとしています。OpenCVの助けを借りて画像を読んでいます。(とにかく、どんな方法を試しても失敗しました。それが私がここにいる理由です)

以下は私の .cpp ファイルです: https://gist.github.com/abidrahmank/7020863

以下は私の.cuファイルです: https://gist.github.com/abidrahmank/7020910

私の入力画像は単純な 64x64 カラー画像です (実際には最初に 512x512 画像を使用しましたが、うまくいかなかったので、問題があるかどうかを確認するために 64x64 に下げました。そうではないようです)

問題

私の CUDA 実装の出力イメージは white imageです。すべての値は 255 です。ところどころに灰色のピクセルがあり、1% 未満である可能性があります。残りはすべて白です。

私が試したこと:

3日間、私は次のことを試しました:

  1. 問題は画像サイズが原因である可能性があると考えたため、スレッド数が最適ではないか、そのようなものである可能性があるため、画像サイズを縮小しました。それでも同じ結果。
  2. 同様の例を試して、64x64 配列を作成しました。一度に 2 つのピクセルを取り、それらの合計の 2 乗を見つけると、うまくいきました。コードは次のとおりです: https://gist.github.com/abidrahmank/7021023
  3. 各段階でデータを 1 つずつチェックし始めました。GPUにロードする直前の入力画像は問題ありません。しかし、カーネル内をチェックしたときの入力データは常に 255 です。 (ここで 14 行目を確認してください)
  4. 最後に、すべての GPU データを使用してゼロに設定しCudaMemset、カーネル内の入力データをチェックしましたが、まだ 255 です。

したがって、StackOverflowで他の質問をする他のオプションはありません。

誰が私が犯している間違いを教えてもらえますか?

4

2 に答える 2

2

カーネル署名は次のように述べています。

__global__ void kernel(unsigned char* d_in, unsigned char* d_out)

しかし、あなたはそれを次のように呼びます:

kernel<<<rows,cols>>>(d_out, d_in);

どっちが入ってどっちが出る

過去にかなりの数の CUDA プログラミングを行ってきたので、カーネルを手作りする代わりにThrustを使用することを強くお勧めします。生のカーネルでもthrust::for_each打ち負かすのは難しいです。

于 2013-10-17T08:42:55.117 に答える