有人可以解释在Cuda的上下文中使用的纹理内存的差异,而不是在DirectX的上下文中使用的纹理内存。假设显卡有512 MB的广告内存,它如何分为恒定内存/纹理内存和全局内存。
E.g。我有一张tesla卡,其totalConstMem为64KB,totalGlobalMem为4GB,由cudaGetDeviceProperties查询,但没有变量告诉我需要多少纹理内存。
此外,通过DirectX等图形API访问“纹理内存”多少。我没有使用这些API进行编程的经验,因此我不知道他们如何以及可以访问哪种内存。但AFAIK,所有内存访问都是硬件缓存的。如果我错了,请纠正我。
在KoppeKTop的回答之后:在CUDA和DirectX的情况下,共享内存是否也充当纹理内存的自动缓存?我不认为有另一个h / w缓存无论如何都会有意义。它是否也意味着如果我在内核中使用整个共享内存,纹理内存将不会被缓存?
感谢。
答案 0 :(得分:2)
实际上,我从未处理过DirectX,但我可以用CUDA纹理解释这种情况。纹理是简单数组(cudaArray或pitched array),具有缓存的只读访问权限,存储在全局内存中。因此,512 MB卡上的一个大纹理的最大尺寸是512 Megs(实际上稍微少一点,但这还不够)。它被优化为访问2D空间中的数据(它被缓存为2D切片)。也可以在访问时转换坐标和值(有关详细信息,请参阅CUDA编程指南)。
不,并非所有内存都在访问时缓存(对于具有计算能力1.x的CUDA设备)。只有常量和纹理内存。计算能力> = 2.0(Fermi)的设备使用L1和L2缓存(或仅L2 - 可配置)缓存所有内存访问。
答案 1 :(得分:2)
在KoppeKTop的回答之后:那么 共享内存充当自动缓存 对于CUDA和CUDA的纹理记忆 DirectX兼而有之?我不认为 另一个h / w缓存是有意义的 无论如何。它是否也意味着,如果我 使用整个共享内存 内核,纹理内存不会得到 缓存?
对于GF100之前的版本(G80),GPU具有专用的全局常量和全局纹理缓存(两者都是只读的)。共享内存有自己的专用内存库。
对于GF100代,您仍然拥有专用的纹理缓存,但现在共享内存和L1缓存(缓存全局内存)之间共享相同的片上内存。如果使用CUDA,则可以配置此内存的拆分方式。对于DirectX / OpenGL,图形驱动程序使用48KB共享内存/ 16KB L1缓存配置。
在任何情况下,共享内存总是由软件管理(除非专用于GF100上的L1缓存的部分),并且不要吃掉纹理缓存。