A White Paper on Neural Network Deployment
  • ❤️‍🔥A White Paper on Neural Network Deployment
    • ❤️‍🔥A White Paper on Neural Network Deployment
    • 🤠CUDA
      • 🤑CPU|GPU程序执行流程
      • 🤗QiuckLearnFromPicture
      • 🤒GPU编程模型
      • 🫣线程束和线程束分化|Warp
      • 🤭Reduction|并行规约
      • 🤔全局内存(Global Memory)访问模式
      • 🫢Share Memory|共享内存|Bank Conflicts
      • 😷CUDA流和事件
      • 🫡Nsight system和Nsight compute
      • 🤫Grid-Stride Loops
    • 😄ONNX
      • 😉ONNX中的各类Proto
      • 🤔onnx->torch
      • 🥳0x00自定义算子
      • 😕0x01自定义算子
      • 🥴ONNX 模型的修改与调试
      • 😆ONNX中的一些概念
      • 😍用python操作ONNX
      • 🥹ONNX中的广播机制
      • 🤣外部数据
      • 🥰ONNX Model hub
      • 😘ONNX IR(Intermediate Representation)
      • 🥳ONNX后端
      • 🥸概述
    • 🐶TensorRT
      • 🐱TensorRT快速入门指南
      • 🐭文档简介
      • 🐹TensorRT的功能
      • 🐰TensorRT的C++接口解析
      • 🦊TensorRT的Python接口解析
      • 🐻TensorRT如何工作
      • 🐼trtexec的使用
      • 🐻‍❄️实战:解析onnx模型保存为engine文件|from scratch
      • 🐨实战:加载engine文件并执行推理|from scratch
      • 🐯手撕TensoRT源码|0x00
    • 🫶模型量化和剪枝
      • 🖕IEEE754标准
      • 🫰浮点运算产生的误差
      • 🤲映射和偏移
      • 🫴quantization from scratch|python
      • 👏动态量化范围
      • 🤝量化粒度
      • 👍校准
      • 👊Post-Training Quantization
      • ✊Quantization-Aware Training
      • 🤞pytorch-quantization使用文档
      • ✌️Polygraphy-Cheatsheet
    • 🤺杂文不杂
      • 😾Roofline_model
      • 🤖模型部署的几大误区
      • 😽手算Ampere架构各个精度的Throughout
      • 😻Tensor Core VS CUDA Core
      • 😺PNNX计算图结构剖析
      • 🎃融合BN和Conv层
      • 👾深度神经网络编译器原理简介
      • 👽在WSL2上安装CUDA_cuDNN_TensorRT
    • 🍀CPP
      • 🪵lamda表达式|C++11
      • 🌴智能指针|C++11
      • 🌲右值引用|移动语义|完美转发|C++11
      • 🫑emplace_back 减少内存拷贝和移动|C++11
      • 🥬多线程|互斥锁|条件变量|C++11
      • 🥒异步操作|C++11
      • 🍆原子变量|CAS操作|内存顺序|C++11
      • 🍏对象生存期和资源管理|RAII设计思想
      • 🍎Pimpl设计模式|编译防火墙
      • 🌶️std::variant|C++17
      • 🫛std::any|C++17
    • 🩷部署实战
      • ❤️yolov8Multitask
      • 💚yolov5
      • 🧡pointpillars
      • 💛centerpoint
      • 🩵deepstream
      • 💜BEVfusion
      • 💙BEVLane
      • 🖤Occupancy
    • ☯️重点参考书籍
Powered by GitBook
On this page
  • Tensor core和cuda core 的概念
  • More examples
  • Reference

Was this helpful?

Edit on GitHub
  1. A White Paper on Neural Network Deployment
  2. 杂文不杂

Tensor Core VS CUDA Core

Previous手算Ampere架构各个精度的ThroughoutNextPNNX计算图结构剖析

Last updated 1 year ago

Was this helpful?

Tensor core和cuda core 的概念

tensor core和cuda core 都是运算单元,是硬件名词,其主要的差异是算力和运算场景。

  • 场景:cuda core是全能通吃型的浮点运算单元,tensor core专门为深度学习矩阵运算设计。

  • 算力:在高精度矩阵运算上 tensor core吊打cuda core。

CUDA Core

回顾一下NVIDIA的显卡架构出道顺序:

Tesla1.0 (2006年, 代表GeForce8800) -> Tesla2.0 (GT200) -> Fermi(算力可以支撑深度学习啦) -> Kepler(core增长) -> Maxwell(core继续增长) -> Pascal(算力提升)-> Volta(第一代tensor core) -> Turning(第二代 tensor core) -> Ampere(第三代tensor core)。

一个cuda core 包含了一个整数运算单元integer arithmetic logic unit (ALU) 和一个浮点运算单元floating point unit (FPU)。然后,这个core能进行一种fused multiply-add (FMA)的操作,通俗一点就是一个加乘操作的融合。特点:在不掉精度的情况下,单指令完成乘加操作,并且这个是支持32-bit精度。更通俗一点,就是深度学习里面的操作变快了。

Tensor Core

Tesla V100 的Tensor Core是可编程矩阵乘积单元,可为训练和推理应用提供高达 125 Tensor TFLOPS 的性能。Tesla V100 GPU 包含 640 个Tensor Core:每个 SM 8 个。Tensor Core及其相关数据路径是定制的,可显著提高浮点计算吞吐量,而功耗成本却不高。

如下图所示,每个Tensor Core提供一个 4x4x4 矩阵处理单元,执行 D = A * B + C 的运算,其中 A、B、C 和 D 均为 4×4 矩阵。矩阵乘法输入 A 和 B 是 FP16 矩阵,而累加矩阵 C 和 D 可能是 FP16 或 FP32 矩阵。

如下图所示,每个Tensor Core每时钟可执行 64 次浮点 FMA 混合精度操作(FP16 输入乘法与全精度乘积和 FP32 累加),一个 SM 中的 8 个Tensor Core每时钟总共可执行 1024 次浮点运算。与使用标准 FP32 运算的 Pascal GP100 相比,每个 SM 的深度学习应用吞吐量大幅提高了 8 倍,因此 Volta V100 GPU 的吞吐量与 Pascal P100 GPU 相比总共提高了 12 倍。张量核通过 FP32 累加对 FP16 输入数据进行运算。如图 所示,在 4x4x4 矩阵乘法中,FP16 乘法产生的全精度结果与给定点乘中的其他乘积一起在 FP32 运算中累加。

在程序执行过程中,多个Tensor Core可通过一个完整的线程同时执行。一个 warp 中的线程可提供较大的 16x16x16 矩阵操作供Tensor Core处理。

Tensor Core基础能力在于,一个时钟周期内可以完成一个64 floating point 的FMA,而cuda core是搞不定的,分多次。

其次,Tensor Core也能堆叠,V100上面就堆了640个。而且Tensor Core经过了几次升级,其操作的精度更加丰富了:

More examples

Reference

❤️‍🔥
🤺
😻
https://www.zhihu.com/question/451127498/answer/1813864500
https://developer.nvidia.com/blog/programming-tensor-cores-cuda-9/