GPU合并了全局内存访问与使用共享内存

Han*_*del 3 cuda

如果线程正在访问全局内存,为什么它要访问很大的块?这个大块存储在哪里?

如果您以合并的方式从全局内存中读取内容,那么将全局内存的公共块复制到共享内存中是否会有所帮助,或者没有任何改善。

即:如果每个线程都在读取下一个5、10或100个内存位置并取平均值,如果您可以将全局内存中的X点块放入共享内存中,那么您是否可以编写一条if语句来说明是否要寻找一个从共享内存而不是全局内存中读取这些内存值中的哪一个?我假设翘曲发散度的损失将小于每次从全局内存读取的次数。

在此处输入图片说明

Jac*_*ern 5

当您从全局内存中读取数据时,首先在L1高速缓存中搜索数据(高带宽,在Fermi上为1.600GB / s,但大小有限,在Fermi上为48KB),然后,如果L1中不存在数据,则在L2中搜索它们(较低的带宽,但大于L1,在Fermi上为768KB),最后,如果L2中不存在,则从全局内存中加载它们*。

当发生全局内存加载时,数据先移至L2,然后移至L1,以便下次需要进行全局内存读取时能够以更快的方式访问它们。

此类数据可能会被后续的全局内存加载逐出,可能不会。因此,原则上,如果您正在读取“小”数据块,则不必强制将数据放置在共享内存中,以便下次快速访问它们。

考虑到在Fermi和Kepler上,共享内存是由L1高速缓存的相同电路构成的。然后,您可以将共享内存视为受控的L1缓存

然后,您应该强制数据驻留在共享内存中,以确保它们驻留在“最快可用的缓存”上,并且在需要多次访问这些相同数据时执行此操作。

请注意,以上是全局内存传输背后的一般原理。实施细节可能因基础架构而异。

*应注意,可以通过编译器选项禁用L1高速缓存行。就随机访问数据模式的性能而言,这很有用。