OpenCL/CUDA中每个内存访问类型有多少内存延迟周期?

smu*_*kes 5 memory cuda latency nvidia opencl

我查看了编程指南和最佳实践指南,并提到全局内存访问需要400-600个周期.我没有看到其他内存类型,如纹理缓存,常量缓存,共享内存.寄存器有0个内存延迟.

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

只要没有银行冲突,共享内存与寄存器相同?如果有,那么延迟是如何展开的?

纹理缓存怎么样?

the*_*ine 6

对于(开普勒)特斯拉K20,延迟如下:

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

我怎么知道?我通过Microbenchmarking运行了揭秘GPU微体系结构的作者所描述的微基准测试.它们为旧版GTX 280提供了类似的结果.

这是在Linux集群上测量的,我运行基准测试的计算节点没有被任何其他用户使用或运行任何其他进程.它是BULLX linux,带有一对8核Xeon和64 GB RAM,nvcc 6.5.12.我改变了sm_20sm_35编制.

PTX ISA中还有一个操作数成本章节,虽然它不是很有帮助,它只是重申你已经期望的内容,而没有给出精确的数字.


Tom*_*Tom 4

共享/常量/纹理内存的延迟很小,并且取决于您拥有的设备。一般来说,虽然 GPU 被设计为吞吐量架构,但这意味着通过创建足够的线程,可以隐藏内存(包括全局内存)的延迟。

指南谈论全局内存延迟的原因是,该延迟比其他内存高几个数量级,这意味着它是优化时需要考虑的主要延迟。

您特别提到了常量缓存。您说得非常正确,如果 warp 中的所有线程(即 32 个线程组)访问相同的地址,则不会有任何惩罚,即从缓存中读取该值并同时广播到所有线程。但是,如果线程访问不同的地址,则访问必须串行,因为缓存一次只能提供一个值。如果您使用 CUDA Profiler,那么这将显示在序列化计数器下。

与恒定缓存不同,共享内存可以提供更高的带宽。查看CUDA 优化演讲,了解更多详细信息以及库冲突及其影响的解释。