Cuda 当存在一级和二级缓存级别时,是否会序列化对一个地址的同时全局内存访问?

Cuda 当存在一级和二级缓存级别时,是否会序列化对一个地址的同时全局内存访问?,cuda,gpgpu,nvidia,kepler,Cuda,Gpgpu,Nvidia,Kepler,据我所知,当warp的线程访问全局内存中的相同地址时,请求会被序列化,因此最好使用常量内存。当GPU配备一级和二级缓存级别(在费米和开普勒体系结构中)时,同步全局内存访问的串行化会发生吗?换句话说,当一个warp的线程访问相同的全局内存地址时,31个warp线程是否会因为缓存的存在而受益,因为1个线程已经请求了该地址?当访问是读取时,以及当访问是写入时,会发生什么情况?费米和开普勒中相同扭曲中的线程对相同地址的同时全局访问不会被序列化。warp read有一种广播机制,可以满足从单个缓存线读取的

据我所知,当warp的线程访问全局内存中的相同地址时,请求会被序列化,因此最好使用常量内存。当GPU配备一级和二级缓存级别(在费米和开普勒体系结构中)时,同步全局内存访问的串行化会发生吗?换句话说,当一个warp的线程访问相同的全局内存地址时,31个warp线程是否会因为缓存的存在而受益,因为1个线程已经请求了该地址?当访问是读取时,以及当访问是写入时,会发生什么情况?

费米和开普勒中相同扭曲中的线程对相同地址的同时全局访问不会被序列化。warp read有一种广播机制,可以满足从单个缓存线读取的所有此类读取,而不会影响性能。性能与完全合并读取时的性能相同。无论缓存的具体情况如何,这都是正确的,例如,即使禁用了一级缓存,这也是正确的

未指定同步写入的性能(AFAIK),但在行为上,同步写入总是被序列化,并且顺序未定义

编辑回答以下其他问题:

  • 即使warp中的所有线程都将相同的值写入相同的地址,它是否会被序列化?难道没有一种写广播机制可以识别这种情况吗
  • 没有一种写广播机制可以查看所有同时进行的写操作,看看它们是否都相同,然后在此基础上采取一些操作。正确的答案是写操作以未指定的顺序发生,并且性能特征未定义。显然,如果所写入的所有值都相同,则可以确保最终到达该位置的值就是该值。但是,如果您询问写入活动是折叠为单个周期还是需要多个周期才能完成,那么实际行为是未定义的(未记录),并且实际上可能因架构而异(例如,cc1.x可能以所有方式序列化,以执行所有写入,而cc2.x可能“序列化”以这样一种方式,一个写“赢”,而所有其他写都被丢弃,不消耗实际周期。)同样,性能是未记录/未指定的,但程序可观察行为是定义的

    2使用您解释过的这种广播机制,恒定内存广播访问和全局内存广播访问之间的唯一区别在于,第一种可能会将访问一直路由到全局内存,但后者有专用硬件,速度更快,对吗


    \uuuuu constant\uuuuu
    内存使用常量缓存,这是一个专用的硬件,可按每SM使用,并以只读方式缓存全局内存的特定部分。此硬件缓存在物理和逻辑上与一级缓存(如果存在并启用)和二级缓存分离。对于Fermi和beyond,这两种机制都支持读时广播,对于常数缓存,这是首选的访问模式,因为常数缓存每个周期只能服务一次读访问(即不支持扭曲读取整个缓存线)。任何一种机制都可以“命中”缓存(如果存在)或“未命中”并触发全局读取。在第一次读取给定位置(或缓存线)时,niether缓存将具有请求的数据,因此它将“丢失”并触发全局内存读取,以服务访问。此后,在任何一种情况下,后续读取都将从缓存中提供服务,前提是在此期间没有逐出相关数据。对于早期的cc1.x设备,恒定内存缓存非常有价值,因为这些早期设备没有一级缓存。对于费米和其他情况,使用常量缓存的主要原因是,如果可识别数据(即只读)和访问模式(每个扭曲的地址相同)可用,则使用常量缓存将防止这些读取通过一级缓存并可能逐出其他数据。实际上,您在一定程度上增加了可缓存的占用空间,而不仅仅是L1可以单独支持的占用空间。

    谢谢。还有两个问题:1。即使warp中的所有线程都将相同的值写入相同的地址,它是否会被序列化?难道没有一种写广播机制可以识别这种情况吗?2.使用您解释过的这种广播机制,恒定内存广播访问和全局内存广播访问之间的唯一区别在于,第一种可能会将访问一直路由到全局内存,但后者有专用硬件,速度更快,对吗?您好,7年后;)您知道在这种情况下,广播的请求是否会将整个缓存线拉入一级缓存,这样,如果同一内核稍后执行相邻读取,它(希望)将能够从一级缓存中获取它?如果一级缓存已启用,加载请求将把必要的项拉入一级缓存以满足请求。这是否意味着填充了整个一级缓存线是特定于体系结构的。对于不需要满足的读取请求,以后的体系结构(例如Maxwell/Pascal及更高版本)可能不会引入整个一级缓存线。我对以后体系结构的期望/理解是,L1缓存线的32字节扇区将根据需要填充。L1缓存线有4个这样的扇区。然而,据我所知,这种行为在很大程度上是未指定的。也请参见和从那里链接的项目