我的CUDA纹理内存大小是多少?

7
如何解释由deviceQuery示例输出的纹理内存信息以了解纹理内存大小? 以下是我的纹理内存输出。

最大纹理维度大小(x,y,z)1D =(65536),2D =(65536,65535),3D =(2048,2048,2048)
最大图层纹理大小(dim)x层数1D =(16384)x 2048,2D =(16384,16384)x 2048

2个回答

9

有一个普遍的误解,但在CUDA GPU中没有所谓的“纹理内存”。只有纹理,它们是全局内存分配,通过专用硬件访问,具有内置缓存、过滤和寻址限制,这些限制导致您在文档和设备查询中看到的大小限制。因此,限制要么是大约等于全局内存的可用空闲量(允许CUDA数组中的填充和对齐),要么是您已经引用的尺寸限制。


我有一个通过cudaMalloc分配的大数组。这个数组需要被多次引用。我想在这里使用纹理内存的特性。这是可能的吗? - username_4567
3
您可以将使用cudaMalloc分配的线性内存绑定到一维纹理。如果您需要更高维度的纹理,您需要使用分配内存或CUDA数组。 - talonmies
1
@talonmies 你所说的“pitched linear memory”是指由cudaMallocPitch()分配的内存吗? - sgarizvi
1
@sgar91:是的,cudaMallocPitchcudaMalloc3D是分配分页线性内存的常规方法。 - talonmies

3
输出结果显示,最大的纹理尺寸为:
对于1D纹理,为65536 对于2D纹理,为65536*65535 对于3D纹理,为2048*2048*2048
如果你想知道以字节为单位的大小,请将其乘以最大通道数(4)和最大子像素大小(4B)。
(对于分层纹理,请将您得到的维度相关数据乘以最大图层数。)
但是,这是单个纹理的最大尺寸,而不是所有纹理可用的内存大小。

但是假设我有一大块数据,那么我该如何知道它是否能够适应纹理内存呢? - username_4567
为此,您需要查询可用内存(cuMemGetInfo),而不是最大支持的内存。 - Danny Varod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接