1

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

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

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

4

2 回答 2

2

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

如果您没有 CC 3.0 或更高版本的设备,我猜您运气不好,并且需要在您的内核中使用“丑陋”的 switch 语句,根据某些参数选择正确的纹理引用.

于 2014-03-01T10:58:15.177 回答
1

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

因此,您有一个纹理引用和任意数量的纹理存储在例如 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, ...);
}
于 2014-03-02T19:24:16.927 回答