寻找一种将 cudaSurfaceObject_t 转换为 cudaTextureObject_t 的有效方法

looking for an efficient way to convert cudaSurfaceObject_t into a cudaTextureObject_t

我将要编写一些代码,这些代码将从一个间距线性 float 数组开始,它将被加载到设备内存中,进行分析、更改,然后变成只读纹理相同尺寸的物体。 我认为最好的方法是从浮点数中创建一个 cudaSurfaceObject_t,对其进行处理,然后将该表面对象转换为 cudaTextureObject_t卡上。

我的问题是我只知道如何从浮点数组创建纹理;我不知道有什么方法可以在不将数组复制回主机并从中创建纹理对象的情况下从表面对象创建一个...

有没有办法在卡上做这个而不需要复制的开销?

我怀疑这可以使用底层 cudaArray 对象来完成,但我不太了解如何做。

对我的问题的简短回答是,可以通过使用底层 cudaArray 对象从表面对象创建纹理对象。

过程是:-

  1. 获取起始数组并将其复制到设备上。
  2. 创建正确尺寸的 cudaArray_t 对象。
  3. 从 cudaArray_t 创建一个 surfaceObject_t。
  4. 将原始数据映射到表面(内核 1)。
  5. 根据需要处理表面(内核 2)。
  6. 将相同的 cudaArray 对象绑定到纹理对象。
  7. 正常访问纹理(内核 3)。

我不在这里发布代码,因为我认为评论中共享的示例@RobertCrovella 包含理解此代码所需的所有信息 那个 link 转贴在这里

请注意,@talonmies 在他的评论中也是正确的 - 您不能从表面转换为纹理。但是,您可以从附加到该表面的底层 cudaArray 创建纹理。

我要去阅读更多背景知识。