CUDA C编程入门
最近想用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编程入门的更多相关文章
- 【浅墨著作】《OpenCV3编程入门》内容简单介绍&勘误&配套源码下载
经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...
- GPU 编程入门到精通(五)之 GPU 程序优化进阶
博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识.鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程. 有志同道合的小伙 ...
- GPU 编程入门到精通(四)之 GPU 程序优化
博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...
- GPU 编程入门到精通(三)之 第一个 GPU 程序
博主因为工作其中的须要.開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...
- PHP面向对象(OOP)编程入门教程
面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...
- Windows编程入门程序详解
引用:http://blog.csdn.net/jarvischu/article/details/8115390 1. 程序 /******************************* ...
- 【PHP面向对象(OOP)编程入门教程】1.什么是面向对象?
面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...
- Linux 利器- Python 脚本编程入门(一)
导读 众所周知,系统管理员需要精通一门脚本语言,而且招聘机构列出的职位需求上也会这么写.大多数人会认为 Bash (或者其他的 shell 语言)用起来很方便,但一些强大的语言(比如 Python)会 ...
- 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥) 介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...
随机推荐
- 未能加载文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。
网站部署到IIS提示Microsoft.Web.Infrastructure,未能加载 解决方案 使用nuget安装 Microsoft.Web.Infrastructure拷贝到bin目录下面
- Python轮子
代码复用 会用到的轮子贴在这篇文章中,备用.
- PAT 1026程序运行时间
PAT 1026程序运行时间 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间 ...
- Spring Cloud Gateway转发Spring WebSocket
Spring Cloud Gateway转发Spring WebSocket 源码:https://github.com/naah69/SpringCloud-Gateway-WebSocket-De ...
- 添加shiv让所有现代浏览器都支持 HTML5 语义元素 html5.js让IE(包括IE6)支持HTML5元素方法
引用Google的html5.js文件 <!--[if IE]> <script src=”http://html5shiv.googlecode.com/svn/trunk/htm ...
- File "tesserocr.pyx", line 2443, in tesserocr._tesserocr.image_to_text RuntimeError: Failed to in...
将Tesseract-OCR安装目录下的tessdata文件夹复制到Python解释器目录下就可以了
- JS 树形结构与数组结构相互转换、在树形结构中查找对象
总是有很多需求是关于处理树形结构的,所以不得不总结几个常见操作的写法.¯\_(ツ)_/¯ 首先假设有一个树形结构数据如下 var tree=[ { 'id': '1', 'name': '教学素材管理 ...
- qtp安装和使用
QTP许可证密钥的破解步骤: 以前使用QTP9.2 使用此方法成功破解,现在本人使用的HP QuickTest Professional 11 英文版,也成功适用. 一.准备工作: 1. 由于注册码文 ...
- GeoIP的使用-C语言版
0x00. 简介 GeoIP库可以根据IP地址(支持IPv4 和 IPv6), 定位该IP所在的 洲.经纬度.国家.省市.ASN 等信息. GeoIP目前已经升级到GeoIP2,GeoIP2有两个版本 ...
- java修饰符在含义以及在eclipse下的显示
java四类修饰符的含义: public:公开的修饰符,没有调用限制,只用有该对象的路径,都可以调用. protected:在本类,同一个包,或子类中可以被调用. default(没有修饰符):在同一 ...