最近想用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. 深入理解Session和Cookie的区别

    Cookie简介 Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制. 目前Cookie已经成为标准,所有的主流浏览器如IE.Netscape.Firefox.Op ...

  2. SpringApplication到底run了什么(下)

    在上篇文章中SpringApplication到底run了什么(上)中,我们分析了下面这个run方法的前半部分,本篇文章继续开工 public ConfigurableApplicationConte ...

  3. sql server 大数据, 统计分组查询,数据量比较大计算每秒钟执行数据执行次数

    -- 数据量比较大的情况,统计十分钟内每秒钟执行次数 ); -- 开始时间 ); -- 结束时间 declare @num int; -- 结束时间 set @begintime = '2019-08 ...

  4. Markdown 文件如何实现 chm 文件打包

    需要借助2个工具,下面的链接都有对应的网址 LME和 hhw, 有不清楚的可以下面评论,7*24小时在线解答问题,也可以加博主微信 首先借助 Markdown To CHM(LME) 工具将Markd ...

  5. 利用Python读取图片exif敏感信息

    众所周知,现在很多的照相机等软件,拍摄会有选项,是否包含位置信息等. 当然有的人会说,我在微信中查看图片exif信息并没有啊,这是因为你发送到微信服务器的时候,微信帮你完成了保密工作. 常见的图片中包 ...

  6. Python字符编码和转码

    一:Python2 python2默认编码格式是ascii码,解释器解释代码时会将代码以及代码中的字符串等转换成ascii码再执行.这样会导致字符串输出或传输时,与当前环境编码格式不同的话会显示乱码. ...

  7. mysql数据库之运行时其他报错

    This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de 错误解决办法 这是我们开启了bin-log, ...

  8. Rxjava学习笔记

    1.使用Observable.range(int start, int count)创建一个发射特定整数序列的Observable,第一个参数为起始值,第二个为发送的个数,如果为0则不发送,负数则抛异 ...

  9. Android APK开发 Drawable文件夹下的自定义Drawable文件

    版本:2018/2/11 Drawable的分类 自定义Drawable SVG矢量图 个人总结的知识点外,部分知识点选自<Android开发艺术探索>-第六章 Drawable 1.Dr ...

  10. flask实战-个人博客-电子邮件支持

    电子邮件支持 因为博客要支持评论,所以我们需要在文章有了新评论后发邮件通知管理员.而且,当管理员回复了读者的评论后,也需要发送邮件提醒读者. 为了方便读者使用示例程序,personalBlog中仍然使 ...