当存在L1和L2缓存级别时,是否会发生同步全局内存访问到一个地址?

StackOverflow https://stackoverflow.com//questions/20014054

  •  21-12-2019
  •  | 
  •  

基于我所知道的,当扭曲的线程访问全局内存中相同的地址时,请求获得序列化,以便更好地使用常量内存。当GPU配备L1和L2缓存级别时(在FERMI和BELPER架构中)时,会发生同步全局内存访问是否发生了序列化?换句话说,当扭曲的线程访问相同的全局内存地址时,请从缓存存在中执行WRAP的31个线程,因为1个线程已经请求该地址?当访问是读取时,当访问是写入时,何时会发生什么?

有帮助吗?

解决方案

在FERMI中同一扭曲中的线程同时访问相同的地址,并且不能序列化。 WARP读取具有广播机制,该机制来自单个高速读取的所有诸如读取的读取,没有任何性能影响。性能与它是完全合并的读数相同。无论缓存细节如何,都是如此,例如,即使禁用L1缓存也是如此。

未指定同时写入的性能(afaik)但是行为,同时写入始终序列化,并且订单未定义。

编辑响应下面的其他问题:

  1. 即使扭曲中的所有线程在同一地址中写入相同的值,它是否会序列化?没有写入广播机制,识别出这种情况?

没有一个写入广播机制,看起来只看它们是否都是相同的,然后根据该方法进行一些动作。正确的答案是写入以未指定的顺序发生,并且性能特征是未定义的。显然,如果写入的所有值是相同的,则可以放心,最终在该位置的值将是该值。但是如果您要求写入活动是否折叠到单个周期或需要多个周期,则实际行为是未定义的(未记录的),实际上可能会因下一个架构而异(例如,CC1.x可以以这样的方式序列化,即所有写入都执行所有写入,而CC2.x可以以这样的方式“序列化”,使得一个写入“获胜”和所有其他方式被丢弃,而不是消耗实际周期。)同样,性能是未记录/未指定的,但是定义了程序可观察到的行为。

2使用您解释的此广播机制,常量内存广播访问和全局存储器之间的唯一区别是第一个可以将访问路由到全局存储器,但后者具有专用硬件并且更快,右?

__constant__内存使用常量缓存,这是一个专用的硬件,可在每个sm的基础上提供,并在只读时尚中缓存全局内存的特定部分。此HW Cache在物理上和逻辑上与L1缓存分开(如果存在并启用)和L2缓存。对于费米和超越,这两个机制都支持读取的广播,并且对于持续缓存,这是首选访问模式,因为常量缓存只能每轮循环服务一个读取访问(即不支持由翘曲读取的整个高速缓存。)在高速缓存(如果存在)或“未命中”并触发全局读取的任何一个机制。在第一次读取给定位置(或Cacheline)时,才能高速缓存将具有所请求的数据,因此它将“未命中”并触发全局内存读取,以便为访问提供服务。此后,在任何一种情况下,将在缓存中提供后续读取,假设在临时中未被驱逐相关数据。对于早期的CC1.x设备,常量内存缓存非常有价值,因为这些早期设备没有L1缓存。对于费米和超出使用常量缓存的主要原因,如果可用的数据(即每个翘曲的访问模式(即每个翘曲),则使用常量缓存将阻止这些读取读取L1并可能驱逐其他数据。实际上,您正在增加可缓存的足迹,只需L1可以单独支持的内容。

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