在上一期,我们了解到简单的GPU发展史,它实际上来自3D游戏的计算需求,具备三角形投影及像素填充能力。
三角形投影是将空间的三角形投影到平面上:
有中学数学基础的同学很容易可以看出,主要涉及到的运算是三角函数运算。在计算机中,三角函数运算是如何实现的呢?
小H一时想不出思路,向方老师请教。方老师告诉小H:去看《高等数学》里面第九章,关于泰勒展开的部分。
小H找来了同济大学出版的《高等数学》,刚翻开不久,书中就飞出了几只瞌睡虫,钻进小H的鼻子……
小H恍惚回到了公元450年左右的宋代。(不是赵匡胤建立的北宋,是南北朝时期,刘裕在南方建立的刘宋)
小H见到了一位官员模样的中年人,对着地上一个圆形在沉思。片刻,他开始在圆形中绘制一个正六边形:
随即,他又在六边形的基础上,画了一个十二边形:
再画出二十四边形、四十八边形……很快,多边形就越来越接近圆了。
中年人从布包中掏出算筹,在桌上开始演算。
小H突然想起了什么,走过去问道:“您可是祖冲之先生?”
“在下正是。请问有什么事情?”
“请问,您是在计算圆周率吗?”
“何谓圆周率?”
小H正打算告诉他答案,被一记大棒敲醒:“穿越不得干涉历史进程!”
小H醒来,发现口水流到了《高等数学》的封面上。
原来,古代对圆周率的算法,实际上是求一个极限:
而三角函数的计算,则需要运用泰勒展开的方法:
这样,就可以把三角函数转换成为加减乘除了。祖冲之就是使用这种方法,仅仅利用算筹作为计算工具,就将圆周率计算到了小数点后7位,并且用两个非常容易记忆的分数作为圆周率的近似值:
约率 = 22/7 ≈ 3.142857 ≈ 3.14
密率 = 355/113 ≈ 3.1415929
实际上,利用泰勒展开的方法,还可以计算出指数函数、对数函数、反三角函数、双曲函数和反双曲函数等非幂函数,也就是将这些非加减乘除算法能计算的数学公式简化为使用加减乘除能够解决的问题。
NVidia的Geforce256 这一代GPU,相对于以Voodoo、TNT为代表的专用图形GPU,最大的改进就是,使用具有通用计算(加减乘除)能力的计算单元,代替专用的三角形计算引擎,并在指令层级实现通用计算的能力,也就是所谓的GPGPU(General Purpose GPU)。
GPGPU的实现,我们可以理解为,首先将CPU极度简化,精简掉其中大部分内存管理、IO、中断与异常处理等控制指令,仅保留大大简化的ALU(Arithmetic and Logic Unit)及所必须的控制电路,并为其提供适合并发运算的寄存器,作为GPGPU的基本运算单元。然后,将成百上千个这样的基本运算单元集成起来,实现并发计算简单重复的算法,如我们在前两期提到的卷积算法等。
与图形GPU相比,GPGPU甚至有可能精简掉大部分图形专用的功能,如光影追踪计算单元和渲染单元,甚至把连接显示器的接口都精简到,使其成为纯粹的异构计算单元,用于提供算力。
小H感叹:如果能再穿越回去一次,把GPU送给祖冲之爷爷,祖冲之爷爷能不能把圆周率计算到小数点后1万位呢?
这个问题我们下期再进行解答。