我在CUDA中编写了一个用于加载JPEG文件的lib和一个显示它们的查看器。 这两个部分都大量使用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上几个属性的较高数字会在某处产生溢出?
任何提示都会非常感激。
我在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之后没有执行任何操作。
我真的不能认为内核本身就是问题,但我不知道什么可以影响我看到的行为。
祝你好运, 托。
答案 0 :(得分:1)
好的,我发现了问题。由于JPEG解码器是一个库,我给用户一些解码的灵活性,所以在调用CUDA内核时,我没有固定的网格/线程参数,而是使用我在初始化时设置的预初始化值以及用户可以覆盖的值。这些默认值来自GPU使用的CUDA属性,但我没有使用正确的值。网格为2147483647,但65535是允许的最大值。