0

JPEGファイルとそれらを表示するビューアをロードするCUDAのlibを書きました。どちらの部分も CUDA を多用しており、ソースは SourceForge にあります。

cuview & cujpeg

画像を RGB データとして GPU メモリに保存し、RGB データの長方形配列をある画像から別の画像にコピーする関数 bitblt を持っています。

コードは、CUD3.x を搭載した GTX580 を搭載した最後の PC で正常に動作しました (これ以上復元できません)。

今、私は GTX680 を持っていて、CUDA 4.x を使用しています。

カーネルは次のようになります。GTX580 / CUDA 3.x では問題なく動作しました。

__global__ void cujpeg_k_bitblt(CUJPEG* dd, CUJPEG* src, int sx, int sy, int tx, int ty, int w, int h)
{
  unsigned char* sb;
  unsigned char* s;
  unsigned char* db;
  unsigned char* d;
  int tid;
  int x, y;
  int xs, ys, xt, yt;
  int ws, wt;

  sb = src->dev_rgb;
  db = dd->dev_rgb;

  ws = src->stride;
  wt = dd->stride;

  for(tid = threadIdx.x + blockIdx.x * blockDim.x; tid < w * h; tid += blockDim.x * gridDim.x) {
    y = tid / w;
    x = tid - y * w;

    xs = x + sx;
    ys = y + sy;

    xt = x + tx;
    yt = y + ty;

    s = sb + (ys * ws + xs) * 3;
    d = db + (yt * wt + xt) * 3;

    d[0] = s[0];
    d[1] = s[1];
    d[2] = s[2];
  }
 }

GTX680 のいくつかのプロパティの数値が高いと、どこかでオーバーフローが発生するのでしょうか?

  • たて糸 32
  • ブロックあたりの最大スレッド数 1024
  • 最大スレッド薄暗い 1024 1024 64
  • 最大グリッド薄暗い 2147483647 65535 65535

ヒントをいただければ幸いです。

Linux で開発し、OpenSuSE 12.1 を使用しています。

よろしく、トルステン。

編集、2012-08-22: 私は使用します: devdriver_4.0_linux_64_270.40.run cudatools_4.0.13_linux_64.run cudatoolkit_4.0.13_linux_64_suse11.2.run

その関数 bitblt のタイミングについて: Cuda 3.x と GTX580 を搭載した私の最後の PC では、その関数は数ミリ秒かかりました。数秒後にタイムアウトするようになりました。他のカーネルが実行されています。bitblt への呼び出しをコメントアウトすると、すべて正常に実行されます。また、printf() を使用すると、bitblt の前のすべての呼び出しは問題なく、bitblt の後には何も実行されていないことがわかります。

そのカーネル自体が問題だとは本当に思いませんが、私が見ている動作に何が影響するのかわかりません。

よろしく、トルステン。

4

1 に答える 1

1

わかりました、問題が見つかりました。JPEG デコーダーはライブラリーであるため、ユーザーにデコードの柔軟性を与えるため、CUDA カーネルを呼び出すときは、グリッド/スレッドの固定パラメーターはありませんが、初期化時に設定し、ユーザーが上書きできる事前に初期化された値を使用します。これらのデフォルト値は、使用されている GPU の CUDA プロパティから取得されますが、正しい値ではありません。グリッドは 2147483647 ですが、許容される最大値は 65535 です。

于 2013-01-01T10:56:53.547 に答える