每一台电脑,基本上都有这两个东西,CPU(Center Processing Unit)负责作业系统以及软体的运作,GPU(Graphic Processing Unit)负责萤幕绘图,看到颜色与图像.这两个元件都可以拿来计算,但它们天生设计的目的导致完全不同工作型态. GPU是针对图像处理的元件,所以它的特色就是“大量计算”,“不断的重复计算”.但CPU是针对“一般化工作”所设计的元件,所以他可以处理档案读写,或是各种应用程式.这两个差异就像一个国英数只有数学考100分的学生,国英都只考20分和一个叁科目都可以考70分的学生。专业的来说就是SIMD(single instruction,multiple data)和MIMD(multiple instruction,multiple data)GPU是SIMD的设计,CPU则是MIMD的设计.SIMD的运作模式就像划龙舟,龙舟头有一个人发号司令,剩下的人就拼命滑水,MIMD则像是踢足球时,每个球员都有自己的任务分工。所以CPU一般来说会处理较复杂的工作,而GPU是单一工作。
超级电脑如何分工?
在超级电脑这个领域,IBM是元老级的公司,所以fortran这语言到现在在计算领域中还这么活越的塬因就与IBM有关。在传统计算用服务器,都是用CPU来跑,像我们实验室的规格就是8核心24台刀锋服务器(ibm blade server),这样的计算能力只能拿来做模型评估测试用,然后再转移到国加高速运算中心,利用御风者(台湾最快的高速电脑)来做计算。乍听之下觉得很奇怪,”计算”就是一个”算”字,应该大量使用GPU阿!为什么都是以CPU为主。我先介绍两个基本平行模型:多核计算与分布式计算。一般来说我们的电脑一个工作只会有一个CPU来执行,但对于计算量很大像从1累加到1千万,来说剩余的CPU没有用到很可惜,所以发明了一种可以让很多CPU一起动起来的方法,这是一种叫shared memory(分享內存)的架构,让所以有CPU都可以参与这个”累加”的工作,假设有一个4核新的电脑,代码会把1到1千万分成四等份,然后分配给四个核心,各自累加完后再全部加起来,理论上就是单1 CPU所工做的4倍快。分布式计算就把电脑像电池串再一起,增加的性能。电脑与电脑之间的任务分配就靠一种叫InfiniBand的标准来互相工通,这种架构称为分布式计算(distributed computing)就像一个班长分配所有人班级打扫区域,散开后各自分工。那如果把分布式计算和多核心计算合并是否就会更快,可以彻底发挥整群电脑的计算能力。这就是目前常使用的方法,一般称为复合式计算(hybrid computing),所以这就是超级电脑快的秘密,说穿了就是把一个很大的问题,拆成许多小问题后让每个计算单位处理完后再合并,组成最后答案。
GPU计算是一个趋势
不一定!塬因是一开始所介绍的CPU和GPU功能上的差异,GPU固然很会算,但它协同工作能力很差,就我毕业时的状况,GPU服务器间是无法沟通的,所以一个工作只能丢给一个GPU服务器去工作。所以真对单一台服务器的比较,GPU完胜CPU服务器,但真对过度复杂的模拟工作,CPU cluster机器组的能力还是优于GPU服务器。计算学家和电脑科学家,也正在尝试的将GPU的工作性能结合在CPU cluster机器组上,目前的运作方式就是看每台机器可以插几张显示卡,由CPU负责沟通与资源分配,然后让GPU来计算。目前来说这个方向是一个趋势,但它的门槛也是相对的高,不论在代码上还是经验上。
如果你想要接触平行化计算,以下是我的建议:
代码请学:C/C++、OpenMP、OpenMPI、CUDA