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 の後には何も実行されていないことがわかります。
そのカーネル自体が問題だとは本当に思いませんが、私が見ている動作に何が影響するのかわかりません。
よろしく、トルステン。