首页 文章

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

提问于
浏览
2

我阅读了一些关于CUDA编程的教程 . 他们中的大多数都提到“如果半经线的 ALL 线程访问相同的地址,则没有银行冲突(广播)” . 我的问题是,部分相同的地址访问是否会导致CUDA共享内存中的银行冲突?

假设每个warp有32个线程,那么half-warp将是16个线程 .

(1)如果所有16个线程都访问Bank0上的相同地址A,则自广播以来不会发生银行冲突 .

(2)但是如果Thread- {0,1,...,6,7}想要访问Bank0上的地址A而Thread- {8,9,...,14,15}想要访问地址B怎么办? BANK1?我想知道是否会有银行冲突 . 由于 NOT 所有半warp线程访问相同的地址(只有半半warp访问相同的地址),所以会有银行冲突 .

如果我的理解是错误的,请纠正我 . 非常感谢你!

1 回答

  • 5

    对于计算能力1.x(CUDA 7中不再支持哪些设备),每个非存储体冲突的共享存储器访问周期允许a single broadcast word .

    对于计算能力2.0及更高版本,假设所有这些广播词来自不同的库,则在单个非存储体冲突的共享存储器访问周期中允许任意数量的广播字 .

    Documentation

    并且与计算能力1.x的设备不同,可以在单个事务中广播多个单词

    半扭曲的讨论仅与cc1.x设备有关 . 在你的情况2中,在cc1.x设备上,将需要两个访问的序列化,一个用于地址A,一个用于地址B.这与双向银行冲突的行为相同 . 在您的情况2中,对于cc2.0及更高版本,不存在银行冲突 .

相关问题