我想确保我正确理解了共享内存中的银行冲突。
我有32段数据。
每段由128个整数组成。
[[0, 1, ..., 126, 127], [128, 129, ..., 255], ..., [3968, 3969, ..., 4095]]
经纱中的每条线只能访问自己的部分。
线程0访问索引0对应的部分0的位置0
线程1访问部分1对应索引128的位置0
……
线程31访问索引3968对应的部分31的位置0
这是否意味着我有32倍的银行冲突?
如果是,那么如果我为每个段添加一个填充元素(即总共129个元素),那么每个线程将访问一个唯一的银行。我说的对吗?
是的,您将有32路银行冲突。对于银行冲突的目的,它可能有助于将共享内存可视化为一个二维数组,其宽度为32个元素(例如,32个int
或float
数量)。这个二维数组中的每一列都是一个"银行"。
在上面覆盖你的存储模式。当您这样做时,您将看到您所声明的访问模式将导致warp中的所有线程将从第0列请求项。
是的,通常的"诡计"。这里是将存储空间填充为每一行1个元素。(在您的情况下,这可能是每个"部分"一个元素)。这应该可以消除您指定的访问模式的银行冲突。