GPU加速科学计算概述

01 计算机架构的基本分类

为了看清楚GPU这头狼以及它和CPU的区别,我们还是先看一下计算机架构的基本分类——弗林分类法,这是斯坦福大学教授 Michael J. Flynn 于1966年提出的一种计算机架构的分类。弗林认为:计算由数据流和指令流组成,可以按串行(一次单个流)或并行(一次多个流)处理,按照排列组合可以分为不同类别。

  • 单指令单数据 (SISD)

SISD 是最简单的架构,其中单个指令流(例如某个程序)在对一个数据流进行处理,简单的理解就是一个人在做一件事情。早期的单核CPU处理器和一些简单的计算设备使用这种架构,使用同一个内存管理单元(MMU)的多核CPU处理器也属于这种架构。

  • 单指令多数据 (SIMD)

SIMD 架构有单个控制处理器和指令存储器,因此在任何给定时间点只能运行一条指令,该单指令被复制到每个内核上运行。每个内核都有自己的专用内存,因此可以进行数据的并行处理,简单的理解就是一群人在独立的做着同一件事情。因此,在SIMD架构中,多个处理器执行同样的指令,而数据不同,可并行处理大量数据。GPU通常基于这种架构。

  • 多指令单数据 (MISD)

MISD 架构与 SIMD 恰恰相反。MISD使用多条指令同时处理同一数据流,以评估结果的一致性或差异,简单的理解就是一个人通过N种方法做同一件事情,看看结果是否一致。MISD 是一种不常见的架构,通常用于容错要求很高的场景,比如用于控制航天飞机的计算机。

  • 多指令多数据 (MIMD)

MIMD 架构同时并行处理指令流和数据流,多个处理器独立地针对不同的数据流执行指令流,简单的理解就是多个人处理多件事情。当今具有多处理器的计算机通常基于MIMD,比如高性能计算机或工作站。使用多个内存管理单元的多核CPU处理器也属于这种架构。

02 GPU到底快在哪里?

当我们理解了CPU和GPU在基本架构层面上的差异,大概就能理解两者在计算性能方面的巨大差异。CPU有庞大而广泛的指令集,可与更多的计算机组件(例如内存、输入和输出)交互以执行复杂的指令;而GPU 是一种专门的协处理器,只有在高数据吞吐量的任务上表现出色,而在其他任务上的表现则不尽如人意。

CPU更强调指定运行的低延迟,其处理方式主要为串行,如果遇到多任务并发需求,则只能通过切换进行,切换时 CPU 必须重置寄存器和状态变量、刷新缓存等等。不过CPU 经过延迟优化,在多个任务之间的切换速度非常快,让人感觉它在并行处理任务,但本质上,它仍为一次运行一项任务。因此CPU像一个学识渊博的专家,可迅速处理各种不同难度的任务,但面对源源不断的重复性劳动时也会犯愁。

因此想要极限压榨CPU的性能,需要靠不断提高主频来提高它的运行速度,比如常见的CPU主频为2~4GHz。相比之下,GPU更强调高数据吞吐量,其核心的主频通常为1GHz左右,提高处理速度除了提高主频和架构,也常常通过“堆料”的方式进行,即增加SMs(streaming-multiprocessors 流处理器)的数量。因此相对于CPU,GPU更像一群中学生,可同时处理一大批简单运算,但面对复杂任务则会捉肘见襟。

GPU 最适合于重复性和高度并行的计算任务,最常规也是最初始的应用便是图形渲染和显示。后来人们发现它对多组数据执行并行操作的能力,也非常适合于某些非图形任务,例如机器学习、金融模拟、科学计算等大规模且反复运行相同数学函数的活动。

提到大规模的重复计算,除了CFD,相信小伙伴们还会第一时间想到挖矿。没错,在过去几年中,GPU被用于挖掘比特币或以太坊等加密货币,成为矿工们的最爱。小伙伴们如果去看一看比特币的价格,估计要掩面痛哭,感慨当年入错行:同样是搞计算的,做人的差距怎么那么大捏?

03 GPU市场的迅猛发展

影音和游戏产业是GPU快速发展的核心助推器,曾经可以生产GPU的厂家也很多。不过经过多年的洗牌,当今GPU的研发和生产基本由两家垄断,即英伟达和AMD。这两家芯片生产商发布GPU芯片之后,一般也会设计一套匹配的显存、供电和散热模块,整合在一起即所谓的公版显卡。

而这两家生产商也会把GPU芯片销售给自己的合作伙伴,比如丽台、华硕、蓝宝石等,进而推出更多定制化(比如兼容性或者散热性能更好)的显卡产品,即所谓的非公版显卡。一般而言,使用同一型号GPU的显卡之间极限性能会略有差异,但差异一般不会超过10%。

尽管绝大部分GPU均是基于SIMD架构。不过经过多年的发展,GPU的主要制造商在不同时期,推出了更为细分的架构(这里的“架构”可以理解为流处理器、寄存器、缓存等单元的类型与排布),并针对不同用户群体推出了不同产品,其性能也有千差万别。

比如以英伟达为例,2000年起先后推出了Kelvin, Rankine, Curie, Tesla, Fermi, Kepler, Maxwell, Pascal, Volta, Turing, Ampere 等名人系列架构,而更先进的架构带来了GPU性能的跃升。比如Maxwell架构在同样的制程工艺条件下,使得效能相比Kepler得到大幅提升;而自Volta起始,张量核心的加入使得矩阵算法大大加速。

GPU迅猛发展让人们对GPU加速计算也充满了期待。可惜狼来了的故事喊了许多年,市场上终究没有多少只狼的身影。明明GPU适合科学计算,可是为什么这么多年过去了,市场上的仿真工具还是以CPU为主呢?

04 GPU计算简史

从1980年代IBM推出单色显示适配器起始,GPU的发展已经有四十年的历史。但GPU参与科学计算的发展则主要从千禧年之后才开始慢慢加速。

由于绝大部分仿真计算软件均基于CPU开发,倘若进行GPU计算则需要移植,且程序的调试难度很大。大家熟知的各种CFD软件基本上都经历了30年以上的历史,版本也经历了成百上千次的更新。想要把如此复杂的软件从CPU转换到GPU上,难度可想而知。

其实在各行各业中,传统和创新之间永远充斥着矛盾,曾经代表着创新的企业可能会在几十年之后变成了创新和变革的阻力。不过所幸,历史的车轮终究是滚滚向前的。

2007年,GPU计算迎来了一个重要的拐点,英伟达发布了专用的CUDA(Compute Unified Device Architecture)开发环境。2008年,由苹果公司发起,后有AMD,英特尔,高通等公司协作的开源跨平台开发环境OpenCL(Open Computing Language)也正式发布。从此,GPU计算才逐渐成为一种通用的处理方法并进入大众视野。

因为有了更成熟的开发环境,市场上开始出现了一系列GPU加速计算的软件,各大商业CAE公司也都推出了GPU加速的产品。或许相对于成熟的基于CPU的仿真软件, GPU的仿真软件还未形成碾压的优势,但是它们正以更加迅猛的速度不停的更新,相信它们一定会改变未来仿真世界的格局,甚至改写每一个CFDer的使用习惯。

05 让LBM起飞的GPU加速

熟悉流体仿真的小伙伴都知道,目前CFD软件有两大阵营:一种是基于传统的NS方程,需要隐式求解复杂的偏微分仿真;而另外一种CFD基于格子玻尔兹曼方法(LBM),求解的是显式的线性方程。大家还记得CPU和GPU之间的区别,CPU像一个学识渊博的专家,而GPU则像是一群中学生。如果求解复杂的偏微分方程,一个专家或许能抵得上一百个中学生,而如果计算的是一元一次方程,一个专家和一个中学生或许不会有太大的差别。

因此,从GPU的处理特点我们可知,如果程序本身有良好的并行效率,则能从GPU计算中获得更大的收益。而格子玻尔兹曼方法基于笛卡尔网格的显式线性的计算特点,使得其天然适合于GPU的流处理框架。比如在GPU上计算D2Q9格式的LBM方程,我们可以将具有相同速度向量的数据包分配到一个数组中,并保持原始格子布局,求解过程便是对这些数组的更新。

当然,GPU在进行LBM计算的时候,不会改变其物理计算的本质,仍然是通过速度分布函数、宏观物理量和平衡态分布之间的迭代来实现的。

当然,要想GPU算法能够实现更好的加速效果,也需要对参数存储、传递和计算进行优化。目前,许多LBM方法在配合GPU计算已产生恐怖的加速性能,比如已有商业软件可将单块显卡的计算加速能力提高到等价于数千个CPU核的量级。相信随着GPU性能和软件本身的不断进化,GPU一定会让LBM彻底飞起来。

题外话

说到了GPU,让笔者不禁想起了今年以来加密货币的暴涨,让许多蛰伏的矿工们浮出水面大肆购买硬件,使得显卡价格也水涨船高。游戏玩家和AI码农纷纷表示苦不堪言,甚至GPU制造商也不得不对某些型号的产品进行挖矿程序限制。而在夹缝中求生存的,却是一群无辜的CFDer。作为最底层的CFD工程师大概不会想到,CFD的计算速度居然还要受制于资本热衷的币圈。有时候想想,这世界真的挺魔幻的,对吧?

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇