【问题标题】:Cuda 2d or 3d arraysCuda 2d 或 3d 数组
【发布时间】:2011-09-11 21:15:37
【问题描述】:

我正在处理一组(较大的 2k x 2k)图像
我需要对一堆连续图像进行逐像素操作。

对于使用单个 2D 大纹理 + 计算偏移与使用 3D 数组有什么意见吗?

在 CUDA api 中,3D 数组似乎有点“脱离主流”,分配传递函数与相同的 2D 函数有很大不同。

似乎没有关于 CUDA 的更高级别“如何以及为什么”而不是具体调用的任何好的文档

有best practices guide,但它没有解决这个问题

【问题讨论】:

  • 您是否多次阅读图像?否则使用纹理似乎有点多..
  • @pavan 我正在将视频序列放入卡中并进行一些图像图像处理,然后渲染处理后的视频。使用 opengl PBO 似乎是最简单的方法
  • 我个人避免使用纹理,主要是因为它们的文档很糟糕。绑定和解除绑定纹理也需要很多时间。不过,我无法评论使用 cuda 纹理和 opengl PBO。

标签: cuda


【解决方案1】:

我建议您阅读“Cuda by Example”一书。它也涵盖了所有这些没有记录的事情,并解释了“如何以及为什么”。

我认为如果要渲染 CUDA 内核的结果,应该使用 OpenGL 互操作。这样,您的代码在 GPU 上处理图像并将处理后的数据留在那里,从而使其渲染速度更快。书中有一个很好的例子。

如果每个 CUDA 线程只需要从第一帧读取一个像素,从下一帧读取一个像素,则不需要使用纹理。只有当每个线程都在读取一堆连续的像素时,纹理才会使您受益。所以你最好使用 3D 数组。

【讨论】:

  • 我读过,但是 3D 数组是一个新特性,书中没有介绍。使用纹理使 openGL 互操作变得更加容易,并且大多数图像处理例程无论如何都会访问相邻像素。
  • 当然,使用纹理没有问题。如果您打算使用少量帧,那么您可以定义多个 1D 或 2D 纹理纹理。您提到您正在逐帧执行操作,因此您只需要 2 个纹理,例如纹理 A 和 B。您将第 1 帧和第 2 帧加载到 A 和 B 中,然后您的内核处理 A 和 B。然后您只需替换第 1 帧和第 3 帧,然后您的内核将处理纹理 B 和 A(按此顺序),这相当于处理第 2 帧和第 3 帧。
  • @r2jitsu - 这就是我所做的。 cuda 对纹理数组的支持很差,而且 3d 令人困惑,所以我只是将纹理设置为 N 倍高,然后处理要处理的帧。
【解决方案2】:

以下是使用 CUDA 和 3D cuda 数组的示例: https://github.com/nvpro-samples/gl_cuda_interop_pingpong_st

【讨论】:

    猜你喜欢
    • 2021-12-30
    • 2022-06-10
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多