我有一个多次调用的内核.在每次调用中,大约240千字节的常量数据将由线程共享和处理.线程像地图功能一样独立工作.螺纹的停止时间是相当大的.其背后的原因可能是存储读取的银行冲突.我怎么处理这个?(我有GTX 1080 ti)
opencl的"const global"可以处理吗?(因为cuda中的常量内存限制为64 kb)
在CUDA中,我认为最好的建议是使用所谓的"只读"缓存.这比__constant__内存/常量缓存系统至少有两个可能的好处:
__constant__内存一样.CUDA编程指南中记录了只读缓存.可能是使用最简单的方法就是,装饰你的指针与传递给内核CUDA __restrict__(假设你是不是指针之间的别名)和装饰是指与大常量数据的指针const ... __restrict__.这将允许编译器生成适当的LDG指令以访问常量数据,将其拉入只读缓存机制.
这种只读缓存机制仅支持cc 3.5或更高版本的GPU,但它涵盖了Kepler系列中的一些GPU以及Maxwell,Pascal(包括您的GTX 1080 ti),Volta和Turing几代中的所有GPU.
如果你的GPU小于cc3.5,可能是类似好处(大于__const__,不需要统一访问)的最佳建议,那么就是使用纹理内存.这也在编程指南的其他地方有记载,有各种CUDA示例代码演示纹理存储器的使用,以及cuda覆盖它的SO 标签上的大量问题.