CUDA作死记录

2 篇文章 0 订阅
1 篇文章 0 订阅

跟着实验室打酱油,涉及到了CUDA编程,这里记录一些零碎的经验和资料。作为新手踩了不少奇奇怪怪的坑。

我们做的事情有点奇怪,本来是在CPU上做图的DFS,现在想移植到CUDA上。GPU其实不太适合用来做这个事情,但是图很大,而且涉及到很多集合求交和求差集等操作,还是有点希望的。

递归

首先是CUDA上线程的栈空间不算大。随手试了一下,记得是递归40多层就炸了;不过我们的递归深度层数不多,就硬上了递归。直接函数递归会使得编译器无法得知函数使用的寄存器数量,所以局部变量就spill到了全局内存里,会对性能有较大的影响。目前的解决方案是手动指定递归的最大深度,然后把深度作为函数模板的模板参数,让编译器在编译期进行递归展开,这样就能知道寄存器的使用量。

寄存器用量可以通过编译选项得到。给nvcc添加

–ptxas-options=-v

即可。

Occupancy

函数的寄存器、共享内存用量会影响到占用率。有一段时间程序的occupancy受到了寄存器数量的约束,有的时候多写了些实际并没有执行的代码,但由于寄存器用量增加,会导致程序性能下降。遇到这种情况可以用CUDA提供的occupancy计算表格得到一些理论结果,若发现某些参数存在较为明显的边际效应,可以考虑对资源用量进行限制。nvcc的-maxrregcount=N选项可以限制最大寄存器数量。

如有需要可以在程序中计算出最大可执行的block/warp数量。cudaDeviceGetAttribute(&number_of_sms, cudaDevAttrMultiProcessorCount, device)得到GPU的SM数量,然后cudaOccupancyMaxActiveBlocksPerMultiprocessor(&max_active_blocks_per_sm, kernel, number_of_threads_per_block, block_shared_mem_size)得到对给定核函数每个SM上最大活跃block数量。

剩下的有心情再写。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值