我对一幅图像做处理,640X480,对每个像素我分配了一个thread,即我每个block分配了640个thread,分配了480
个block。然后我对另一幅2048X1536的图像操作,我每个block分配了1024个thread,共分配了1536X2个block。用
同样的算法,问题规模增加了10倍,我不理解的是为什么运行时间也增加了10倍。不是只会增加一点读取数据的时间吗。
对CUDA的运行原理不是很了解,忘大神指教。
CUDA加速为什么没有并行的效果
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
4条回答
- MingChaoSun 2016-04-06 13:52关注
CUDA编程的优化可不只是一味增加线程,线程增加到一定程度就不能加速了,反而会越来越慢,因为实际上GPU的处理单元还是有限的,增大线程只能在一定程度上隐藏global memory的latency,题主最好去系统学一下CUDA,不然写出来的程序是比较差的,常规的优化方法还有非常多,要想优化好一个CUDA程序,首先要设计比较合理的并行算法,举个例子来说树状加法并行就会比正常相加快很多,第一步是首先尽量优化内存带宽,因为内存带宽一般是程序的瓶颈,GPU相比CPU的一大优势就在于有非常大的内存带宽,有的能到150GB/s,这里面不单单是线程,比如考虑访问global内存的顺序,如果是顺序访问内存,而不是跳跃访问,大概会有3-8倍的加速,在线程方面使用基本没有latency的share memory 也是一个加速的手段,优化好内存带宽之后还有很多的优化技术,比如优化指令流,在误差可接受的情况下,使用CUDA算术指令集中的快速指令,避免多余的同步,资源均衡,与主机通信优化,尽量减少CPU与GPU间的传输,使用流和异步处理隐藏与主机的通信时间;使用zero-memory技术和Write-Combined memory提高可用带宽等等,所以建议去系统学一下,还是很有学问的~
解决 无用评论 打赏 举报
悬赏问题
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
- ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
- ¥20 有关区间dp的问题求解
- ¥15 多电路系统共用电源的串扰问题
- ¥15 slam rangenet++配置
- ¥15 有没有研究水声通信方面的帮我改俩matlab代码
- ¥15 ubuntu子系统密码忘记
- ¥15 保护模式-系统加载-段寄存器