CUDA GPU编程如何避免Bank conflict2 2017-12-04 09:39阅读: http://blog.sina.cn/dpool/blog/u/6319164373 1 为什么要避免Bank conflict Shared memory在芯片SM(Streaming Multiprocessors)内部,相比片外的Global memory拥有大得多的内存带宽,当对该内存数据读写操作频繁,则建议先将Global memory中的数据加载到Shared memory再进行读写操作,会大大提高程序计算性能。然而,Shared memory和诸如if else语句引起的warp divergence类似,当操作不当时,会导致程序性能的大大降低。我的一个程序有个地方没注意bank conflict,执行时间有600ms,稍加修改进行避免后马上降低到了300ms。所以在编写和优化CUDA程序的时候一定要反复检查是否有bank conflict。 2 什么是Bank conflict以及Bankconflict的产生 为了提高内存读写带宽,共享内存被分割成了32个等大小的内存块,即Bank。因为一个Warp有32个线程,相当于一个线程对应一个内存Bank。这个分割方法通常是按每4个字节一个bank,计算能力3.x的GPU也可以8个字节一个bank,如图1所示。用户创建的共享内存就按照地址依次映射到这些bank中。