589
社区成员




我原本理解的Texture Memory是Global Memory的一部分,就像Constant Memory一样,是一块具有固定大小(例如Constant memory就是64K)的Memory。但是似乎我的理解有问题。
首先是我的实验,我使用Texture Memory的方法是先声明纹理对象,之后开辟了cudaArray,再将cudaArray通过`cudaBindTextureToArray()`绑定到纹理对象上。我发现无论我的cudaArray有多大,只要不超过GPU的整体显存,绑定都是成功的。
其次根据CUDA C++ Programming Guide的计算能力表,其中有关Texture Memory的部分给出的限制是:
是否可以理解成,绑定到2D TextureMemory的cudaArray,只要数组的长和宽不超过131072和65536个元素,绑定都能成功?
你正确地描述了在使用 CUDA 中的纹理内存时的一般步骤。通过将 CUDA 数组(cudaArray
)与纹理对象绑定,可以让纹理内存在 GPU 上访问数据。
关于第一个问题,只要分配的 cudaArray
大小不超过 GPU 的总内存大小,绑定操作通常是成功的。然而,这并不意味着您可以无限制地分配和绑定大尺寸的 cudaArray
。尽管尺寸在 GPU 内存限制范围内,但仍然需要注意可用内存的其他因素,例如用于其他目的的内存、驱动程序保留的内存等。另外,特定 GPU 设备和驱动程序版本可能会有一些限制。
关于第二个问题,CUDA C++ Programming Guide 中的计算能力表中给出的最大纹理尺寸是指每个维度(长和宽)上的最大允许值。对于 2D 纹理内存,计算能力表中允许的最大值是 131072 × 65536 个元素。但请注意,这只是设备的规范上的限制,并不意味着所有设备都能实际支持这么大的纹理。
在实际使用时,您应该始终检查设备的内存容量和纹理的尺寸进行合理的分配和绑定。可以使用 CUDA 运行时 API 或设备属性来查询设备的内存容量。
最好的做法是在代码中使用错误检查和设备属性查询来保证正确的内存分配和绑定操作,以便根据具体的设备和情况来处理可能发生的错误或限制。