当曲速的所有线程读取相同的全局内存时发生了什么



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

此外,有人能解释一下公交车使用的概念吗?缓存加载和非缓存加载之间的区别是什么?我在中看到了这个概念http://theinf2.informatik.uni-jena.de/theinf2_multimedia/Website_downloads/NVIDIA_Fermi_Perf_Jena_2011.pdf.

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

对于AMD GPU,我可以不假思索地回答您的问题。对于英伟达来说,谷歌搜索很快就找到了答案。

我想知道当warp的所有线程读取相同的32位全局内存地址时发生了什么。有多少内存请求那里是否有序列化。GPU是费米卡编程环境为CUDA4.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:

半经线中的第K个线程必须访问段中的第K个字;但是,并不是所有线程都需要参与

合并计算能力
1.2和1.3:

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

因此,在任何>=计算能力1.2中,让warp的所有线程访问相同的32位全局内存地址听起来都会像预期的那样工作。但对于1.0和1.1则不然。

你的卡没问题。

我必须承认,我没有为英伟达测试过这个。我已经为AMD测试过了。


缓存和未缓存负载之间的差异

首先,请看您所参考的演示文稿的幻灯片4,http://theinf2.informatik.uni-jena.de/theinf2_multimedia/Website_downloads/NVIDIA_Fermi_Perf_Jena_2011.pdf.

即题为"CPU和GPU之间的差异"的幻灯片,其中说CPU有巨大的缓存,而GPU没有。

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

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

基本上,缓存就像本地内存。无论是GPU的专用DRAM还是CPU的系统内存,缓存和本地内存都比DRAM、主内存更接近处理器或GPU。DRAM主存储器被称为Nvidia Global memory。幻灯片9对此进行了说明。

缓存和本地内存都比DRAM全局内存更接近GPU:在幻灯片9中,它们被绘制为与GPU位于同一芯片内,而DRAM是单独的芯片。这可能会对延迟、吞吐量、电源以及总线利用率(与带宽有关)产生一些好的影响。

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

吞吐量/带宽:本地内存和/或缓存的带宽通常比DRAM全局内存的带宽多。您的幻灯片显示1 TB/s以上,而177 GB/s,即缓存和本地内存的速度要快5倍多。这种更高的带宽可以转化为显著更高的帧速率。

功率:你节省了大量的功率去缓存或本地内存,而不是去DRAM全局内存。这对台式游戏电脑来说可能不重要,但对笔记本电脑或平板电脑来说很重要。事实上,这甚至对台式游戏PC来说也很重要,因为功率越小意味着它可以更快地计时。

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

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

但缓存也有缺点。

首先,它们实际上比本地内存消耗更多的能量——或者,如果真的有单独的本地和全局内存,它们会消耗更多的功率。然而,在费米中,本地存储器可以被配置为高速缓存,反之亦然。(多年来,GPU的人说"我们不需要臭缓存——缓存标签和其他开销是非常浪费的。">

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

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

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

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

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

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

最新更新