今天的 CPU 能够支持许多流行应用的实时音频,但一些计算密集型音频应用需要硬件加速。本文着眼于一些实时声音合成应用,并分享作者在 GPU(图形处理单元)上实现它们的经验。
软件合成器使用软件实时生成音频,已经存在数十年了。它们允许使用计算机作为虚拟乐器,以补充或替代表演中的原声乐器。软件乐器组可以聚合为虚拟管弦乐队。同样,在具有多个声源的视频游戏或虚拟环境中,软件合成器可以生成听觉场景中的每个声音。例如,在赛车游戏中,每个离散的软件合成器可以生成单辆汽车的声音,并将生成的声音组合起来以构建比赛的听觉场景。
传统上,由于计算能力有限,实时音频合成方法主要集中于直接计算简单波形的技术(例如,加法合成、FM 合成)、使用采样和回放(例如,波表合成)或应用频谱建模技术(例如,模态合成)来生成音频波形。虽然这些技术被广泛使用和理解,但它们主要使用乐器或物体产生的抽象声音模型,而不是乐器或物体本身的模型。一种更新近的方法是基于物理建模的音频合成,其中音频波形是使用物理对象或乐器的详细数值模拟生成的。
在物理建模中,乐器或发声物体的详细数值行为模型在软件中构建,然后像在现实世界中一样虚拟地“演奏”: “演奏者”对建模对象施加激励,例如,类似于鼓槌敲击鼓面。这触发计算机计算详细的模拟步骤并生成代表输出声音的振动波形。通过模拟物理对象并参数化其产生声音的物理特性,相同的模型可以捕获由对象几何形状、构造材料和激励模式变化产生的逼真声音变化。
假设您正在模拟金属板以生成锣或钹的声音。改变与材料刚度相对应的参数可能会让您产生从薄而柔韧的板到更厚更硬的板的声音。通过改变同一物体的表面积,您可以生成与不同尺寸的钹或锣相对应的声音。使用相同的模型,您还可以改变激励金属板的方式——生成用软槌、硬鼓槌敲击板或弓拉的声音。通过更改这些参数,您甚至可以模拟不存在的材料或物理上不可能的几何形状或激励方法。
物理建模声音合成有多种方法。Stefan Bilbao1 广泛研究的一种方法是使用有限差分近似来模拟板和膜的振动。有限差分模拟产生逼真且动态的声音(示例可以在 http://unixlab.sfsu.edu/~whsu/FDGPU 找到)。大型模型的实时有限差分模拟通常计算量太大,无法在 CPU 上运行。在我们的工作中,我们已经在 GPU 上实时实现了有限差分模拟。
下一节将讨论实时音频软件中的关键问题,并考察它们与 GPU 计算特性的关系。以下各节将介绍一些类型的实时合成应用如何从 GPU 加速中受益,最后介绍在 GPU 上实现基于有限差分合成时遇到的挑战。
实时音频合成可以大致分为三个步骤
1. 激励。 激励事件向合成器发出信号,表明应开始实时音频生成。例如,为了敲击虚拟钹,演奏者可以敲击键盘上的一个键,这将生成一个激励事件。
2. 样本生成。 计算所需声音的音频样本数据(例如,钹的撞击声)。
3. 输出。 在步骤 2 中生成的数据被发送到系统软件以供系统播放。
图 1 显示了实时音频合成的两种方法:图 1a 中的朴素方法一次计算并输出单个样本,而图 1b 中的缓冲方法计算多个样本并将它们作为一个块输出。
在图 1a 中,在激励事件之后,调用一个函数来生成单个样本。新样本被发送到音频输出设备中的缓冲区。重复这两个步骤,直到收到新的激励,或者直到声音变得听不见。在 44.1 kHz 的 CD 音质采样率下,必须每 1/44,100 秒或每 23 μs 计算并准备好一个样本以供输出。
图 1a 中的朴素方法会产生很高的开销。每个样本都需要函数调用和复制到系统缓冲区中,这可能涉及上下文切换。
相反,通常使用图 1b 中所示的缓冲方法。样本以 n 个样本的块生成和传输,从而显着降低开销。虽然缓冲方法减少了开销,但它在信号路径中引入了延迟。延迟是从乐器被激励到产生声音所需的时间。延迟越长,乐器的响应越慢。对于软件乐器,延迟应保持在最低限度,约为数十毫秒。
对于缓冲方法,必须在 n × 23 μs 内生成 n 个样本的块。在常用的、计算密集度较低的算法(如波表合成)中,生成样本涉及一些算术运算和查表;这通常可以在 CPU 上实现。对于计算密集型实时音频应用,样本生成需要并行化。如今 GPU 的普及使其成为此类应用的明显选择。
NVIDIA 的 GPU 和 CUDA 平台是当今高性能计算的热门选择。
NVIDIA GPU(图 2)是芯片上的分层多处理器,通常由多个 SM(流式多处理器)组成;每个 SM 包含多个 SP(流式处理器)。一个 SM 可以同时执行大量线程,每个线程运行相同的程序。这种 SIMT(单指令多线程)架构特别适用于具有高度数据并行性的应用,其中相同的操作应用于大量数据。例如,2012 年中款 MacBook Pro Retina 中的 NVIDIA GeForce GT 650M 有两个 SM,每个 SM 有 192 个 SP(核心),时钟频率为 900 MHz。
对于 CPU,NVIDIA GPU 看起来像一个具有自己内存系统的独立协处理器。作业在 CPU 或主机上配置,然后主机与 GPU 设备交互。主机将数据和特定于设备的程序从主机内存复制到设备内存,并在设备上启动程序执行。然后 GPU 独立于主机执行作业,无论是同步还是异步。当 GPU 设备完成时,结果将从设备复制到主机内存。 NVIDIA CUDA 系统提供了使用主机和设备之间的共享内存页等技术来减少此内存复制延迟的方法。
在 GPU 中并行执行的函数称为内核。正如 GPU 硬件由分组为流式多处理器的流式处理器组成一样,内核由分组为块的线程并行执行(参见图 3)。一个或多个块被分配给一个流式多处理器,保证同一块中的线程在同一 SM 上执行。每个线程执行相同的内核函数,但通常在不同的数据上执行。由于块中的线程在同一 SM 上执行,因此它们可以利用快速的硬件支持同步,并使用同一 SM 内的共享内存共享数据。不同的块无法在内核内同步,并且不保证任何特定 SM 的执行顺序。
GPU 设备上提供分层内存。除了线程可访问的寄存器外,少量更快的共享内存可以在块中的线程之间共享,但仅在 SM 执行线程块时持续存在。更大数量的较慢的全局内存可以被任何块中的所有线程访问和共享。全局内存在设备上由主机分配,并持续存在直到主机解除分配,但全局内存的访问时间比共享内存慢。优化的 GPU 代码利用了这些线程和内存特性。
在较旧的 GPU 中,高效的内核执行通常需要在软件中仔细管理共享内存。基于 Fermi 和 Kepler 架构的更新的 GPU 支持真正的硬件缓存架构;在这些系统上,共享内存的显式软件管理并不那么重要。
GPU 以前已成功用于实时音频应用。许多这些应用都涉及同时生成多个松散耦合的声源或处理流。在这些情况下,GPU 已被用于减轻 CPU 的负载,这是由同时生成和处理多个声音的计算复杂性引起的。示例包括在游戏或虚拟环境中渲染和空间化发声物体,或在虚拟合奏中合成多种乐器。每个声源可能是一场赛车游戏中的汽车或管弦乐队中的乐器。
回想一下图 1b 中的缓冲方法;在每个计算步骤中,对于每个声源,计算 n 个样本的块并将其发送到系统缓冲区以进行播放。缓冲区中的顺序样本通常必须按顺序计算。由于两个声源的缓冲区可以彼此独立地计算,因此将每个声源分配给 GPU 中的一个线程非常简单。每个线程计算一个 n 样本缓冲区并同步;来自所有声源的输出被混合并发送到系统缓冲区以进行播放(参见图 4)。由于当今典型的 GPU 可以有效地支持数千个并发线程,因此这种类型的应用非常适合 GPU 加速。
例如,Zhang 等人3 描述了一个典型的并行设置,该设置实现了模态合成;振动物体的声音是通过组合一组阻尼正弦振荡器生成的,每个振荡器代表声音的模态或共振频率。由于每个模态的 n 个样本可以独立于其他模态计算,因此每个模态都可以分配给 GPU 中的一个独立线程。在为每个模态生成 n 个样本后,将所有模态的结果组合起来进行播放。
实时有限差分合成的工作方式有些不同,并且可以说不是 GPU 的有效利用,但尽管存在一些严重的限制,我们仍然能够获得有用的结果。
物理对象通常使用微分方程建模。为了对这些对象进行数值模拟,通常使用微分方程的有限差分近似。在我们的工作中,我们使用了二维波动方程的近似,该方程描述了通过物体在二维中的振动。考虑激励一个扁平矩形板以产生声音。该板被建模为水平二维点阵。当板受到敲击时,网格中的点会非常快速地“弹跳”上下,从而产生振动和声音,如图 5 所示。
在模拟中,二维数组跟踪板上每个点的垂直位移。一个数组存储当前位移,同时保留前两个时间步的数组。为了计算当前时间步的点的位移,使用了被计算点周围的先前位移值。假设xi,j(t)包含时间t的点(i,j)的垂直位移。在之前的一篇论文2 中,我们看到xi,j(t+1)可以从xi,j(t),xi,j在时间t的四个最近邻居,以及xi,j(t-1)计算得出。可以监控网格中心(例如)的采样点(在图 5 中标记为红色)以产生输出声音的音频样本。
在直接的有限差分实现中,计算时间 t 的 W×W 数据点网格需要 W2 步,并且取决于前两个时间步的 W×W 网格。下一节讨论并行化此有限差分模拟。
使用基于有限差分的模拟来生成单个音频流是一项计算密集型的工作。与从几个正弦振荡器或滤波器计算一个输出样本相比,在有限差分模拟中生成单个样本涉及更多的算术和内存操作。因此,实时计算单个样本必须分布在多个线程上。图 6 显示了基于 GPU 的有限差分模拟的高级视图。
我们在 GPU 上实现实时有限差分合成器时面临三个主要挑战。首先,内核启动开销,即从主机在设备上执行内核到设备开始执行内核的时间延迟,可能非常显着。其次,每个块可用线程数的限制限制了模拟网格到 GPU 的映射方式。第三,无法同步或排序块执行限制了可以在 GPU 设备上配置和执行线程块的方式。
图 7 显示了两种类型的并行音频应用:图 7a 展示了多个独立的音频流,而图 7b 显示了并行有限差分模拟。如前所述,对于独立流音频处理,通常可以如图 7a 所示配置系统;每个线程同时自由计算 n 个样本的独立流,产生事件发生在 n 个时间步之后,等待所有线程完成其计算。在同步事件之后,这些音频数据缓冲区在发送回主机之前进行组织。例如,多个源可以混合在一起或组织起来以保持时间连贯性。
假设x(t)是时间t的垂直位移二维数组。对于有限差分模拟,回想一下,为了计算点的垂直位移(i,j)在时间t+1,您需要参考时间和t和t-1的点及其最近邻居;这些计算需要在整个x数组上执行。为了生成 n 个时间步长的音频样本缓冲区,您可以捕获x中同一位置的单个采样点的垂直位移随时间的变化;为此,有必要计算x(t+1)到x(t+n)模拟数组,同时从x中的采样点构建 n 个垂直位移样本的缓冲区。在时间t+1,只需要保留时间t和t-1的数组。顺序有限差分模拟的伪代码如图 8 所示。
如图 6 所示,您指定p = W×W线程来执行 GPU 内核。您将x(t+1)数组的内循环计算分布在多个线程上。每个线程计算x(t+1)中的一个点 (myRow, myColumn),其中 myRow 和 myColumn 基于线程的唯一 ID。并行化伪代码如图 9 所示。
为了计算 n 个时间步长的音频样本缓冲区,您只需进行一次内核调用。由于x(t+1)的计算取决于前两个时间步x(t), x(t-1)的已完成计算,因此您必须在每个时间步之后同步(图 7b)。内核中n次同步所花费的时间对于此方法的效率至关重要。 CUDA 提供快速的硬件同步支持,但仅适用于同一块内的线程。因此,所有计算都必须使用单个块内的线程执行(图 7b)。使用单个块允许您使用 CUDA 本地的快速机制进行同步,但您无法再利用 GPU 调度多个线程块的效率。由于只有一个线程块,因此任何时候只有一个 SM 可以对一个有限差分近似进行操作。但是,您可以同时模拟多个基于有限差分的乐器,最多可达设备上的 SM 数量。
为了使用多个线程块和多个 SM,您可以尝试配置内核以一次计算一个时间步长的x(t),并在每个时间步之后将控制权返回给主机。同步在从内核返回时处理。在这种解决方案中,线程块的配置取决于被访问和计算的数据的局部性;这是一个标准的 GPU 优化问题。但是,这种方法存在一个与图 1a 中先前描述的朴素音频生成问题非常相似的问题;主机在设备上执行内核以及设备从内核返回存在开销。这种内核启动开销呈线性累积,并且非常显着。我们的实验表明,在 NVIDIA GeForce GT 650M 上,平均而言,执行内核并从内核返回的最小时间约为 17 μs,最初的延迟为 2 ms 或更长时间。回想一下,CD 音质音频需要每 23 μs 生成一个样本。这意味着即使具有最小开销,也只有大约 6 μs 的时间来实时计算一个样本。这对于有限差分计算是不现实的。
因此,我们采用了使用单个线程块的方法,每个内核调用 n 个时间步长,如前面的伪代码所示。但是,我们遇到了另一个约束:每个 GPU 实现中块中的最大线程数是固定的,并且进一步取决于硬件资源约束,例如寄存器和 SP 的数量。对于网格点多于每个块线程数的较大模拟网格,每个线程必须能够计算几个点的矩形瓦片。例如,GeForce GT 650M 每个块最多支持 1,024 个或 32×32 个线程。为了模拟 64×64 网格,每个线程将计算 2×2 个点的瓦片。
我们的软件合成包 FDS(有限差分合成器)旨在在 Mac OSX 和 Linux 上运行。FDS 模拟振动板,类似于打击乐器。该系统(图 10)具有三个主要组件:控制器接口(图 10b)、有限差分引擎(图 10c)和音频回调处理程序(图 10d)。这三个组件中的每一个都在其自己的线程中运行。
控制器接口(图 10b)是程序的前台线程。它包括一个监听器循环,该循环通过 OSC(开放声音控制)协议(http://opensoundcontrol.org)接收来自外部控制器的控制和配置消息。
要使用 FDS,演奏者操作支持 OSC 的外部控制器(图 10a),它可以是键盘、鼓垫、平板电脑等。OSC 消息从控制器发送到 FDS 的前台线程。此消息可能会更改设置(模拟参数、敲击位置等)或触发激励事件(敲击板、阻尼板等)。然后,线程在前台线程中启动相应的操作有限差分和音频回调线程。
为了解决先前描述的实现挑战,我们创建了一个有限差分引擎(图 10c)。该引擎在其自己的线程中持续运行,执行有限差分模拟并生成音频数据。该引擎线程是 FDS 中唯一与 GPU 设备交互的线程。它包含一个在主机上运行的控制循环,使有限差分模拟在设备上保持运行(图 11)。引擎主机部分的控制循环等待来自前台(控制)线程的控制信号,例如激励和阻尼事件。当收到激励事件时,主机将预先计算的垂直位移二维高斯脉冲添加到有限差分网格中,在添加来自激励事件的能量的同时保持当前波形。脉冲的中心由网格上“敲击”的位置决定(图 5)。
音频数据使用主机和设备共享的内存从设备传输到主机。这消除了以前与 GPU 相关的主要瓶颈之一,即设备-主机内存传输。主机将音频数据复制到与音频回调线程共享的环形缓冲区,该线程处理将音频数据发送到音频驱动程序。
音频回调线程与 PortAudio(http://www.portaudio.com)通信,PortAudio 是一个跨平台音频驱动程序,协调 FDS 和操作系统音频层之间的接口。当 PortAudio 驱动程序准备好接收更多音频数据时,它会在音频回调线程中执行回调函数。此函数将有限差分线程放置在环形缓冲区中的数据复制到 PortAudio 输出缓冲区。然后将输出缓冲区发送到操作系统进行播放。
为了评估 FDS 是否构成软件合成方面的有用发展,我们提出了两个相关问题:(1)对于一系列有趣的模拟参数,FDS 是否能够基于有限差分模拟生成实时音频,并具有合理的延迟?(2)在相同的模拟参数下,FDS 在 GPU 上的性能与在 CPU 上执行的单线程有限差分模拟相比如何?对于第二个问题,请注意 GPU 和 CPU 具有非常不同的架构;不同的系统在性能方面可能具有非常不同的 CPU/GPU 组合。因此,我们的 CPU 与 GPU 的比较应被视为应用最终用户的实际参考;它们并非旨在作为严格的比较性能研究。即使对于 GPU 到 GPU 的比较,模型的功能和系统实现也差异很大,使得这些比较变得困难。
对于我们的测量,我们保持音频缓冲区大小不变,并在 CPU 和 GPU 上针对多个模拟网格大小运行有限差分模拟。较大的网格尺寸对于生成低音调的声音和具有高空间分辨率的模拟非常重要。我们还监控了音频输出缓冲区是否存在下溢(即,音频数据的生成速度不足以跟上音频播放的需求)。这会在音频输出数据中产生间隙,当音频系统等待数据准备就绪时,这些间隙会以毛刺或其他令人不快的伪影的形式听到。
这些实验的结果显然高度依赖于系统。多年来,我们已经在 GPU 上实现了 FDS 的版本。在早期的平台上,我们能够在 NVIDIA GTX285 GPU 上实时执行高达 21×21 模拟网格的 FDS,音频缓冲区大小为 4,096 个样本,而没有音频缓冲区下溢;在同一系统上的 3-GHz Intel Xeon 5160 CPU 上,除微不足道的网格尺寸外,所有网格尺寸都报告了音频缓冲区下溢。2
我们最新的测试平台是 2012 年中款 MacBook Pro Retina,配备 2.7-GHz Intel Core i7 处理器和 16 GB RAM。该系统内置 900-MHz NVIDIA GeForce GT 650M GPU,它有两个 SM,每个 SM 有 192 个 SP。 650M 是 NVIDIA 最新 Kepler 架构的实现,针对功率效率进行了优化;因此,虽然它比早期的 Tesla 和 Fermi 架构有许多增强功能,但 650M 是较慢的基于 Kepler 的 GPU 之一。操作系统是 OS X 版本 10.8.2,运行 CUDA 5.0。我们在 FDS 程序基础设施中计时了有限差分内核执行,围绕内核调用进行测量。
图 12 显示了在 MacBook Pro Retina 的 CPU 和 GPU 上运行 FDS 生成一个 512 样本音频缓冲区所需的时间。高于 11 毫秒的执行时间会产生音频缓冲区下溢,并且不能用于音频播放。这些数字仅用于速度比较。
对于我们的测试,我们将音频输出缓冲区大小保持在 512 个样本。这意味着 FDS 需要每 23 μs × 512 = 11.61 ms 生成并准备好 512 个样本。执行时间超过 11 毫秒的模拟会产生缓冲区下溢,并且无法使用。我们能够在 CPU 上获得高达 69×69 网格尺寸的良好结果——意味着音频播放没有缓冲区下溢——以及 GPU 上高达 84×84 网格尺寸的良好结果,或者最大支持网格尺寸提高了 48%。
如前所述,涉及 GPU 和 CPU 的性能分析非常棘手。冒着比较更多苹果和橘子的风险,我们引入了另一个参考点。图 13 显示了在配备 2-GHz Intel Xeon E5504 CPU 和 1.15-GHz NVIDIA Tesla C2050 GPU 的系统上进行的测量,该系统设计为用于科学应用的基于 GPU 的服务器。 C2050 基于 NVIDIA 的 Fermi 架构;此实现针对高性能计算市场,功耗优先级较低。对于这些测量,我们再次计时了独立于 FDS 程序基础设施的有限差分内核执行,FDS 程序基础设施不在 GPU 上运行。音频输出缓冲区大小再次为 512 个样本。 C2050 支持高达 81×81 的模拟网格尺寸,但较慢的 Xeon CPU 可以支持的最大网格尺寸约为 27×27。
我们的实验表明,在 GPU 上运行基于有限差分法的模拟是可行的,可以生成具有合理延迟的实时音频,并且网格尺寸可以大于 CPU 上可能实现的尺寸。我们注意到,CPU 与 GPU 的比较充其量是棘手的;我们最新的测量是在 2012 年中款 MacBook Pro Retina 的 GPU 和 CPU 上进行的。令我们惊讶的是,为能效而设计的基于 Kepler 的 650M,在 FDS 上的性能与稍早的、为高性能计算设计的基于 Fermi 的 C2050 相当。(这部分是因为单个有限差分模拟一次只能使用一个 SM;650M 有两个 SM,而 C2050 有 14 个,因此 C2050 的硬件资源中有很大一部分处于空闲状态)。我们也惊讶地发现,当前的 CPU,如 Intel Core i7,在中等网格尺寸下表现出有竞争力的性能;一个明显的未来方向是将 FDS 移植到多核 CPU 系统,以便与 GPU 进行比较。
我们目前在 GPU 上有限差分近似的实现是直接的。此外,我们计划研究优化软件的方法,以支持更大的网格尺寸、多个基于有限差分法的乐器,并支持不同的模拟几何形状。我们还计划将 FDS 移植到其他 GPU 计算平台,如 OpenCL,以便在其他 GPU 架构上进行测试。
1. Bilbao, S. 2009. 数值声音合成:有限差分方案和音乐声学模拟。 约翰·威立父子出版公司,奇切斯特,英国。
2. Sosnick, M., Hsu, W. 2010. 使用 GPU 的高效有限差分法声音合成。载于声音与音乐计算会议论文集, 巴塞罗那,西班牙,2010 年 7 月。
3. Zhang, Q., Ye, L., Pan, Z. 2005. 基于物理的声音 GPU 合成。载于娱乐计算-ICEC 2005,计算机科学讲义, 施普林格出版社,柏林,328-333 页。
喜欢它,讨厌它?请告诉我们
[email protected]
Bill Hsu 是旧金山州立大学的计算机科学副教授。他目前的研究兴趣包括高性能计算、音频分析与合成、基于物理的建模以及视听表演系统。他与艺术家和音乐家进行了广泛的合作,并在旧金山湾区组织了多次音乐会。
Marc Sosnick-Pérez 是旧金山州立大学的研究生、教师和研究员。他的兴趣包括高性能计算、软件工程教育和计算机音乐。他是旧金山州立大学 SETAP(软件工程团队评估与预测)项目的一部分,该项目探索评估学生学习的新方法,并且他是 CAMPAIGN 项目的一部分,该项目探索使用 GPU 加速的聚类算法。
© 2013 1542-7730/13/0400 $10.00
最初发表于 Queue vol. 11, no. 4—
在 数字图书馆 中评论本文
Michael Mattioli - 客户端计算硬件中的 FPGA
FPGA(现场可编程门阵列)具有非凡的通用性。它们被广泛应用于各种应用和行业,在这些领域使用 ASIC(专用集成电路)在经济上不太可行。尽管设计师在将 FPGA 集成到设备中时面临面积、成本和功耗方面的挑战,但它们提供了显著的安全性和性能优势。许多这些优势可以在客户端计算硬件(如笔记本电脑、平板电脑和智能手机)中实现。
Christoph Lameter - NUMA(非一致性内存访问):概述
NUMA(非一致性内存访问)是一种现象,即处理器地址空间中各个点的内存具有不同的性能特征。在当前的处理器速度下,从处理器到内存的信号路径长度起着重要的作用。信号路径长度的增加不仅增加了内存的延迟,而且如果信号路径被多个处理器共享,很快就会成为吞吐量瓶颈。内存的性能差异最初在大型系统中变得明显,在这些系统中,数据路径跨越了母板或机箱。这些系统需要经过修改的、具有 NUMA 支持的操作系统内核,这些内核明确了解系统的内存拓扑属性(例如内存区域所在的机箱),以避免过长的信号路径长度。
David Bacon, Rodric Rabbah, Sunil Shukla - 面向大众的 FPGA 编程
当观察硬件如何影响计算性能时,我们在一端有 GPP(通用处理器),另一端有 ASIC(专用集成电路)。处理器具有高度可编程性,但在功耗和性能方面通常效率低下。ASIC 实现专用和固定功能,并提供最佳的功耗和性能特性,但任何功能更改都需要完全(且极其昂贵地)重新设计电路。
Andrew Danowitz, Kyle Kelley, James Mao, John P. Stevenson, Mark Horowitz - CPU DB:记录微处理器历史
1971 年 11 月,英特尔推出了世界上第一款单芯片微处理器 Intel 4004。它有 2,300 个晶体管,运行频率高达 740 KHz,每秒可执行 60,000 条指令,同时功耗为 0.5 瓦。在随后的四十年中,计算能力呈指数级增长,这种趋势使得气候建模、蛋白质折叠和计算愤怒的小鸟的实时弹道轨迹等各种应用成为可能。