部分相同地址访问是否会导致CUDA中的银行冲突?

部分相同地址访问是否会导致CUDA中的银行冲突?,cuda,Cuda,我读了一些关于CUDA编程的教程。其中大多数提到“如果半扭曲的所有线程访问相同的地址,则不存在银行冲突(广播)”。我的问题是,部分相同地址访问是否会在CUDA的共享内存中引发银行冲突 假设每个扭曲有32条线,那么半扭曲将是16条线 (1) 如果所有16个线程都访问Bank0上的同一地址A,则自广播后不会出现任何银行冲突 (2) 但是,如果线程{0,1,…,6,7}想要访问Bank0上的地址A,而线程{8,9,…,14,15}想要访问Bank1上的地址B怎么办?我想知道是否会有银行冲突。由于不是所

我读了一些关于CUDA编程的教程。其中大多数提到“如果半扭曲的所有线程访问相同的地址,则不存在银行冲突(广播)”。我的问题是,部分相同地址访问是否会在CUDA的共享内存中引发银行冲突

假设每个扭曲有32条线,那么半扭曲将是16条线

(1) 如果所有16个线程都访问Bank0上的同一地址A,则自广播后不会出现任何银行冲突

(2) 但是,如果线程{0,1,…,6,7}想要访问Bank0上的地址A,而线程{8,9,…,14,15}想要访问Bank1上的地址B怎么办?我想知道是否会有银行冲突。由于不是所有半扭曲线程都访问相同的地址(只有半扭曲线程访问相同的地址),因此将存在银行冲突


如果我的理解有误,请纠正我。多谢各位

对于compute capability 1.x(CUDA 7不再支持这些设备),允许每个非银行冲突共享内存访问周期使用

对于compute capability 2.0及更高版本,在单个非银行冲突共享内存访问周期中允许任意数量的广播字,假设所有这些广播字都来自不同的银行

:

与计算能力为1.x的设备不同,在一个事务中可以广播多个字


关于半翘曲的讨论仅与cc1.x设备相关。在您的案例2中,在cc1.x设备上,需要对两个访问进行序列化,一个用于地址a,一个用于地址B。这在行为上相当于双向银行冲突。在您的案例2中,对于cc2.0及更高版本,将不会出现银行冲突。

非常感谢。这真的解决了我的问题!在cc1.x设备中,情况2确实需要两个广播字,而只允许一个广播,所以访问另一个字会多出一个内存周期,对吗?