CUDA学习笔记1
最近要做三维重建就学习一下cuda的一些使用。
CUDA并行变成的基本四路是把一个很大的任务划分成N个简单重复的操作,创建N个线程分别执行。
CPU和GPU,有各自的存储空间:
- Host, CPU and its memory
- Device, GPU and its memory.
kernel是cuda编程的关键,是跑在gpu的代码,用标识符__global__注明。
一个典型的cuda程序包含并行代码补足串行代码,串行代码由host执行,并行代码在device执行。host端是标准c,device是cuda c代码。
NVIDIA C编译器(nvcc)可以编译host和device生成的可执行程序。
CUDA的处理流程:
- 从cpu拷贝数据到GPU。
- 调用kernel来操作存储在GPU的数据。
- 操作结果从GPU拷贝到CPU。
Memory操作
Standard C Functions: malloc memcpy memset free
CUDA C Functions: cudaMalloc cudaMemcpy cudaMemset cudaFree
i.e.
cudaError_t cudaMemcpy (void* dst, const void* src, size_t count, cudaMemcpyKind kind)
最后一个kind的类型如下:
- cudaMemcpyHostToHost
- cudaMemcpyHostToDevice
- cudaMemcpyDeviceToHost
- cudaMemcpyDeviceToDevice

一个单独的kernel启动所有的县城组成一个grid, grid中所有的线程共享global memory。一个grid由许多block组成,block由许多线程组成,grid和block都可以是一维、二维或者三维,上图是诡异而二维的grid和二维的block。
一般会把grid组织成2d,block为3d。grid和block都使用dim3作为声明。i.e.
dim3 block(3);
dim3 grid((nElem + block.x - 1) / block.x);
dim3仅为host端可见,其对应的device端类型为uint3可见。
启动kernel
cuda kernel的调用格式
kernel_name <<<grid, block>>>(argument list);
其中grid和block为dim3的变量。通过这两个变量可以配置一个kernel的线程总和,以及线程的组织形式。
i.e.
kernel_name <<<4, 8>>>(argument list);
这个表明grid为一维,有4个block,block为一维,有8个线程,所以是32个线程。
Note: cuda kernel的启动都是异步的,当cuda kernel被调用的时候,控制权会立即返回给cpu。
kernel的限制:
- 仅能获取device memory
- 必须返回void类型
- 不支持可变数目参数
- 不支持静态变量
- 不支持函数指针
- 异步
CUDA学习笔记1的更多相关文章
- CUDA学习笔记(三)——CUDA内存
转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm5f.html 结合lec07_intro_cuda.pptx学习 内存类型 CGMA: Compute ...
- CUDA学习笔记(二)【转】
来源:http://luofl1992.is-programmer.com/posts/38847.html 编程语言的特点是要实践,实践多了才有经验.很多东西书本上讲得不慎清楚,不妨自己用代码实现一 ...
- CUDA学习笔记-1: CUDA编程概览
1.GPU编程模型及基本步骤 cuda程序的基本步骤如下: 在cpu中初始化数据 将输入transfer到GPU中 利用分配好的grid和block启动kernel函数 将计算结果transfer到C ...
- CUDA学习笔记(四)——CUDA性能
转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm5h.html 四.CUDA性能 CUDA中的block被划分成一个个的warp,在GeForce880 ...
- CUDA学习笔记(一)——CUDA编程模型
转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm56.html CUDA的代码分成两部分,一部分在host(CPU)上运行,是普通的C代码:另一部分在d ...
- CUDA学习笔记(二)——CUDA线程模型
转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm5b.html 一个grid中的所有线程执行相同的内核函数,通过坐标进行区分.这些线程有两级的坐标,bl ...
- CUDA学习笔记(一)【转】
CUDA编程中,习惯称CPU为Host,GPU为Device.编程中最开始接触的东西恐怕是并行架构,诸如Grid.Block的区别会让人一头雾水,我所看的书上所讲述的内容比较抽象,对这些概念的内容没有 ...
- cuda学习笔记——deviceQuery
main(int argc, char **argv):argc是参数个数,**argv具体的参数,第0个是程序全名 cudaError_t类型:记录cuda错误,值为cudaSuccess则正确执行 ...
- CUDA学习笔记4:CUDA(英伟达显卡统一计算架构)代码运行时间测试
CUDA内核运行时间的测量函数 cudaEvent_t start1; cudaEventCreate(&start1); cudaEvent_t stop1; cudaEventCreate ...
随机推荐
- 活动任务出现bug
之前做的一个活动任务发现一个bug,是以前和离职同事一起对逻辑的时候没有考虑到的,配置活动的时候应该要先查询下,如果这个产品线上在这段时间已经配置了并且上线了,则不能在做活动处理了,否则就和前面的活动 ...
- Js判断flash是否被禁用,如果禁用并开启flash
<script> function flashChecker() { ; //是否安装了flash ; //flash版本 if(document.all) { var swf = new ...
- 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!
原文地址 迁移到:http://www.bdata-cap.com/newsinfo/1741515.html 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和f ...
- c# 开发+MySql数据库
今天就一个客户端的任务:1.把Excel文件转成特定格式插入到数据库中:2.查出该文件,并且导出Excel文件:3.如果插入数据错误,则把刚插入的数据删除掉.感觉比较简单,可是,墨迹了一天呀....总 ...
- nmap指令
-sP 主机发现 -p 端口扫描(可区域) -sV 端口(服务版本信息)-O 操作系统-iL 使用列表里的IP.(快捷方便)-iR 对公网上的随机n个IP.--excludeile ...
- Android程序员事件分发机制学习笔记
通过问题来学习一个东西是很好的方法.学习Android中View的事件体系,我也通过给自己提问题,在解决问题的同时也就知道了其中原理. 首先来几个问题起步: 什么是事件?什么是事件分发机制? 在我们通 ...
- 【JavaScript】图片加载由模糊变清晰 —— 图片优化
开发过程中,一些图片的展示时,加载很慢很久,后来把图片缩放压成缩略图吧,速度是快了但是模糊不清,如何处理这样问题,下面就和大家分享一下自己的处理方法. 先让客户端加载像素小的缩略图: <img ...
- VUE-X 的传值使用
1.导入vuex vuex是基于vue 的 import Vuex from 'vuex' Vue.use(Vuex); 导入 2.创建store 实例 let store = new Vuex. ...
- Nat类型测试
这是一个测试NAT类型的小工具,一般也没太多用处,只有游戏玩家可能需要用来测试你的网络NAT类型是什么.NAT类型一般分为以下4种: 1. Full Cone NAT (完全圆锥型)2. Restri ...
- 清理Linux 磁盘空间
1.执行 lsof | grep deleted发现有大量刚刚删除文件的进程存在,kill掉进程(或者重启进程) OK 2.查看磁盘信息:df -lh 3.循环定位最大文件目录:du -h - ...