尝试使用每实例纹理定义一个类。是的,该类的实例数量很少。要解决CUDA纹理必须是全局变量的限制,我尝试了以下方法:
不起作用。纹理不能作为参数传递(也不能通过指针或引用),并且内核无法识别数组名称,禁止通过索引传递。 我可以用switch语句来做,但这很难看。 有什么建议吗?
答案 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, ...);
}