zoukankan      html  css  js  c++  java
  • CUDA 概念汇总

    简介

    最近接触到了 cudaStream,对于一个没写过 CUDA 的人来说,一时有点难理解。于是网上找了几篇文章,快速入门了一下。其实说白了 cudaStream 就是一个执行流,用以提高并行度。

    下面是学习过程中见到的概念。概念真的太重要了。

    核函数:CUDA 的执行单元。核函数用 __global__ 符号声明,在调用时需要用 <<<grid, block>>> 来指定kernel要执行的线程数量

    线程层次结构:grid -> block -> thread。一个 grid,多个 block,一个网格上的线程共享相同的全局内存。一个 block,多个 thread,一个 block 上的 thread 使用共享内存来通信。grid 和 block 都是三维的,在核函数中可以使用 blockDimgridDim 来获取维度大小。

    流式处理器:一个 block 上的所有线程在一个 SM 上执行,多个线程对应多个 core,每个 core 有寄存器、局部内存(local memory),每个 SM 上又有内存(shared memory),整个 GPU 上又有另一个内存(global memory)。

    线程束:SM 采用了 SIMT 架构,基本的执行单元是线程束,一个线程束 32 个线程,这些线程执行相同的指令。遇到分支情况,需要等待,因为单指令多线程,即每个线程上的指令都是一样的,所以分支情况性能会差。

    显存的使用:设备上使用的内存和主机上使用的内存不是一个东西,所以如果要在设备上进行计算,需要将数据拷贝到设备上后计算。

    统一内存:CUDA 6.0 引入的概念,使用一个托管内存共同管理 host 和 device 的内存,函数调用 cudaMallocManaged

    Stream:利用 Stream 将内存读取和数值运算并行,从而提升数据的吞吐量。默认情况下,CUDA 使用一个 Default Stream 来进行数据拷贝。通常采用将数据分块的做法,将不同数据块分配给不同的 Stream 做数据传输和计算,这样多个数据块就并行起来了,提高了并行度,从而提升数据的吞吐量。相关的 API 有 cudaStreamCreate, cudaMemcpyAsync

    Event:用以监视流的运行情况,或者精确计时。

    总结

    看了下面的参考资料,算是稍微认识了一下 CUDA。如何进一步学习呢?进一步 CUDA 做什么呢?我们用 CUDA 的目的无非就是利用并行计算来加速运算,本质就是算的更快。进一步学习 CUDA 的目的就是可以更快的计算,即性能优化,掌握各种 Trick,掌握硬件架构等。至于我,就不深入学习了... 我只不过是想知道 cudaStream 是干嘛的。

    参考资料

    [1] https://zhuanlan.zhihu.com/p/34587739

    [2] https://zhuanlan.zhihu.com/p/51402722

    [3] https://zhuanlan.zhihu.com/p/75720006

    [4] https://zhuanlan.zhihu.com/p/53773183

  • 相关阅读:
    NPOI操作Excel(三)--解析Excel
    NPOI操作Excel(二)--创建Excel并设置样式
    NPOI操作Excel(一)--NPOI基础
    git使用
    10、生鲜电商平台-财务系统模块的设计与架构
    9、生鲜电商平台-推荐系统模块的设计与架构
    session详解
    Java中的Synchronized关键字用法
    Java线程安全与多线程开发
    8、生鲜电商平台-购物车模块的设计与架构
  • 原文地址:https://www.cnblogs.com/zzk0/p/15506607.html
Copyright © 2011-2022 走看看