【问题标题】:Total/texture accessible memory by DirectX/Cuda/OpenGLDirectX/Cuda/OpenGL 的总/纹理可访问内存
【发布时间】:2011-03-24 16:19:24
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: opengl directx cuda gpu gpgpu


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      在 KoppeKTop 的回答之后: 共享内存充当自动缓存 在 CUDA 和 DirectX 两者?我不认为有 另一个硬件缓存是有意义的 反正。这是否也意味着如果我 使用整个共享内存 内核,纹理内存不会得到 缓存?

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

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

      在任何情况下,共享内存始终由软件管理(除非 GF100 上专用于 L1 缓存的部分),并且不会占用纹理缓存。

      【讨论】:

        猜你喜欢
        • 2011-02-08
        • 2015-04-16
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 2012-06-02
        • 2013-12-31
        • 2013-10-15
        • 1970-01-01
        相关资源
        最近更新 更多