Cuda内核似乎阻止,启动超时并被终止

时间:2012-08-21 19:11:11

标签: cuda

我在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上几个属性的较高数字会在某处产生溢出?

  • warp 32中的主题
  • 每块1024个最大线程数
  • max thread dim 1024 1024 64
  • max grid dim 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之后没有执行任何操作。

我真的不能认为内核本身就是问题,但我不知道什么可以影响我看到的行为。

祝你好运, 托。

1 个答案:

答案 0 :(得分:1)

好的,我发现了问题。由于JPEG解码器是一个库,我给用户一些解码的灵活性,所以在调用CUDA内核时,我没有固定的网格/线程参数,而是使用我在初始化时设置的预初始化值以及用户可以覆盖的值。这些默认值来自GPU使用的CUDA属性,但我没有使用正确的值。网格为2147483647,但65535是允许的最大值。