关于共享存储器使用的问题

celloasleep 2011-06-10 10:18:57
我在XP上用VS开发CUDA程序,使用了cuda_vs_wizard.
定义了两个位于共享存储器中的数组变量,一个用来存放系数,另一个用来归约。
第一个数组中的数据经过一些计算后将结果存入第二个数组,并进行归约算法求和。
但后来发现,第一个数组的大小会影响后面归约算法的执行时间。
当共享数组总大小小于4096 float时(即不到16KB时),程序执行时间最少;当第一个数组大小等于或超过4096 float时(即超过16KB时),程序执行时间就开始增加。

难道kernel的执行时间与共享存储器的大小有关吗???求解。。。

==============================================================================

Fermi白皮书上说Fermi中每个BLOCK共有64KB的共享内存,而可以将它们配置成48 KB的共享内存+16KB的一级缓存 或者是 16 KB 的共享内存+ 48KB 的一级缓存。
请问,具体怎么配置呢?共享内存和L1 cache有什么区别吗?

我使用的视频卡是GTX465, 通过DeviceQuery得到的结果是:
Total amount of shared memory per block : 49152 bytes
这意味着465中共享存储器默认的配置是 48KB的共享内存+16KB的一级缓存吗?
那这16KB的一级缓存如何使用呢?
...全文
194 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
linscs 2011-08-15
  • 打赏
  • 举报
回复
一般是共享存储器使用越多,程序执行时间越长。因为一个SM中活动块使用的共享存储器不能超过SM自身的限制(一般是16KB),block中使用的共享存储器越多,一个SM中能共存的的活动block就越少,这样就不能很好的隐藏延迟
celloasleep 2011-06-10
  • 打赏
  • 举报
回复
楼上冒似没有理解我的意思,既然有48K 的共享内存,那为什么我只用其中的16K时,归约算法的执行时间最短呢,而当使用的共享存储器大小超过16K时,归约执行时间就成倍上升了。
这使我想到,这16K和超过16K的部分是否属于同一类型的共享内存?
linxxx3 2011-06-10
  • 打赏
  • 举报
回复
默认的配置就是16K L1 cache + 48K shared mem,想要另外一种配置可以查看programming guide,好像中文版都有了。
16K的L1 cache是给程序使用的数据缓存,程序员是看不到的。
lz需要处理更大规模的数据应该考虑分批加载到shared mem中

231

社区成员

发帖
与我相关
我的任务
社区描述
CUDA on Windows XP
社区管理员
  • CUDA on Windows XP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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