【问题标题】:CUDA texture as a class member?CUDA 纹理作为类成员?
【发布时间】:2022-01-03 19:17:43
【问题描述】:

尝试定义具有每个实例纹理的类。是的,该类的实例数量会很少。为了解决 CUDA 纹理必须是全局变量的限制,我尝试了以下方法:

  • 定义一个全局纹理表。
  • 向类添加实例 ID 数据成员。
  • 让类方法使用其 ID 从表中选择纹理,并将其作为参数传递给 CUDA 内核。

不起作用。纹理不能作为参数传递(也不能通过指针或引用),并且内核无法识别数组名称,除非通过索引传递。 我可能可以用 switch 语句来做到这一点,但这很难看。 有什么建议吗?

【问题讨论】:

    标签: cuda textures cuda-arrays


    【解决方案1】:

    如果您的 GPU 的计算能力 >= 3.0,那么您可以使用纹理对象而不是纹理引用。然后,您可以将纹理对象作为内核/函数参数传递或将其用作类成员。请参阅 Cuda 编程指南第 B.8 节或Texture objects

    如果您没有 CC 3.0 或更高版本的设备,我猜您不走运,并且需要在您的内核中使用“丑陋”的 switch 语句来选择正确的纹理引用,具体取决于在一些争论上​​。

    【讨论】:

    • 需要一个 switch 语句,但不在内核中。
    • 你说得对,在回答我想在内核中使用多个纹理并在每个线程的基础上切换数据的问题时。但实际上没有证据表明提问者想要这样做,为什么在内核启动之前切换到正确的纹理参考绝对是更好的选择。
    • 要在每个线程的基础上切换,最好的选择是将纹理组合成一个大纹理,然后在每个线程中操作采样位置。
    【解决方案2】:

    您可以在调用内核之前绑定您需要的纹理。

    因此,您有一个纹理引用和任意数量的纹理存储在例如 cuArrays 中。在调用内核之前,将引用绑定到所需的 cuArray:

    texture<float, cudaTextureType2D, cudaReadModeElementType> texRef;
    
    if (need_texture_1) {
      cudaBindTextureToArray(texRef, cuArray1, ...);
    else if (need_texture_2) {
      cudaBindTextureToArray(texRef, cuArray2, ...);
    }
    kernel<<<>>>();
    
    __global__ void kernel() {
      var = tex2D<float>(texRef, ...);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-02
      • 2014-12-30
      • 2023-04-05
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2013-10-15
      • 2017-10-24
      • 2018-04-24
      相关资源
      最近更新 更多