最近要做三维重建就学习一下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的处理流程:

  1. 从cpu拷贝数据到GPU。
  2. 调用kernel来操作存储在GPU的数据。
  3. 操作结果从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的类型如下:

  1. cudaMemcpyHostToHost
  2. cudaMemcpyHostToDevice
  3. cudaMemcpyDeviceToHost
  4. 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类型
  • 不支持可变数目参数
  • 不支持静态变量
  • 不支持函数指针
  • 异步

最新文章

  1. 【Win10应用开发】通过拖放来打开文件
  2. java连接数据库的模糊查询
  3. &quot;ORA-12154: TNS:could not resolve the connect identifier specified&quot;的解决办法
  4. 搭建Mono for Android开发环境(用离线版)
  5. Jquery 遍历表单 AJAX提交
  6. 【转】ubuntu下解压缩zip,tar,tar.gz和tar.bz2文件
  7. hdu3410-Passing the Message(RMQ,感觉我写的有点多此一举。。。其实可以用单调栈)
  8. liunx 内存文件 tmpfs
  9. opencv配置(win10+VS2015+opencv3.1)
  10. 【Android Widget】2.ImageView
  11. 使用jsonp完美解决跨域问题
  12. 设计模式——简单工厂模式(C++实现)
  13. Python-定时爬取指定城市天气(二)-邮件提醒
  14. ss命令详解
  15. Cognos无法解密来着内容库的用户名和密码凭证
  16. 在windows上安装redis并设置密码
  17. 使用 mysqladmin debug 查看死锁信息
  18. EPEL源-是什么全称
  19. Javascript权威指南阅读笔记--第3章类型、值和变量(1)
  20. Java反射学习一

热门文章

  1. SQLServer日常bug记录
  2. LinQ实现DataTable不定行转列 行列转换,有图
  3. Flask应用启动流程
  4. js生成一定范围内的随机整数
  5. 扒一扒那些年我们console过的那些事儿
  6. ios证书制作与上架指南
  7. Date工具类
  8. Spring boot配置MongoDB以及Morphia踩坑记录
  9. CDH5.13快速体验
  10. SQL 分组后只获取每组的一条数据