3

有人可以解释一下在 Cuda 上下文中使用的纹理内存与在 DirectX 上下文中使用的纹理内存的区别。假设显卡有 512 MB 的标称内存,它是如何划分为常量内存/纹理内存和全局内存的。

例如,我有一张 tesla 卡,其 totalConstMem 为 64KB,totalGlobalMem 为 4GB,由 cudaGetDeviceProperties 查询,但没有变量告诉我需要多少纹理内存。

此外,当通过 DirectX 等图形 API 访问时,“纹理内存”是多少。我没有这些 API 的编程经验,所以我不知道他们可以如何访问以及访问什么样的内存。但是AFAIK,所有的内存访问都是硬件缓存的。如果我错了,请纠正我。

在 KoppeKTop 的回答之后:那么在 CUDA 和 DirectX 的情况下,共享内存是否充当纹理内存的自动缓存?无论如何,我不认为拥有另一个硬件缓存是有意义的。这是否也意味着如果我在内核中使用整个共享内存,纹理内存就不会被缓存?

谢谢。

4

2 回答 2

2

实际上,我从未处理过 DirectX,但我可以用 CUDA 纹理解释这种情况。纹理是具有缓存只读访问权限的简单数组(cudaArray 或倾斜数组),存储在全局内存中。因此,512 MB 卡上一个大纹理的最大大小为 512 Megs(实际上要小一些,但还不够)。它针对访问 2D 空间中的数据进行了优化(它被缓存为 2D 切片)。坐标和值也可以在访问时进行转换(有关详细信息,请参阅 CUDA 编程指南)。

不,并非所有内存都在访问时缓存(对于具有计算能力 1.x 的 CUDA 设备)。只有常量和纹理内存。计算能力 >= 2.0 (Fermi) 的设备使用 L1 和 L2 缓存(或仅 L2 - 它是可配置的)缓存所有内存访问。

于 2010-08-03T14:44:42.407 回答
2

在 KoppeKTop 的回答之后:那么在 CUDA 和 DirectX 的情况下,共享内存是否充当纹理内存的自动缓存?无论如何,我不认为拥有另一个硬件缓存是有意义的。这是否也意味着如果我在内核中使用整个共享内存,纹理内存就不会被缓存?

对于 GF100 之前的一代 (G80),GPU 具有专用的全局常量和全局纹理缓存(两者都是只读的)。共享内存有自己的专用内存库。

对于 GF100 一代,您仍然拥有专用的纹理缓存,但现在共享内存和 L1 缓存(缓存全局内存)之间共享相同的片上内存。如果您使用 CUDA,您可以配置此内存的拆分方式。对于 DirectX/OpenGL,图形驱动程序使用 48KB 共享内存/16KB L1 缓存配置。

In any case shared-memory is always software-managed (unless the part dedicated to L1 cache on GF100), and don't eat up on texture caches.

于 2010-08-03T23:46:40.513 回答