假设我们在块1上运行了16个线程,在块2上运行了另外16个线程。
每个线程从内存读取1个双倍:块1上的16个线程需要从内存地址0-127读取16个双打,而块2上的16个线程需要从地址128-255读取。
我知道,由于合并访问,块1上的16个线程的内存读取可以在一个内存事务中完成。
我的问题是,当我们考虑这两个块时,我们需要多少个内存事务,一个或两个?换句话说,不同块的内存访问可以同时发生吗?
答案 0 :(得分:2)
块完全独立 - 硬件可以选择(并且可能会)在不同的多处理器上启动它们。
来自不同块的线程将以不同的warp运行。因此,不可能在它们之间合并内存访问。
答案 1 :(得分:1)
您至少需要两次内存事务。确保每个块的线程将在不同的warp中处理。
此外,即使线程已形成一个warp或占用相同的多处理器和共享L1缓存,来自warp的地址也会转换为128B或32B的行(取决于缓存/非缓存模式),因此在缓存的情况下模式您需要至少2个事务,并且在非缓存模式的情况下需要8个事务。查看this非常有用的演示文稿,以便更好地理解全局内存访问。