我浏览了编程指南和最佳实践指南,并提到全球内存访问需要400-600个周期。我在其他内存类型上看不到太多,例如纹理缓存,常数缓存,共享内存。寄存器具有0个内存延迟。

我认为,如果所有线程在常数缓存中使用相同的地址,则常量缓存与寄存器相同。最坏的情况我不太确定。

只要没有银行冲突,共享记忆与寄存器相同?如果有潜伏期如何展开?

那纹理缓存呢?

有帮助吗?

解决方案

共享/常数/纹理记忆的延迟很小,取决于您拥有的设备。通常,尽管GPU被设计为吞吐量体系结构,这意味着通过创建足够的线程,可以隐藏到包括全局内存在内的记忆的延迟。

指南谈论全球记忆的延迟的原因是,延迟的延迟比其他记忆的延迟高,这意味着要优化的延迟是主要的延迟。

您特别提到了常数缓存。您是正确的,如果经纱中的所有线程(即32个线程组)访问相同的地址,则没有惩罚,即同时从缓存和广播到所有线程的值。但是,如果线程访问不同的地址,则访问必须 连载 由于缓存一次只能提供一个值。如果您使用的是CUDA Profiler,则将显示在序列化计数器下。

与恒定缓存不同的共享内存可以提供更高的带宽。查看 CUDA优化 讨论更多细节以及对银行冲突及其影响的解释。

其他提示

对于(开普勒)特斯拉K20,潜伏期如下:

全局内存:440个时钟
恒定内存
L1:48个时钟
L2:120个时钟
共享内存:48个时钟
纹理内存
L1:108个时钟
L2:240个时钟

我怎么知道?我运行了由作者所描述的微基准 通过微实验测试揭开GPU微体系结构的神秘面纱. 。它们为较旧的GTX 280提供了类似的结果。

这是在Linux群集上测量的,Linux群集是我运行基准的计算节点,没有其他用户使用或运行任何其他进程。它是Bullx Linux,具有8个核心XEON和64 GB RAM,NVCC 6.5.12。我改变了 sm_20sm_35 用于编译。

还有一个 操作数的成本 PTX ISA中的章节虽然不是很有帮助,但它只是重申您已经期望的内容,而无需提供精确的数字。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top