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系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...
随机推荐
- new/delete与malloc/free的区别
new/delete与malloc/free的区别 参考: https://blog.csdn.net/u013485792/article/details/51329541 https://www. ...
- PHP之面向对象(下)
1,类的创建 class 2,对象的创建 new关键字 3,成员的添加 修饰符 添加成员需要三个修饰符 public 公开的 定义公共的属性和方法,类的外部,内部,子类都可以使用 protected ...
- idea中Entity实体中报错:cannot resolve column/table/...解决办法。
idea中Entity实体中报错:cannot resolve column/table/...解决办法. 若idea中Entity实体中报错: cannot resolve column.... c ...
- JAVA I/O系统 Thinking in Java 之 File类
File类的文件具有一定的误导性,我们可能会认为它指代的是文件,实际上并非如此.它技能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称.如果它指的是一个文件集,我们就可以对此集合调用list ...
- 剑指:包含min函数的栈(min栈)
题目描述 设计一个支持 push,pop,top 等操作并且可以在 O(1) 时间内检索出最小元素的堆栈. push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 get ...
- vmware关闭嘟嘟嘟嘟警告
在使用VMware workstation时,安装的windows或者Linux遇到错误操作时,会发生刺耳的嘟嘟声.如何关闭呢?在VMware虚拟机windows系统中的命令提示符处键入以下命令, 然 ...
- nginx无网络启动失败——proxy_pass域名DNS解析出错
问题: nginx启动或者reload的时候,会对proxy_pass后面的域名进行DNS解析,如果解析失败,启动就会失败或者reload失败. 我们是to B的产品,客户的环境可能是不通公网的,因此 ...
- DEDECMS安全设置篇
dedecms是好用,优化也好,就是不安全,个人是这样认为的,今天 闲着没事 整理了一些有助于dedecms网站安全的一些设置,可以说是目前最全的dedecms安全设置! 其一:保持DEDE更新,及时 ...
- 【EL表达式】EL从四大域中取数据
一.EL技术 1.EL 表达式概述 EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL 出现的目的是要替代jsp页面中脚本的编写. 2.EL从域中取出数据 ...
- 性能测试基础---ant集成1
·Jmeter的命令行与ant等的集成.·为什么需要使用Jmeter的命令行模式(Non-GUI).·为了更好的利用负载机的资源.GUI模式会消耗更多的系统资源.·为了更好的掌握jmeter和其它工具 ...