|
笔者身在数学系,自然和计算有着不解之缘。在中学和本科期间,笔者已经用两寸笔头比划过无数加减乘除,运筹过数不尽的阿拉伯数字,手腕常常酸痛不已。这时候,电脑自然是绝佳帮手:进可玩星际争霸,观赏E盘里的岛国大片;退可编写程序,胜任大量人力难及的复杂任务。计算机在我们的日常生活中实在是无法割舍的一部分。
不过真正的研究工作可不是抬抬笔头做做作业就能了事的。实际应用中庞大的计算量不仅让人力望洋兴叹,普通的家用计算机也往往力不从心。虽然全身上下都由冰冷的金属和半导体元件砌合而成,计算机可以很长寿,但是根据摩尔定律(集成电路上的元件密度每两年翻一番),半导体领域可谓是长江后浪推前浪,更新换代非常迅速,再高寿也会被日新月异的技术所掩盖。如果你发现隔壁老王家的电脑看电影流畅,玩游戏炫酷,跑代码雷厉风行,解方程势如破竹,而自己的电脑迅雷进度条到99%就没了下文,这时候就可以考虑升级自己的电脑硬件了。
这一幅动图能大概反映出二十年来计算机所面临计算复杂度的变化:
国际象棋和围棋的计算复杂度对比。两者皆为决策树模型
我们知道,计算机的计算效率由它的大脑——CPU(Central Processing Unit,中央处理器)决定,修身首先要健脑,因此要升级自己的计算机,CPU性能占据了核心地位。有经验的读者在组装电脑时可能会参考CPU性能天梯图:
台式机CPU天梯(第六代架构)。图片来自“装机之家”
然而升级计算机并非参考几张天梯图,了解一些的硬件基本知识就可以完成的,因为这其中还牵扯到财力物力的问题。古之圣人视金钱为粪土,但这个信条在科技高速膨胀的今天显然是行不通的。圣人们不会料到,现在生活中需要花钱的地方越来越多,故此则失彼——孩子要读书,住房有月租,上几回高速,生一场大病,如果再不小心被家中娇妻拽住钱包,哪里还有升级电脑硬件的闲钱。
既然没钱升级电脑,难道就只好对着隔壁老王家的高科技望洋兴叹么?有钱能使鬼推磨,但没钱有时也能鬼使神差,有没有办法让自家电脑的其他组件帮助CPU处理一些工作呢?其中的玄机,就在于GPU当中。
GPU为何物
GPU(Graphic Progressing Unit)是显卡的核心,它和CPU只差了一个姓。这个姓决定了它们两者用途的不同,而相同的名却或多或少意味着这二位结构上的相似。
如前文所说,CPU是电脑的计算核心,就像大脑一样,所有任务都得经过CPU处理,事无巨细。GPU姓“G”,它的设计初衷自然就和图像(Graphic)有关,因此GPU最初只用来提高图像的流畅性问题。值得注意的是,CPU和GPU都是芯片,CPU很容易单独买到,而GPU只是显卡的组成部分,需要和显卡一起出售。独立显卡还需要考虑散热、调节工作频率和储存等问题,所以我们在电脑城中看到的独立显卡都自带风扇和其他大块组建。
几大常见计算机硬件的区别
GPU加速——团结就是力量
世上第一个GPU由nVIDIA公司在1999年推出[1],其设计初衷是在于提高电子游戏的流畅性。下面三个20世纪的著名游戏就是GPU推出之前电子游戏届的代表作:
从上至下分别为星际争霸、半条命、和极品飞车3
这些在当时看来令人耳目一新的大作,在今天已成为历史文物。现在电子游戏可谓是百花齐放,大体情况可以参考[2](传送门)。随着图像和视频越发细腻精致,若要使得图像处理更为连贯迅速,对电脑的计算要求越来越高。图像是由大量的像素点构成,图像每一次变动都会牵一发而动全身,所有像素点的输出都会发生变化,所以图像需要并行处理。通常用分辨率表示像素点个数,比如1024*768。那么多像素点在一瞬间发生变化,很考验一心多用的能力。
CPU向来专心致志,并不是一心多用的料。它的结构特点使它很擅长处理复杂的逻辑运算和内存统筹(使得在有限的内存中可以支持大量的程序,而避免死机),也就是单线程(Single Thread)的任务,而不擅长并行计算(Parallel Computing)。我们家用的CPU一般只有两个或四个核(Core),每个核一般可以支持两个线程同时运行(这称之为多线程技术,multithreading)。所以普通家用电脑的CPU只能同时处理八个独立的任务(任务不独立反而会减慢运行效率)。
既然图像处理大量依赖于并行计算,而CPU又不喜欢四处寻花问柳,那这个重担自然就落到了GPU身上。或许一些读者已经大概能够猜出,GPU的计算核心比CPU多很多,而作为交换,它的逻辑处理能力则较CPU弱。下面的图反映了CPU和GPU在硬件架构层面的异同[4]:
CPU相对专注,GPU处处留情
从上图可以看出,GPU的计算核心比CPU多很多(通常在1024个以上),真是天生的并行计算工具!而电脑图像高清而流畅运行,正是得益于GPU多个核心多管齐下。尽管每个GPU核心的质量都比不上CPU核心,但三个臭皮匠顶个诸葛亮,GPU的核心能够共同合作。以数量弥补质量,团结的力量在这里可见一斑。
为CPU分忧解难
GPU可谓“一身是核”,这让科学计算领域的学者们动了心思——既然GPU有那么多计算核心,那么能不能把这个优点利用起来,帮助CPU承担一部分运算工作呢?这个想法导致了GPGPU(General Purpose GPU,通用GPU)的提出。
在GPGPU的发展中,nVIDIA(中文:英伟达)集团始终走在世界最前线。nVIDIA在2006年推出了CUDA(Compute Unified Device Architecture)。尽管nVIDIA声称这是一个普适性的并行计算架构,但实际上CUDA主要是专门针对nVIDIA旗下的一些GPU而设计,有些自编自导的意味。nVIDIA的老对手intel和AMD旗下的显卡统统不适用于这一架构。
为加深读者印象,笔者用一段简单的matlab代码来比较GPU和CPU的计算效率。笔者电脑是Win10系统,所用显卡为nVIDIA GTX 960M,CPU为intel i5 6300HQ,内存为8G;用来测试的计算问题是1024*1024大小矩阵的乘法(这是很高维的矩阵了。选取这个例子的原因在于,矩阵乘法非常适合于并行计算)。下面为具体代码:
注:这个代码对苹果电脑、surface系列及其他非nVIDIA计算机无效
比较结果如下:
GPU计算用时竟比CPU快了将近100倍,简直有种“天上方一日,人间已十年”的巨大落差感!事实上除开矩阵乘法运算这个特例,对于一般的计算任务,nVIDIA(英伟达)官网也给出了更一般的测试结果:
可见GPU在科学计算方面潜力巨大,未来完全有取代CPU霸主地位的可能性。
也许一些读者会问:“既然GPU如此厉害,那为什么科学计算中CPU依然占据主导地位呢?”原因至少有两个。第一个原因在前文中已稍有提及,那就是GPU只适合需要大量并行计算的场景,而对于指令复杂的单线程任务,还得靠CPU来统筹规划;第二个原因在于,采用GPU计算后,得到的结果寄存在和GPU相关的组件上,由于这个结果的数据结构和CPU所支持的数据结构不同,所以需要花费额外的功夫把这些结果从GPU中转换成CPU所能读懂的形式。
如果把数据转换的时间考虑进去,矩阵乘法的例子就不那么乐观了:
所以GPU花费的真正时间比CPU长了一倍多,如此看来CPU的霸主地位并没那么容易被撼动。由于数据转换所花时间总是固定的,GPU已经在更为大型的问题上大显威力了,尤其是在基因测序、分子模拟(DNA、蛋白质结构及合成等)和量子多体系统(凝聚态物理的核心)这些和大数据相关的计算领域。除了CUDA,OpenCL、OpenCV等框架也支持GPU并行,很多科研软件都是在这些框架的基础上被制作出来的。如果GPU和CPU更好地融合在一起,减少数据转化所花的功夫,相信GPU计算能够和CPU分庭抗礼。
例:磷脂双分子层的模拟设计到大量原子的势能计算(利用泊松-玻尔兹曼方程),GPU计算已成为主流
CPU与GPU合二为一:从APU到TPU
我们知道,CPU和GPU虽然都是芯片,采用的电路架构也有很多相似之处,但两者的生产线相互独立。例如nVIDIA集团更关注GPU,CPU市场稍逊一筹;intel集团虽然CPU和GPU并重,但在CPU领域更具领导地位。既然CPU和GPU各有千秋,那么如果我们能把这两者取长补短结合在一起,是否能达到意想不到的效果呢?事实上作为nVIDIA和intel的竞争者,AMD集团首次作出了这一尝试,于2011年提出了APU(Accelerated Processing Unit,又名AMD fusion)的概念[5]。
从显卡市场份额看来,AMD公司近几年一直在走下坡,而nVIDIA却步步高升。或许原因之一便在于,战略上AMD更看重CPU和GPU的合二为一,而并没有开发出如同CUDA那样通用的计算平台。APU主要应用于PS4等游戏平台[6],许多游戏发烧友也会单独购买APU,这样就省掉了买CPU和GPU的精力。
不过除了AMD,谷歌公司在2016年提出了基于其TensorFlow架构的TPU(Tensor Processing Unit,张量处理单元)芯片[6]。由于谷歌在人工智能领域的一系列惊人业绩,这个概念一经提出就引起了广泛关注。和APU相似,TPU也同时结合了CPU和GPU的优势,不同之处在于它采用了和GPU、CPU都不同的集成电路系统(它采用一旦出厂就不可重写的ASIC电路,和传统GPU、CPU和APU采用的FPGA有根本差别)。尽管还是一个新概念,各界对TPU的未来都十分看好,或许TPU会在不久的将来走向家用市场。
TensorFlow把每个结点看作张量(向量和矩阵的高阶推广)
提升计算效率的其他方法
事实上提高计算效率并非只是通过提升硬件就能办到的。在理论领域,计算效率也是一个十分重要的话题,最著名的问题就是千禧年七大数学难题之一的“P与NP”问题,简言之就是,是否能用一类高效的算法(多项式时间算法)解决所有“看起来不太容易的问题”?“看起来不太容易的问题”就是所谓的NP问题,也就是能在多项式时间内验证答案的问题。提出新算法总比验证给定答案要困难很多,如何逾越两者之间的鸿沟,正是“P与NP”的难点所在。
“P与NP”是组合优化中的一个问题,这个问题是离散的。而习惯于微分方程等连续建模手段的数学家们则不关心多项式时间算法,他们更关心收敛速度(Convergence Rate)。不过连续建模需要考虑的问题要复杂很多,收敛速度快的算法很可能稳健性较差(易受误差干扰),精确度较低(迭代步长值必须满足某些严格的条件),甚至出现混沌现象(得到的解难以预测)等。其中每一个话题都值得深入探讨,不过由于它们都超出了本文范畴,笔者以后再进行更详细的介绍。
科技的急速发展容易让人们产生一种错觉——人类的科学发展似乎已经遇到瓶颈了。大型粒子对撞机迟迟撞不出新物质,各大数学猜想依然进展缓慢,新能源新材料似乎也失去了新鲜感。事实上我们的科学不仅没遇到瓶颈,甚至相反,新发现越来越多,质量起伏越来越大,以致于验证工作也越发困难,因此这些新发现都不多为人知。笔者希望做的一件事情,就是通过独特而客观的视角,把这些新发现尽可能传递给大家。尽管这并非易事。
每一项科技的进步都需要不同思维之间的相互碰撞。就计算效率这个话题而言,笔者用一首诗来概括之,同时总结全文,以加深读者们的印象:
沁园春·提升效率
开机上网,坐游天际,心暖情畅。光电蓦微漾,网页续断;弃网从码,内核惊忙。隔壁老王,上策与献,GPU取贤纳良。换新装,纵江陵千里,难阻奔放。
GPU诸事并行,CPU携手共天涯。指日合为一,与君相商;省钱增效,相知无两。硬件既释,软件未解,误差扰衡寻良方。孤军难,汇人间英才,携手向上。
参考文献
[1] https://en.wikipedia.org/wiki/GeForce_256.
[2] 《我仿佛听到显卡在哭泣!画质超高的12部游戏大作》。
[3] http://gpgpu.org/about.
[4] Computer Organization and Design MIPS Edition.
[5] https://en.wikipedia.org/wiki/AMD_Accelerated_Processing_Unit.
[6] Lucian Armasu, Google's Big Chip Unveil For Machine Learning: Tensor Processing Unit With 10x Better Efficiency.
欢迎大家关注我的公众号“科普最前线”(id:kpzqxyxg),对话前沿科学!每篇文章都由笔者亲自完成或修改,希望和大家一起交流!二维码:
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-25 14:19
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社