CUDA纹理作为班级成员?

时间:2014-03-01 00:50:55

标签: cuda textures

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

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

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

2 个答案:

答案 0 :(得分:2)

如果您的GPU具有Compute Capability> = 3.0,那么您可以使用纹理对象而不是纹理参考。然后,您可以将纹理对象作为内核/函数参数传递,或将其用作类成员。参见Cuda编程指南B.8部分或Texture objects

如果您没有使用CC 3.0或更高版本的设备,我猜您运气不好,并且需要一个,如您所说,内核中的“丑陋”切换语句选择正确的纹理参考依赖在一些论点上。

答案 1 :(得分: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, ...);
}