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系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...
随机推荐
- Web Api 模型绑定 一
[https://docs.microsoft.com/zh-cn/aspnet/core/web-api/?view=aspnetcore-2.2]1.模型绑定 简单模型绑定针对简单类型(如stri ...
- 【开发笔记】- Grails框架定义一个不是数据库字段得属性
实体类 class Book{ String name String author // myfiled 我不想他在数据库中生成book表的字段 String myfield } 添加声明 class ...
- Vue-Cli 3.x 创建的项目中对 import 引入的 CSS 样式启用 autoprefixer
问题描述: Vue-Cli 3.x 默认开启了 autoprefixer,但对于在 main.js 中通过 import 引入的 CSS 并没有自动添加前缀 分析原因: autoprefixer 在项 ...
- B端产品需求文档怎么写?
B端,或者2B,一般指的是英文中的 to busniss,中文即面向企业的含义.与B端相对应的,是C端,或者2C,同样指的是英文中的 to customer,即面向消费者的意思.因此,人们平常所说的B ...
- 维护中常用的k8s和docker命令
kubernet命令 查看所有pod的信息: kubectl get pod --all-namespaces -o wide 查看命名为kube-system的pod kubectl get pod ...
- shell中sort用法
1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@rocrocket progr ...
- 将qemu使用的设备树dump出来
像下面的qemu启动命令: sudo qemu-system-aarch64 \ -M virt \ -cpu cortex-a53 \ -smp \ -m 4096M \ -kernel ./lin ...
- nginx 的 重定向
1. ngx.redirect(uri, status?) 301/302重定向 redirect 为外部重定向,有两种形式: rewrite ^ /foo? redirect; # ngi ...
- python 和 R 语言中的等差数列
等差数列的通项公式:an = a0 + n*d. 数学上 n 是可以取遍整个整个正整数集的,在现实中,n 是有范围的. 1.R 语言用 seq() 函数产生等差数列: 2.python 中 ran ...
- 1. 观察者模式总结(C++)
1. 介绍 观察者模式:定义了一种"一对多"的依赖关系,让多个观察者对象同时监听一个对象的改变,即当该对象的状态发现改变时,会通知所有它依赖的观察者对象.观察者模式属于行为模式. ...