最近要做三维重建就学习一下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类型
  • 不支持可变数目参数
  • 不支持静态变量
  • 不支持函数指针
  • 异步

CUDA学习笔记1的更多相关文章

  1. CUDA学习笔记(三)——CUDA内存

    转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm5f.html 结合lec07_intro_cuda.pptx学习 内存类型 CGMA: Compute ...

  2. CUDA学习笔记(二)【转】

    来源:http://luofl1992.is-programmer.com/posts/38847.html 编程语言的特点是要实践,实践多了才有经验.很多东西书本上讲得不慎清楚,不妨自己用代码实现一 ...

  3. CUDA学习笔记-1: CUDA编程概览

    1.GPU编程模型及基本步骤 cuda程序的基本步骤如下: 在cpu中初始化数据 将输入transfer到GPU中 利用分配好的grid和block启动kernel函数 将计算结果transfer到C ...

  4. CUDA学习笔记(四)——CUDA性能

    转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm5h.html 四.CUDA性能 CUDA中的block被划分成一个个的warp,在GeForce880 ...

  5. CUDA学习笔记(一)——CUDA编程模型

    转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm56.html CUDA的代码分成两部分,一部分在host(CPU)上运行,是普通的C代码:另一部分在d ...

  6. CUDA学习笔记(二)——CUDA线程模型

    转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm5b.html 一个grid中的所有线程执行相同的内核函数,通过坐标进行区分.这些线程有两级的坐标,bl ...

  7. CUDA学习笔记(一)【转】

    CUDA编程中,习惯称CPU为Host,GPU为Device.编程中最开始接触的东西恐怕是并行架构,诸如Grid.Block的区别会让人一头雾水,我所看的书上所讲述的内容比较抽象,对这些概念的内容没有 ...

  8. cuda学习笔记——deviceQuery

    main(int argc, char **argv):argc是参数个数,**argv具体的参数,第0个是程序全名 cudaError_t类型:记录cuda错误,值为cudaSuccess则正确执行 ...

  9. CUDA学习笔记4:CUDA(英伟达显卡统一计算架构)代码运行时间测试

    CUDA内核运行时间的测量函数 cudaEvent_t start1; cudaEventCreate(&start1); cudaEvent_t stop1; cudaEventCreate ...

随机推荐

  1. SVN客户端安装

    1.安装客户端 双击运行: 点击[next] 点击[next] 选择好路径后,点击[next] 点击[install]安装 点击[finish]完成安装.安装完成后重启计算机. 2.客户端访问SVN服 ...

  2. Python【day 9】函数入门1

    1.什么是函数 函数的概念:对功能或者动作的封装 函数的好处:避免重复代码 2.函数的定义 1.函数的定义 def 函数名(形参列表): 函数体(return) 2.函数的调用 函数名(实参列表) 3 ...

  3. 【USACO题库】1.3.4 Prime Cryptarithm牛式

    好久没有发题解了,今天发一个很久很久之前写过得题吧 题目其实莫名的难 但是理解后,原来就是一只纸老虎 题目加工中~~~~(缩短题目) 加工完成:已知数字1-9组成集合的一个子集,求满足题意乘法步骤的情 ...

  4. 进程、线程、轻量级进程、协程与 go 的 goroutine

    本文内容 进程 线程 协程 Go 中的 goroutine 参考资料 最近,看一些文章,提到“协程”的概念,心想,进程,线程,协程,前两个很容易,任何一本关于操作系统的书都有说,开发时也经常用,但是协 ...

  5. 如何在相同的类名中单独为选中元素设置JS

    很多时候,我发现对一个类名添加事件,每次都是所有同类名元素一起触发,使用 this可以仅对当前选中的元素应用事件 如 $('.guowai button').click(function() { /* ...

  6. iOS开发使用Xcode的一些小技巧

    1.打开iOS项目 如果你当前目录下既有project又有workspace,你可以在终端使用命令“xed.”自动打开workspace,如果只有project,它会自动打开project. 2.清理 ...

  7. MySQL基础:DCL语句总结

    SQL语言大致分为DCL.DDL.DML三种,本文主要介绍MySQL 5.7版本DCL语句. 概述 DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可 ...

  8. 【JavaScript】图片加载由模糊变清晰 —— 图片优化

    开发过程中,一些图片的展示时,加载很慢很久,后来把图片缩放压成缩略图吧,速度是快了但是模糊不清,如何处理这样问题,下面就和大家分享一下自己的处理方法. 先让客户端加载像素小的缩略图: <img ...

  9. detectron2安装出现Kernel not compiled with GPU support 报错信息

    在安装使用detectron2的时候碰到Kernel not compiled with GPU support 问题,前后拖了好久都没解决,现总结一下以备以后查阅. 不想看心路历程的可以直接跳到最后 ...

  10. vue - 基础(3)

    1.数据的双向绑定 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...