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

时间:2013-06-14 11:34:26

标签: cuda

如果一个线程正在访问全局内存,为什么它会访问一个大块呢?这个大块存放在哪里?

如果以合并的方式从全局内存中读取,将全局内存的一个常见块复制到共享内存中会有用,还是没有任何改进。

ie:如果每个线程正在读取下一个5或10或100个内存位置,并对它们求平均值,如果你可以将一大块X点从全局内存装入共享内存,你能否写一个if语句来说明你是否寻找这些内存值之一,从共享内存而不是全局读取?我假设经线偏差罚分将小于每次读取全局记忆。

enter image description here

1 个答案:

答案 0 :(得分:4)

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

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

可能这些数据被随后的全局内存负载驱逐,可能不会。因此,原则上,如果您正在读取“小”数据块,则无需强制数据位于共享内存中,以便下次快速访问它们。

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

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

请注意,以上是全局内存传输背后的一般理念。实现细节可能因底层架构而异。

*应注意到Il可以通过编译器选项禁用L1缓存行。这在随机访问数据模式的性能方面很有用。