本文来源公众号“江大白”,仅用于学术分享,侵权删,干货满满。
原文链接:AI算法工程化落地,CUDA开发心得汇总
以下文章来源于微信公众号:周彬
作者:周彬
链接:https://zhuanlan.zhihu.com/p/570795544
本文仅用于学术分享,如有侵权,请联系后台作删文处理
导读
CUDA编程在AI工程化过程中,是非常重要的一部分。本文详细汇总了作者对于CUDA开发过程中的一些心得和经验,希望对大家有帮助。
1 基本编程模型
CUDA开发中最基本的概念就是显存、kernel函数、线程块、stream:
-
开发者可以通过CUDA Runtime API,申请、释放显存,并在内存和显存间进行数据拷贝。
-
开发者可以编写专用于在GPU上执行的kernel函数,在主机侧通过CUDA C扩展调用kernel函数,调用将创建数以万计的GPU线程,每个GPU线程均会完整执行一次kernel函数,kernel函数内可以对显存进行读、写等各种操作。数以万计的GPU线程之间靠只读的内置变量(线程ID等)互相区分。
-
一次kernel调用对应的GPU线程,需划分为一个个尺寸相同的线程块。线程块是向GPU进行调度的最小单位,GPU同时支持多个线程块的执行,达到上限后,只有旧的线程块内的线程全部执行完成后,新的线程块才会被调度入GPU。
-
stream相当于是GPU上的任务队列。每个kernel调用或大多数CUDA API都可以指定关联到某一个stream。同一个stream的任务是严格保证顺序的,上一个命令执行完成才会执行下一个命令。不同stream的命令不保证任何执行顺序。部分优化技巧需要用到多个stream才能实现。如在执行kernel的同时进行数据拷贝,需要一个stream执行kernel,另一个stream进行数据拷贝。
2 基本硬件架构及其在Kernel执行中的作用
显卡由内部的主板、显存颗粒、GPU芯片等组成。GPU内部的架构如下图:
GPU架构图
可以看到GPU由许许多多的SM(Stream Multiprocesser)组成。SM内部的架构如下图:
SM架构图
线程块就是被调度到SM上执行的,按照线程块占用的硬件资源不同,SM可以同时执行一个或多个线程块。
SM内部的主要部件有:
-
L1 Cache及Shared Memory。
-
L1 Cache是高速缓存。
-
Shared Memory是一块可以由开发者编程控制的高速缓存。开发者可以在kernel函数内通过编程手段写入或读取数据。其访问latency远远小于全局显存。
-
SM分为4个子区域,称为SMSP。每个SMSP包括如下功能单元。</