oYangZi12 2016-04-06 13:28 采纳率: 0%
浏览 3317

CUDA加速为什么没有并行的效果

我对一幅图像做处理,640X480,对每个像素我分配了一个thread,即我每个block分配了640个thread,分配了480
个block。然后我对另一幅2048X1536的图像操作,我每个block分配了1024个thread,共分配了1536X2个block。用
同样的算法,问题规模增加了10倍,我不理解的是为什么运行时间也增加了10倍。不是只会增加一点读取数据的时间吗。
对CUDA的运行原理不是很了解,忘大神指教。图片说明

  • 写回答

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 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退