我查看了编程指南和最佳实践指南,并提到全局内存访问需要400-600个周期。我没有看到其他内存类型,如纹理缓存,常量缓存,共享内存。寄存器有0个内存延迟。
我认为如果所有线程在常量缓存中使用相同的地址,则常量缓存与寄存器相同。最坏的情况我不太确定。
只要没有银行冲突,共享内存与寄存器相同?如果有,那么延迟是如何展开的?
纹理缓存怎么样?
答案 0 :(得分:6)
对于(开普勒)特斯拉K20,潜伏期如下:
全球记忆:440个时钟
恒定记忆
L1:48个时钟
L2:120个时钟
共享内存:48个时钟
纹理记忆
L1:108个时钟
L2:240个时钟
我怎么知道?我运行了Demystifying GPU Microarchitecture through Microbenchmarking的作者描述的微基准测试。它们为旧版GTX 280提供了类似的结果。
这是在Linux集群上测量的,我运行基准测试的计算节点没有被任何其他用户使用或运行任何其他进程。它是BULLX linux,带有一对8核Xeon和64 GB RAM,nvcc 6.5.12。我将sm_20
更改为sm_35
进行编译。
PTX ISA中还有一个operands cost章虽然不是很有帮助,但它只是重申了你的期望,而没有提供准确的数字。
答案 1 :(得分:4)
共享/常量/纹理内存的延迟很小,取决于您拥有的设备。通常,虽然GPU被设计为吞吐量架构,这意味着通过创建足够的线程,隐藏了包括全局存储器在内的存储器的延迟。
指南讨论全局内存延迟的原因是延迟比其他内存的延迟高几个数量级,这意味着它是优化时考虑的主要延迟。
你特别提到了常量缓存。你是非常正确的,如果warp中的所有线程(即32个线程的组)访问相同的地址,则没有惩罚,即从缓存中读取值并同时向所有线程广播。但是,如果线程访问不同的地址,则访问必须序列化,因为缓存一次只能提供一个值。如果您正在使用CUDA Profiler,那么它将显示在序列化计数器下。
与常量缓存不同,共享内存可以提供更高的带宽。查看CUDA Optimization讨论,了解更多详细信息以及银行冲突及其影响的解释。