解除绑定到线性内存或CUDA数组的CUDA纹理的目的是什么?纹理解除绑定的目的?
在我的许多CUDA程序中,我使用的纹理必须使用cudaBindTexture2D
来调整线性内存。在函数结束时,我使用cudaUnbindTexture
来释放纹理。
有几次发生了,我忘记解开纹理。但对功能的性能和结果没有明显的影响。
是否真的有必要解开纹理?如果我不解除绑定,会有什么后果? 它会导致内存泄漏吗?
解除绑定到线性内存或CUDA数组的CUDA纹理的目的是什么?纹理解除绑定的目的?
在我的许多CUDA程序中,我使用的纹理必须使用cudaBindTexture2D
来调整线性内存。在函数结束时,我使用cudaUnbindTexture
来释放纹理。
有几次发生了,我忘记解开纹理。但对功能的性能和结果没有明显的影响。
是否真的有必要解开纹理?如果我不解除绑定,会有什么后果? 它会导致内存泄漏吗?
每种体系结构都有限制可以同时绑定多少纹理。该编号在CUDA C编程指南中列为Maximum number of textures that can be bound to a kernel
。 CC <的值为128,CC> = 3的值为256.如果不取消绑定纹理,程序将无法处理超过此数量的纹理。
在搅拌机循环,达到限制将输出图像是这样的:
代码是在这里(intern/cycles/render/image.cpp
)
if(slot == images.size()) {
/* max images limit reached */
if(images.size() == tex_num_images) {
printf("ImageManager::add_image: byte image limit reached %d, skipping '%s'\n",
tex_num_images, filename.c_str());
return -1;
}
images.resize(images.size() + 1);
}
这意味着,如果我在不解除纹理的情况下连续调用该函数,最终,128的极限将耗尽,程序将失败? – sgarizvi
我不知道是否重复绑定相同的纹理占用额外的插槽。如果您发现问题是否存在,请添加答案让我们知道。 –
好吧,我会试试看。 – sgarizvi