zoukankan      html  css  js  c++  java
  • 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的处理流程:

    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类型
    • 不支持可变数目参数
    • 不支持静态变量
    • 不支持函数指针
    • 异步
  • 相关阅读:
    Java随学随记
    jquery的bind()和trigger()
    js跨域访问
    好文推荐系列-------(5)js模块化编程
    好文推荐系列---------(4)使用Yeoman自动构建Ember项目
    好文推荐系列--------(3)GruntJS 在线重载 提升生产率至新境界
    好文推荐系列--------(2)GruntJS——重复乏味的工作总会有人做(反正我不做)
    好文推荐系列--------(1)bower---管理你的客户端依赖
    英文邮件写作
    原型
  • 原文地址:https://www.cnblogs.com/tweed/p/10880178.html
Copyright © 2011-2022 走看看