zoukankan      html  css  js  c++  java
  • CUDA优化


    cuda程序优化

    一:程序优化概述
    1:精度
    在关键步骤使用双精度,其他步骤使用单精度,以获得指令吞吐量和精度的平衡。

    2:延迟
    先缓冲一定量数据,在交给GPU计算。可以获得较高的数据吞吐量。

    3:计算量
    1):绝对计算量
    当计算量较少时,不因用GPU
    2):相对计算量
    当计算量中的并行站大多比例,因使用GPU并行计算。

    4:优秀的CUDA程序
    1)给点数据规模下,选用的算法复杂度不明显高于最优算法
    2)活动的线程束应使SM满载,且活动的线程块数应大于等于2,可以有效隐藏延迟。
    3)当瓶颈出现在运算时,说明指令流已经做了最好的优化
    4)当瓶颈出现在IO或访存时,表明选择了最好的存储器与访存方式,以获得最大的带宽。瓶颈----〉带宽

    5:CUDA程序开发流程与优化
    1)确定串行与并行部分,选择合适算法
    2)按照算法确定数据与任务的划分,将每个需要并行并行实现的步骤映射为一个CUDA两层并行模型的核函数。
    3)编写一个能够正常运行的程序。
    4)优化显存访问,避免显存带宽成为瓶颈。---〉只有将带宽问题优化,才能使优化结果明显
    5)优化指令流
    6)资源均衡。调整shared memory 与 register的分配使用量,获得更高的SM占有率
    7)与主机通信优化

    6:优化显存访问方式
    1)在数据只访问一次,且满足合并访问的情况下,考虑使用zeroy copy memory
    2)除非非常必要,应尽量避免将线程的私有变量分配到local memory;
    3)为满足合并访问,保证访问的首地址从16的整倍数开始,对数据类型进行对齐(__align),采用cudaMallocPitch cudaMalloc3D分配显存

    7:优化指令流
    1)若只需使用少量线程,尽量使用 if threadId <N 
    2)采用原子函数,完成比较复杂的算法,保证结果正确性
    3)避免多余的同步

    8:资源均衡
     1)提高shared使用率
    修改算法指令,动态分配,调整block大小。
    2·)节约寄存器使用
      使用shared memory存储变量,尽量使用括号减短变量声明周期
      使用占用寄存器较小的等效指令代替原有指令。_sin代替sin

    9:提高带宽
     1)使用cudaMallocHost分配主机端内存
     2)使用zeroycop 和 writecombined内存
     3)一次缓存较多数据,再一次性传输
     4)使用流和异步处理隐藏与主机通信时间





























  • 相关阅读:
    团队冲刺(二)个人工作总结6
    团队冲刺(二)个人工作总结4
    网页开发--03(wampserver安装服务无法启动的问题)
    网页开发--02(开发环境配置)
    网页开发--01(常识)
    Three.js学习笔记05
    Three.js学习笔记04--纹理
    Three.js学习笔记03--光
    Three.js学习笔记02
    Three.js学习笔记01
  • 原文地址:https://www.cnblogs.com/pengtangtang/p/12762842.html
Copyright © 2011-2022 走看看