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

CUDA优化的更多相关文章

  1. 漫谈CUDA优化

    ​ 作者:Lawliet 翻译:仿佛若有光 前言: 几个月前,我根据 Simoncelli 2016 年的论文编写了自己的自动编码器,用于研究目的.一开始,我想使用一些流行的深度学习框架(例如 Ten ...

  2. GPU优化方法[转]

    CUDA优化的最终目的是:在最短的时间内,在允许的误差范围内完成给定的计算任务.在这里,“最短的时间”是指整个程序运行的时间,更侧重于计算的吞吐量,而不是单个数据的延迟.在开始考虑使用GPU和CPU协 ...

  3. CUDA C Programming Guide 在线教程学习笔记 Part 3

    ▶ 表面内存使用 ● 创建 cuda 数组时使用标志 cudaArraySurfaceLoadStore 来创建表面内存,可以用表面对象(surface object)或表面引用(surface re ...

  4. ubuntu16.04 Detectron目标检测库配置(包含GPU驱动,Cuda,Caffee2等配置梳理)

    Detectron概述 Detectron是Facebook FAIR开源了的一个目标检测(Object Detection)平台. 用一幅图简单说明下Object Detection.如Mask R ...

  5. CUDA并行计算 | CUDA算法效率提升关键点概述

    文章目录 前言 存取效率 计算效率 性能优化要点 展现足够的并行性 优化内存访问 优化指令执行 前言   CUDA算法的效率总的来说,由存取效率和计算效率两类决定,一个好的CUDA算法必定会让两类效率 ...

  6. CUDA Pro:通过向量化内存访问提高性能

    CUDA Pro:通过向量化内存访问提高性能 许多CUDA内核受带宽限制,而新硬件中触发器与带宽的比率不断提高,导致带宽受限制的内核更多.这使得采取措施减轻代码中的带宽瓶颈非常重要.本文将展示如何在C ...

  7. pytorch_SRU(Simple Recurrent Unit)

    导读 本文讨论了最新爆款论文(Training RNNs as Fast as CNNs)提出的LSTM变种SRU(Simple Recurrent Unit),以及基于pytorch实现了SRU,并 ...

  8. 语义分割丨PSPNet源码解析「训练阶段」

    引言 之前一段时间在参与语义分割的项目,最近有时间了,正好把这段时间的所学总结一下. 在代码上,语义分割的框架会比目标检测简单很多,但其中也涉及了很多细节.在这篇文章中,我以PSPNet为例,解读一下 ...

  9. Vulkan移植GpuImage(四)从D到O的滤镜

    现把D到O的大部分滤镜用vulkan的ComputeShader实现了,列举其中一些有点特殊的说明. GaussianBlurPosition 指定区域高斯模糊 没有按照GPUImage里的方式实现, ...

随机推荐

  1. java学习笔记之原型模式及深浅拷贝

    一.原型模式的基本介绍 在聊原型模式之前,我们来思考一个小问题,传统的方式我们是如何克隆对象呢? 那我们以多利羊(Sheep)为例,来说明上述这个问题,具体代码见下面: 多利羊(Sheep) publ ...

  2. GitHub使用SSH连接以及生成修改添加密钥详细过程

    目录 1. 先看看本地有没有SSH密钥 2. 生成/修改密钥 3. 把SSH密钥添加到ssh-agent 4. 把SSH密钥添加到GitHub账户里 5. 测试使用ssh地址clone仓库 6. 把远 ...

  3. Postman学习宝典(一)

    前言:网上看到的比较好的Postman教程,既然已经有了,我就不重复造轮子了,直接copy过来. 资源来源于:米阳MeYoung Postman 入门1- 安装.变量.代理 简介 Postman 是一 ...

  4. 【雕爷学编程】Arduino动手做(58)---SR04超声波传感器

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  5. 【雕爷学编程】Arduino动手做(48)---三轴ADXL345模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...

  6. Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 前面介绍过根据id,clas ...

  7. js-实现多列布局(瀑布流)

    本文是使用面向对象的思想实现多列布局(瀑布流).当然,使用面向过程也能实现,具体效果图和案例如下: 具体实现代码如下: <!DOCTYPE html> <html lang=&quo ...

  8. IIS 报 :HTTP Error 503. The service is unavailable.

    打开IIS 找到你对应的网站名称然后你会发现应用池停止了 点击你对应的网站右键点击启动既可

  9. Jumpserver-跳板机的搭建

    Jumpserver堡垒机 一.Jumpserver堡垒机概述-部署Jumpserver运行环境 01 跳板机概述 跳板机就是一台服务器,开发或运维人员在维护过程中首先要统一登录到这台服务器,然后再登 ...

  10. C# 数据操作系列 - 17 Dapper ——号称可以与ADO.NET 同台飙车的ORM

    0. 前言 之前四篇介绍了一个国内开发者开发的优秀框架SqlSugar,给我们眼前一亮的感觉.这一篇,我们将试试另一个出镜率比较高的ORM框架-Dapper. Dapper是一个轻量级的ORM框架,其 ...