我在 CUDA 中编写了一个加载 JPEG 文件的库和一个显示它们的查看器。这两部分都大量使用了 CUDA,来源在 SourceForge:
cuview & cujpeg
我将图像作为 RGB 数据存储在 GPU 内存中,并且我有一个函数 bitblt,它将 RGB 数据的矩形数组从一个图像复制到另一个图像。
该代码在我的最后一台带有 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 之后没有执行任何操作。
我真的不能认为内核本身就是问题,但我不知道什么会影响我看到的行为。
最好的问候,托斯滕。