我想知道当所有线程都读取全局内存的相同 32 位地址时会发生什么。有多少内存请求?有没有序列化。GPU为费米卡,编程环境为CUDA 4.0。
此外,任何人都可以解释公共汽车利用的概念吗?缓存加载和非缓存加载有什么区别?我在http://theinf2.informatik.uni-jena.de/theinf2_multimedia/Website_downloads/NVIDIA_Fermi_Perf_Jena_2011.pdf看到了这个概念。
我想知道当所有线程都读取全局内存的相同 32 位地址时会发生什么。有多少内存请求?有没有序列化。GPU为费米卡,编程环境为CUDA 4.0。
此外,任何人都可以解释公共汽车利用的概念吗?缓存加载和非缓存加载有什么区别?我在http://theinf2.informatik.uni-jena.de/theinf2_multimedia/Website_downloads/NVIDIA_Fermi_Perf_Jena_2011.pdf看到了这个概念。
我可以回答你关于 AMD GPU 的问题。对于英伟达来说,谷歌搜索很快就能找到答案。
我想知道当所有线程都读取全局内存的相同 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 个字节。即 >96% 的总线带宽被浪费了。这是低总线利用率。
而下一张幻灯片显示,非缓存加载(例如用于将数据加载到本地内存中)将仅传输 32 个字节,因此“仅”32 个字节中的 28 个字节被浪费。换句话说,非缓存加载可能比缓存加载效率高 4 倍,速度快 4 倍。
那么为什么不到处使用非缓存加载呢?因为它们更难编程——它需要专业的忍者程序员。并且缓存在很多时候都工作得很好。
因此,与其花钱请专业忍者程序员花大量时间优化所有代码以使用非缓存加载和手动管理的本地内存,不如使用缓存加载来做简单的事情,让高薪专家忍者程序员专注于缓存不能很好地工作的东西。
此外:没有人喜欢承认这一点,但缓存通常比专家忍者程序员做得更好。
希望这可以帮助。吞吐量、功率和总线利用率:除了降低