最近想用cuda来加速三维重建的算法,就先入门了一下cuda。

CUDA C 编程

cuda c时对c/c++进行拓展后形成的变种,兼容c/c++语法,文件类型为'.cu',编译器为nvcc。cuda c允许用内核函数来扩展c,调用时由N个不同的线程共执行N次。块内的线程可以通过共享存储器共享数据并通过它们的执行力来协调存储器访问,aka 通过调用__syncthreads()内部函数来指定内核中的同步点。

相比传统的cpp,添加了这么几个方面:

  • 函数类型限定符
  • 执行配置运算符
  • 五个内置变量
  • 变量类型限定符
  • 其他的还有数学函数,原子函数,纹理读取,绑定函数等。

函数类型限定符

用来确定时再cpu还是gpu运行,以及这个函数是从cpu还是gpu调用。

  • device表示从gpu调用,再gpu运行
  • global表示从cpu调用,在gpu执行,也称kernel函数。
  • host表示在cpu上调用,在cpu上执行。

执行配置运算符

用来传递核函数的执行参数。

使用__global__声明说明符定义内核,用<<< ... >>>来为内核指定cuda线程数。每一个线程都有一个唯一的ID,可以通过内置threadIdx来访问。

<<< ... >>>中可以时int或者dim3类型。

五个内置变量

gridDim;
blockDim;
blockIdx;
threadIdx;
warpSize;

变量类型限定符

__device__; // 表示位于全局内存空间,默认类型
__share__; // 表示位于共享内存空间
__constant__; // 常量内存空间
texture; // 其绑定的变量可以被纹理缓存加速访问

some unit

  • thread:一个cuda的并行程序会被许多个threads来执行。
  • block:数个threads会被群组成要给block,同一个block中的threads可以同步,也可以通过shared memory通信。
  • grid:多个blocks再构成grid
  • warp:GPU执行程序时的调度单位,目前cuda的warp的大小为32,同在一个warp的线程,以不同数据资源执行相同的指令,就是所谓的SIMT。

关于内存:

  • 每个线程都有私有本地内存
  • 每个线程块都具有对块的所有线程可见的共享内存,并且和块有相同的生存周期
  • 所有线程都可以访问相同的全局内存

所有线程都可以访问的额外两个只读存储空间:常量内存纹理内存.

cuda编程还假设主机和设备都在DRAM中保持他们自己的独立存储空间,分别成为主机存储器(host memory)设备存储器(device memory)

统一内存(Unified memory)托管内存(managed memory)以桥接主机和设备的内存空间。可以从系统的所有CPU和GPU访问托管内存

Device Memory

核函数在设备内存之外运行,因此runtime提供分配,释放和复制内存的功能,以及在主机内存和设备内存之间传输数据的功能。

设备存储器可以分为线性内存(linear memory)cuda阵列(cuda arrays)

cuda数组时不透明的内存布局,针对纹理提取进行了优化。

线性内存通常通过cudaMalloc()分配,并使用cudaFree()释放,主机存储器和设备存储器之间的数据传输通常使用cudaMemcpy()完成。

还有一些函数:cudaMallocPitch(), cudaMalloc3D(), cudaMemcpy2D(), cudaMemcpy3d().

Shared Memory

共享内存是使用__shared__内存空间说明符分配的。

共享内存一般比全局内存快得多,因此用改利用共享内存替换访问全局内存的任何机会。

这一块还不太懂,回头再摸。

CUDA C编程入门的更多相关文章

  1. 【浅墨著作】《OpenCV3编程入门》内容简单介绍&amp;勘误&amp;配套源码下载

    经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...

  2. GPU 编程入门到精通(五)之 GPU 程序优化进阶

    博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识.鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程. 有志同道合的小伙 ...

  3. GPU 编程入门到精通(四)之 GPU 程序优化

    博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

  4. GPU 编程入门到精通(三)之 第一个 GPU 程序

    博主因为工作其中的须要.開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

  5. PHP面向对象(OOP)编程入门教程

    面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...

  6. Windows编程入门程序详解

    引用:http://blog.csdn.net/jarvischu/article/details/8115390 1.     程序 /******************************* ...

  7. 【PHP面向对象(OOP)编程入门教程】1.什么是面向对象?

    面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...

  8. Linux 利器- Python 脚本编程入门(一)

    导读 众所周知,系统管理员需要精通一门脚本语言,而且招聘机构列出的职位需求上也会这么写.大多数人会认为 Bash (或者其他的 shell 语言)用起来很方便,但一些强大的语言(比如 Python)会 ...

  9. 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

    Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)   介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...

随机推荐

  1. Loadrunner 11.00 初始化失败; 通信错误。 Error (-81024): LR_VUG: The 'WS_SOAP' type is not supported on 'WIN32' platforms .

    搜索LR安装目录bin文件夹下有个“wlrun.exe”的文件,邮件点击“属性”->"兼容性"->兼容模式中选择“windows 7”,确认后重新打开即可,win10下 ...

  2. 阿里云Centos7用putty ssh链接掉线

    解决方法:修改云服务器 ssh 配置文件(修改前一定要先备份) (1)打开配置文件: vim /etc/ssh/sshd_config 1 (2)找到下面两行: ClientAliveInterval ...

  3. istio流量管理

    目录 1 准备工作 1.1 在k8s部署istio 1.2 istio自动注入 1.3 应用部署要求 2 负载均衡 3 流量迁移:金丝雀发布 3.1 发布应用 3.2 创建目标规则:Destinati ...

  4. tcbRouter

    tcb-router 基于koa风格的小程序·云开发云函数轻量级类路由库,主要用于优化服务端函数处理逻辑 安装 在云函数当前目录下安装:npm install --save tcb-router  使 ...

  5. 前端小插件之手写js循环滚动特效

    很多前端都离不开滚动的特效,调用插件繁琐,后期更改麻烦,考虑到这些因素,自己写了一套无限循环滚动的小特效. 首先滚动特效很好写,用css就可以完成,下面写一个基础css向上循环滚动特效 html &l ...

  6. 隐马尔科夫模型(Hidden Markov Models) 系列之三

    转自:http://blog.csdn.net/eaglex/article/details/6418219 隐马尔科夫模型(Hidden Markov Models) 定义 隐马尔科夫模型可以用一个 ...

  7. 37.前台js登陆加密分析

    开篇 由于现在的登陆接口如果明文传输的话,容易被暴力破解,越来越多的网站选择了前台js加密的方式,像这样: 或者这样: 枯了,对渗透造成一定的影响 本篇文章将系统的讲述使用Python对前台js加密爆 ...

  8. 使用jave1.0.2将amr文件转成其他格式报错解决方案

    背景:最近需要将微信公众号里面用户发的语音文件转成其他格式的语音文件 介绍:在刚开始使用jave1.0.2 没有几行代码就可以实现,但是发现在转换的过程会报错,但是最后文件也转成功了,此时是在wind ...

  9. canal中间件

    简介: 基于数据库增量(模拟MySQL slave的交互协议)日志解析,提供增量数据订阅和消费(客户端与canal建立关系) 安装版本:1.1.0 git 环境需求: jdk1.7以上 mysql开启 ...

  10. Anaconda 安装 tensorflow 和 keras

    说明:此操作是在 Anaconda Prompt 窗口完成的 CPU版 tensorflow 的安装. 1.用 conda 创建虚拟环境 tensorflow python=3.6 conda cre ...