对相邻数组元素使用共享内存
Use shared memory for neighboring array elements?
我想用 CUDA 处理图像。每个像素的新值是根据一行中的两个相邻像素计算的。对像素值使用__shared__
内存是否有意义,因为每个值只会使用两次?瓷砖不是也是错误的方法吗,因为它不适合问题结构?我的方法是在每个像素上运行一个线程,并每次为每个线程加载相邻的像素值。
所有当前支持的 CUDA 架构都有 caches.
从计算能力 3.5 开始,这些对于只读数据特别有效(由于读写数据仅缓存在 L2 中,因此 L1 缓存仅限于只读数据)。如果将指向输入数据的指针标记为const __restrict__
,编译器很可能会通过 L1 纹理缓存加载它。您还可以通过使用内置的__ldg()
来强制执行此操作。
虽然可以通过共享内存显式管理来自相邻像素的数据重用,但您可能会发现这比仅依赖缓存没有任何好处。
当然,无论是否使用共享内存,您都希望在 x 方向上最大化块大小,并使用 1 blockDim.y
来实现最佳访问局部。
结合使用共享内存和利用合并的内存访问。您需要做的就是确保图像按行存储。每个块将处理一个线性数组块。由于数据重用(除了第一个和最后一个像素之外的每个像素都会参与处理三次),如果在内核开始时将要处理的所有像素的值复制到共享内存中,那将是有益的。
相关文章:
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- 有没有办法列出所有共享内存对象的名称?
- 共享内存的升压容器是否实现锁定?
- 共享内存中的健壮互斥锁不是那么健壮
- 使用IPC/共享内存将Integer数组从C++传递到Python
- 共享内存和性能
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 是否可以在专用内存空间中分配一个为提升管理共享内存而创建的对象
- fork(),在C中共享内存和指针
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 提升进程间共享内存open_or_create每次都会引发异常
- 通过 mmap-ed 共享内存传递可变长度 C 字符串
- 越界访问 CUDA 共享内存
- 在共享内存中插入映射映射时出现编译器错误
- 矩阵矢量产品 CUDA 通过平铺和共享内存提高性能
- 如何更改在 c++ 中使用提升库创建的共享内存的路径