本文主要是介绍共享内存 Bank冲突,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
计算机图形学技术 见 计算机图形学技术
GPU上的warp其实是软件上来说的,在CUDA架构中,一个warp指的是32个线程的集合,这些线程是“编织在一起”并以一致步调(lockstep)方式执行的。在程序的每一行,warp中的每个线程对不同的数据执行相同的指令。
为了获得较高的内存带宽,共享存储器被划分为多个大小相等的存储器模块,称为bank,可以被同时访问。
如果跨越多个(假设n个)不同的内存bank的对里面的m个地址进行读取和写入的操作,这是可以被同时执行的,这样就大大提高了整体的带宽 ,带宽可达到单独一个bank带宽的n倍。但是如果一个warp中的不同线程访问同一个bank中的不同的地址时,就会发生bank冲突。
如果同一个warp访问的全都是同一个bank里面的不同字段,则就是处于最坏的情况。
以上两种访问情况都不会产生bank冲突。下图会产生bank冲突:
但是当一个warp的全部线程全都访问某个bank的同一个字段时不会冲突,比如下图,因为CUDA广播机制,会把该字段广播到其他所有线程:
同理,当同一个字(word)中的不同字节(8 bit)被访问时,也不会产生bank冲突。
参考文献:
CUDA C programming guide
CUDA by example
the CUDA handbook
https://blog.csdn.net/weixin_34185560/article/details/89224449
https://developer.nvidia.com/blog/using-shared-memory-cuda-cc/
这篇关于共享内存 Bank冲突的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!