【问题标题】:What happened when all thread of a warp read the same global memory?当一个 warp 的所有线程读取相同的全局内存时会发生什么?
【发布时间】:2012-05-30 18:49:13
【问题描述】:

我想知道当一个 warp 的所有线程读取相同的 32 位全局内存地址时会发生什么。有多少内存请求?有没有序列化。 GPU为Fermi卡,编程环境为CUDA 4.0。

此外,任何人都可以解释总线利用率的概念吗?缓存加载和非缓存加载有什么区别?我在http://theinf2.informatik.uni-jena.de/theinf2_multimedia/Website_downloads/NVIDIA_Fermi_Perf_Jena_2011.pdf看到了这个概念。

【问题讨论】:

    标签: cuda gpgpu gpu


    【解决方案1】:

    warp 中的所有线程访问全局内存中的相同地址

    我可以回答您关于 AMD GPU 的问题。对于 Nvidia,谷歌搜索很快就能找到答案。

    我想知道当一个 warp 的所有线程读取相同的 32 位全局内存地址时会发生什么。有多少内存请求 那里?有没有序列化。 GPU是费米卡, 编程环境为CUDA 4.0。

    http://developer.download.nvidia.com/CUDA/training/NVIDIA_GPU_Computing_Webinars_Best_Practises_For_OpenCL_Programming.pdf,2009 年,说:

    合并:

    全局内存延迟:400-600 个周期。唯一最重要的 性能考虑!

    半扭曲线程的全局内存访问可以合并为 一个大小为 8 位、16 位、32 位、64 位或两个字的事务 128 位的事务。

    全局内存可以看作是由 16 个对齐的段和 32 字。

    计算能力 1.0 和 1.1 中的合并:

    half warp 中的第 k 个线程必须访问段中的第 k 个单词; 但是,并非所有线程都需要参与

    计算能力的合并
    1.2 和 1.3:

    合并适合段大小的任何访问模式

    因此,在任何 >= Compute Capability 1.2 中,让一个 warp 的所有线程访问相同的 32 位全局内存地址听起来都可以正常工作。但不适用于 1.0 和 1.1。

    你的卡没问题。

    我必须承认我没有为 Nvidia 测试过这个。我已经针对 AMD 进行了测试。


    缓存和非缓存加载的区别

    首先,请查看您提到的演示文稿的第 4 张幻灯片,http://theinf2.informatik.uni-jena.de/theinf2_multimedia/Website_downloads/NVIDIA_Fermi_Perf_Jena_2011.pdf

    即标题为“CPU 和 GPU 之间的差异”的幻灯片 - 说明 CPU 具有巨大的缓存,而 GPU 没有。

    几年前,这张幻灯片可能会说 GPU 根本没有任何缓存。然而,GPU 已经开始添加越来越多的缓存,和/或越来越多地切换到本地缓存。

    我不确定您是否了解计算机体系结构中的“缓存”是什么。这是一个很大的话题,所以我只提供一个简短的答案。

    基本上,缓存就像本地内存。缓存和本地内存 - 比 DRAM、主内存更接近处理器或 GPU - 无论是 GPU 的私有 DRAM 还是 CPU 的系统内存。 DRAM 主存储器被 Nvidia Global Memory 称为。幻灯片 9 说明了这一点。

    缓存和本地内存都比 DRAM 全局内存更接近 GPU:在幻灯片 9 上,它们被描绘为与 GPU 位于同一芯片内,而 DRAM 是独立的芯片。这可以对延迟、吞吐量、功率以及,是的,总线利用率(与带宽相关)产生几个很好的影响。

    延迟:全局内存需要 400-800 个周期。这意味着如果您的应用程序中只有一个 warp,那么它每 400-800 个周期只会执行一次内存操作。这意味着,为了不减慢速度,您需要许多线程/warp 产生可以并行运行的内存请求,即具有高 MLP(内存级并行度)。幸运的是,图形通常会这样做。缓存更接近,因此延迟更低。你的幻灯片没有说它是什么,但其他地方说 50-200 个周期,比全局内存快 4-8 倍。这意味着需要更少的线程和扭曲以避免变慢。

    吞吐量/带宽:本地内存和/或缓存的带宽通常大于 DRAM 全局内存的带宽。你的幻灯片说 1+ TB/s 与 177 GB/s - 即缓存和本地内存快 5 倍以上。这种更高的带宽可以转化为显着更高的帧速率。

    电源:您可以节省大量用于缓存或本地内存的电量,而不是 DRAM 全局内存。这对于台式游戏 PC 可能无关紧要,但对于笔记本电脑或平板电脑却很重要。实际上,即使对于台式游戏 PC 而言,它也很重要,因为更少的功率意味着它可以更快地(超)频。

    好的,那么上面的本地和缓存内存是相似的吗?有什么区别?

    基本上,缓存比本地内存更容易编程。非常好,专家,nionja 程序员需要正确管理本地内存,根据需要从全局内存中复制内容,并将其刷新。而缓存内存更容易管理,因为您只是进行缓存加载,并且内存会自动放入缓存中,下次访问速度会更快。

    但是缓存也有缺点。

    首先,它们实际上比本地内存消耗更多的能量——或者,如果实际上有单独的本地和全局内存,它们会消耗更多的能量。然而,在 Fermi 中,本地内存可以配置为缓存,反之亦然。 (多年来,GPU 人员一直说“我们不需要糟糕的缓存——缓存标签和其他开销只是浪费。)

    更重要的是,缓存倾向于在缓存行上运行 - 但并非所有程序都这样做。这导致您提到的总线利用率问题。如果 warp 访问缓存行中的所有单词,那就太好了。但是,如果一个 warp 只访问高速缓存行中的 1 个字,即 1 个 4 字节字,然后跳过 124 个字节,则通过总线传输 128 个字节的数据,但只使用 4 个字节。 IE。 > 96% 的总线带宽被浪费了。这是总线利用率低的原因。

    而下一张幻灯片显示,非缓存加载(可能用于将数据加载到本地内存中)只会传输 32 个字节,因此“只有”32 个字节中的 28 个字节被浪费了。换句话说,非缓存加载可能比缓存加载效率高 4 倍,速度快 4 倍。

    那为什么不到处使用非缓存加载呢?因为它们更难编程——它需要专业的忍者程序员。并且缓存在很多时候都能很好地工作。

    因此,与其花钱请专业忍者程序员花大量时间优化所有代码以使用非缓存加载和手动管理的本地内存,不如使用缓存加载来做简单的事情,然后让高薪专家忍者程序员专注于缓存不能很好处理的东西。

    此外:没有人愿意承认这一点,但缓存通常比专业忍者程序员做得更好。

    希望这会有所帮助。 吞吐量、功率和总线利用率:除了降低

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 2014-02-11
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多