二维 直方图 与 CUDA的共享内存

企鹅的外层世界 2013-08-08 06:07:40
要计算一个三维直方图,float型的,50*50*10=25000个,然而sharememory只有48k,也就是说只够存放12000个,不够用。这东西要是放在global里面加上原子操作就慢的不行了。用什么方法可以尽量提高速度?
...全文
142 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯狂小鸟 2014-06-17
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
谢楼上,第一种方法是不错,是我没想到的方法,很有启发。
linxxx3 2013-08-09
  • 打赏
  • 举报
回复
还有一种搞法,物尽其用,48k shared mem能存一部分直方图了。把直方图划分成几块,起多个block,每个只计算自己范围内的,超过就忽略了。看起来有点浪费,可以试试,或许不慢。
linxxx3 2013-08-09
  • 打赏
  • 举报
回复
如果拿shared mem做,你只能使用一个block(shared mem不能跨block用),可以说也是慢的不行了。 看起来直方图的大小不大,用global mem也有办法不用原子操作的,可以试试每个线程单独开一个本地的直方图,每个100k字节大小,可以开好多个,全部完了之后,用规约的方式叠加。如果输入数据很大量的话,或许比较划算。
linxxx3 2013-08-09
  • 打赏
  • 举报
回复
引用 4 楼 lianbus 的回复:
结贴还可以回复么?仍然有些问题,主要是线程数量较多的时候,对内存的写操作较多,即使没有写操作的冲突,单就大量线程对内存的读写访问就足以成为计算上的瓶颈。从这一点来看,共享内存是在太重要了,可惜不够用。
恩,是这样的。读写多是一个方面,另一个每次对数据的访问位置都是“随机”的,不是连续访存,效率上会很差。这是目标本身不太适合,优化方法可能不多。 拿cpu去算就好多了,本身单核性能高,好的cpu L2 cache都有256k了,L3更是有12M。
  • 打赏
  • 举报
回复
结贴还可以回复么?仍然有些问题,主要是线程数量较多的时候,对内存的写操作较多,即使没有写操作的冲突,单就大量线程对内存的读写访问就足以成为计算上的瓶颈。从这一点来看,共享内存是在太重要了,可惜不够用。

579

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧