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)使用流和异步处理隐藏与主机通信时间





























  • 相关阅读:
    Django简介和安装
    CVE-2011-0104:Microsoft Office Excel 中的栈溢出漏洞调试分析
    Struts2漏洞
    JSONP跨域资源共享的安全问题
    如何以最简单的方式安装 KALI 渗透测试框架系统
    CVE-2010-3333:Microsoft RTF 栈溢出漏洞调试分析
    CVE-2010-2883:基于样本分析 PDF SING表字符溢出漏洞
    针对缓冲区保护技术(ASLR)的一次初探
    利用 ROP 技术绕过 DEP 保护的一次简单尝试
    缓冲区溢出之栈溢出利用(手动编写无 payload 的 Exploit)
  • 原文地址:https://www.cnblogs.com/pengtangtang/p/12762842.html
Copyright © 2011-2022 走看看