0

我在 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 之后没有执行任何操作。

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

最好的问候,托斯滕。

4

1 回答 1

1

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

于 2013-01-01T10:56:53.547 回答