理解CUDA应用程序的结构和执行

CUDA是Nvidia提出的一套并行计算的平台和编程模型,可以用来充分利用Nvidia自家的GPU做通用的并行计算。GPU作为图像处理单元,由于图像渲染的特性,使得GPU由成百上千一系列小的,简单的的核心组成可以同时处理很多任务。

1. Nvidia GPU结构

一个典型的Nvidia GPU由一系列流处理器组成 (Streaming Multiprocessor), 每一个流处理器中又由一系列CUDA core, Ray Tracing cores, Tensor cores以及一些辅助单元组成。
Screen Shot 2021-01-25 at 10.28.12 PM.png

这是一个典型的安培架构的流处理器的结构图,Nvidia RTX 3090有82个这样的流处理器组成,每个流处理器中有128个CUDA核心,总共10496个CUDA核心。流处理器的个数,每个流处理器中CUDA核心的个数,每流处理器中寄存器的大小和共享内存的大小,是我们想要写一个高性能的CUDA应用程序时需要重点考虑的东西。因为这跟CUDA应用程序的结构有关。

2. CUDA应用程序的结构

一个CUDA应用程序由两部分组成,一部分运行在CPU上,一部分运行在GPU上。需要运行在GPU上的代码称之为Kernel。一个CUDA应用程序中可以包含多个kernel用来实现不同的功能。当一个kernel被运行时,根据你的设置不同,可能有成百上千个线程会被创建去共同完成这个kernel想要完成的任务。

2.1 那如何有效的组织和协调这些线程呢?

CUDA将这些线程组织成4个不同的层级。

  1. threads grid
  2. thread block
  3. warp
  4. thread

一个kernel可以包含一个或多个grid,每一个grid又根据设置的不同包含一个或多个thread block,而每个thread block又由warps组成,每个warp必须由32个threads组成,并且这32个threads会同时运行,因为warp里的线程总是同时运行,所以我们从软件角度来看,也可以将一个warp看成一个最小的执行单元。这32个线程会按相同的步骤执行相同的代码,唯一的不同的是每一个线程可能处理的数据不同。如果一个kernel创建的总的线程数不是32的整数倍,意味着有些warp凑不够32的线程,而这些warp还是会创建32个线程,只是有些线程并没有做实际的任务,由于一个线程将会对应一个CUDA核心,所以这些做无用功的线程将会占用CUDA核心浪费资源。

2.2 如何将这些线程分配给CUDA核心去执行呢?

首先我们需要将这些线程分配到不同的流处理器上,CUDA是以thread block为最小单位分配到不同的流处理器上的。一个流处理器可以包含多个不同的thread block,但一个thread block不能分配到多个不同的流处理器上,原因是每个thread block里面的的线程可以共享内存,如果跨流处理器的话,会大大降低共享内存的效率。每个流处理器能容纳的thread block的个数取决的这个流处理器的共享内存的容量和寄存器的个数以及有多少个threads在这个thread block里和每个线程的对共享资源的消耗量, 而跟这个流处理器中的CUDA核心数量无关。
当所有的流处理器都没有足够的资源, thread block无法被分配到流处理器上时,会被放在一个等待队列中等待有足够的资源去分配。当一个thread block被分配到一个流处理器上时,只有当其中所有的threads完成其工作,这个thread block才会被释放,其所占用的资源才会被流处理器回收以便分配给在等待队列里的thread block。当一个thread block被分配到一个流处理器之后,其所包含的线程开始被组织成warp被CUDA核心执行。一个warp由32个线程组成,当 其开始运行时,会占用32个CUDA核心,由于内存读取的指令比算术运算的指令运行的要慢,所以当warp中的线程在等待数据时,CUDA核心会处于闲置的状态,这是对资源的一种浪费,所以每一个流处理器上都会配备warp调度器用来将等待的warp调出CUDA核心将准备好数据可以直接运行的warp调入CUDA核心来充分利用CUDA核心的计算资源。

2.3 一个例子

未完待续。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • 由于最近实验需要在GPU上狠下功夫,所以恶补了GPU的知识。我发现国内blog其实对GPU内部的物理、逻辑的各个组...
    CPinging阅读 4,172评论 0 18
  • 1. CPU vs. GPU 1.1 四种计算机模型 GPU设计的初衷就是为了减轻CPU计算的负载,将一部分图形计...
    王侦阅读 20,859评论 3 20
  • 开篇一张图,后面听我编 1. 知识准备 1.1 中央处理器(CPU) 中央处理器(CPU,Central Proc...
    He_Yu阅读 47,032评论 7 115
  • CUDA是一种新的操作GPU计算的硬件和软件架构,它将GPU视作一个数据并行计算设备,而且无需把这些计算映射到图形...
    ai领域阅读 9,059评论 0 8
  • 夜莺2517阅读 127,717评论 1 9