在上期,我们提到,实现支持完备QoS的运营级别GPU虚拟化的关键在于,实现GPU任务的上下文切换。这实际上涉及到一个问题:
GPU的指令是不是图灵完备的?
如果GPU的指令是图灵完备的,引出的下一个问题就是:
由于图灵完备的处理器必然支持if-else指令,不同的GPU硬件线程(CUDA Core)跑到了不同的if-else分支会怎么样?
以及另一个更难的问题:多个GPU线程如何实现步调一致?
此外,GPU任务的上下文切换实际上是将GPU的各个线程的寄存器列(register file)保存到内存,那么,这就涉及到GPU硬件的存储器组织。
我们将在这几期中集中讨论这些问题。
话分两头,让我们先看一个故事:
小H在知道了图灵是谁以后,去翻看图灵的传记。
图灵爱下国际象棋。1948年,图灵开发了一个国际象棋程序,名叫Turochamp,但由于缺乏合适的计算机来运行这个程序,图灵只好用所谓的“图灵机”来运行它。
所谓的“图灵机”,其实就是图灵本人找了一张写着指令的纸。一支笔,以及一张存取数据的纸构成的。在“图灵机”上,Turochamp每下一步需要半小时的时间。
图灵邀请小H来帮他测试这个程序,两个人拿出棋盘,图灵充当“图灵机”严格执行自己的Turochamp计算程序,而小H漫不经心地下着。
突然,小H发现,图灵,不,Turochamp出现了破绽…小H大喜,下出了车C8-D8,牵制住白方的皇后。白方皇后如果跑开,王就暴露在黑方车攻击范围内了,因此只能咽下皇后被吃的苦果。图灵一看大势已去,代表Turochamp认输了。
小H下赢了棋,很开心,这时突然想上厕所,却忘了英文该怎么说,只好到处寻找,好不容易找到厕所了,门却被锁住打不开。
小H被尿憋醒了。
之所以图灵能够用一支笔和两张纸构成的“图灵机”模拟一台计算机来运行国际象棋程序,是因为,所谓的“图灵机”支持以下功能:
(而这三部分也恰好对应冯·诺依曼描述的算术逻辑单元、控制器和输入输出设备)。
在Nvidia的《Parallel Thread execution Instruction Set Architecture》(https://docs.nvidia.com/cuda/parallel-thread-execution/index.html )中,对GPU的指令集做了详细的介绍。
先说结论:Nvidia GPU的指令集是图灵完备的。
Nvidia GPU使用的是高度精简的指令集,具备一系列加减乘除等算术逻辑指令;分支跳转、调用/返回等控制指令,以及load/store等内存读写指令。
因此,Nvidia GPU具备图灵完备的指令集。
我们使用高级编程语言,调用所有CUDA库进行对GPU的编程,实际上都是将高级语言程序(特别是数学表达式)编译为GPU指令,在GPU中并发执行。这就需要我们深入理解GPU的内部。
我们下期开始详解GPU内部的计算单元和存储单元的组织。