繁体   English   中英

在CUDA中跨块的合并访问?

[英]Coalescesed access across blocks in CUDA?

假设我们在块1上运行了16个线程,在块2上运行了另外16个线程。

每个线程从内存读取1个双倍:块1上的16个线程需要从内存地址0-127读取16个双打,而块2上的16个线程需要从地址128-255读取。

我知道,由于合并访问,块1上的16个线程的内存读取可以在一个内存事务中完成。

我的问题是,当我们考虑这两个块时,我们需要多少个内存事务,一个或两个? 换句话说,不同块的内存访问可以同时发生吗?

块完全独立 - 硬件可以选择(并且可能 - 将)在不同的多处理器上启动它们。

来自不同块的线程将以不同的warp运行。 因此,不可能在它们之间合并存储器访问。

您至少需要两个内存事务。 确保每个块的线程将在不同的warp中处理。

此外,即使线程已形成一个warp或占用相同的多处理器和共享L1缓存,来自warp的地址也会转换为128B或32B的行(取决于缓存/非缓存模式),因此在缓存模式的情况下,你会需要至少2个事务,并且在非缓存模式的情况下需要8个事务。 看看这个非常有用的演示文稿,以便更好地理解全局内存访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM