我想用CUDA处理图像。基于一行中的两个相邻像素计算每个像素的新值。将__shared__
内存用于像素值是否有意义,因为每个值只会使用两次? Aren的瓷砖也是错误的做法,因为它不适合问题结构?我的方法是在每个像素上运行一个线程,并为每个线程每次加载相邻的像素值。
答案 0 :(得分:4)
所有当前支持的CUDA架构都有缓存。
从计算能力3.5开始,这些对于只读数据特别有效(因为读写数据仅缓存在L2中,L1缓存仅限于只读数据)。如果将指向输入数据的指针标记为const __restrict__
,编译器很可能会将其加载via the L1 texture cache。您也可以通过明确使用__ldg()
builtin强制执行此操作。
虽然可以通过共享内存显式管理来自邻居像素的数据重用,但您可能会发现这不仅仅依赖于缓存也没有任何好处。
当然,无论您是否使用共享内存,您都希望在x方向上最大化块大小,并使用blockSize.y为1来获得最佳访问位置。
答案 1 :(得分:1)
结合使用共享内存并利用合并的内存访问。您需要做的就是确保图像按行存储。每个块将处理一大块线性阵列。由于数据重用(除了第一个和最后一个像素之外的每个像素将参与处理三次),如果在内核的开头,您将复制将要处理的所有像素的值到共享内存,这将是有益的。