内核之外的任务处理
在计算机技术的发展史上有一个很有意思的现象,从计算或处理任务发生的具体位置来看,这些任务在逐渐分散化。我们所谈论的现代意义的计算机,与早期的一些计算设备之间存在两个主要的差别,而它们也被视为20 世纪中叶以来计算技术爆炸式发展的最重要原因。第一个差别是可存储式程序的概念,可存储式程序指令并不是被固化在物理电路中的,而是保存在一些外部介质中一一早期的穿孔卡片、纸带和当今的磁盘、闪存等一一以备计算机在需要的时候调用。第二个差别则是通用计算机的概念,这主要依赖于一个能够处理任何能够用可存储式程序指令解决的任务的中央处理器。任何买过电脑的人都知道,市场上出售的处理器的计算能力在不断增强。在奔腾( Pentium ) 系列处理器出现之前,英特尔486 是处理器世界中的王者,而现在,奔腾的地位也被至强( Xeon )系列和其他的一些处理器取代了。你不可能总是赶上处理器更新换代的速度,而那些电脑制造商则对这一点很欢迎,因为处理器的不断更新让我们每两三年就得换一次电脑了。
实际上要制造出下一代让人心动的计算机,关键就在于如何让处理器拥有更强的计算能力,作为整台机器的核心,它能够完成你交给它的几乎所有任务。但是有些计算机的用户在经过更深入的思考之后,却得出了一个一眼看上去似乎是南辍北辙的想法。他们提出了这样一些问题:把所有计算任务的处理都压缩到一块小小的硅片上真的是一个必要或者说聪明的做法吗?如果你需要一块电脑芯片来完成某种任务,真的需要设计一块芯片来完成所有不同的任务吗?难道我们就不能至少把一些任务从CPU 的内核转移到别的地方吗?最后,难道就不会有一些计算机应用,例如高频交易,使用CPU 之外的硬件会更好吗?对于最后一个问题,答案似乎的确是肯定的。
这种内核之外的任务处理的一个例子是计算一个计算机网络中的用户(基本上是所有的用户)有哪些很享受无知的感觉。如果你怀疑这样的用户是否真的存在,你可以去问一些你认识的非程序员用户: "你喜欢你Windows 笔记本上的TCP/IP 栈吗?"然后看看有多少人会用不高兴的眼神看着你。你可以接着问:"你知道,其实我指的是Winsock ! "如果你不介意对方是否认为你已经疯了,你还可以继续这样的问题。想象这样一项任务:运输一些小型产品(例如办公用品)穿越全国,假设每种产品(订书机、橡皮、钢笔和其他的东西) 都装在贴着各自标签的箱子里, 这些箱子装在小卡车里,这些小卡车又装在大拖车里,大拖车放在平板列车上。现在火车到了你所在的站台,而你要取下那些2 号铅笔。你该怎么做呢?首先,你需要找到那一节列车车厢,然后找到那辆正确的拖车, 然后是装着铅笔的小卡车,然后是装着2 号铅笔的箱子,最后取出那些你需要的2 号铅笔。如果你想再把这些铅笔放回去,那么就得有人按着相反的顺序把这些事情再做一遍。
我们刚才所举的例子并不能和内核外的任务处理形成一种完美的类比关系(一个更好的类比可能是把铅笔不断地拆分,先拆分成分子,然后是原子),这种分层的传递机制实际上很像数据在网络中的传递过程。在每一层的节点上,都需要有硬件来完成打包和拆卸的工作,这种硬件通常都是CPU 。一般来说,当一个数据包到达某个计算机节点,节点的CPU 必须停下它正在做的事情,然后打开数据包,把它的内容放进内存,从而让程序能够访问其中的数据。而当经过处理后的数据包需要重新回到网络中, CPU 会再次中断它正在处理的任务,把数据从内存中取出,打包之后发回到网络中。
对于CPU 来说这实在太累了! 难道就没有一些别的硬件能够替它完成这类任务吗?答案是,有。一种叫做TOE 卡( TCP/IP 减负引擎)的硬件能够完成在网络和内存之间传递数据的功能,从而把CPU 从这种任务中解放出来专心去做其他的事情。由于每台处于网络中的电脑实际上都在永不停歇地和网络进行数据的交互, TOE 卡的出现就从处理器上分担下一块很大的任务量,从而让处理器能够把更多的时间放在识别交易机会、下单去试图从交易中盈利等更重要的任务上。
实际上,任何在传统上由CPU 来完成的计算任务都是内核之外任务处理的备选项。我们之前提到的Tervela 公司提供的TMX 信息交换机服务就是一个例子,它使用内核外的硬件实现了一个完整的"发布与订阅"信道。这种服务很像一个基于软件的"发布与订阅"机制,其中的组件会发布或者订阅它所感兴趣的数据,但实际数据的提供和存储都是由硬件上的物理电路完成的,而并不是内存。TMX 的数据吞吐量非常惊人,它为信息的发布者和订阅者提供了一种中介服务,正因如此, 一些工程师开始争论中介服务的固有延迟是否会使得一个基于硬件的信息交换机比直接的软件连接更加高效。目前, TMX 服务被高频交易业内的很大一部分公司所采用,并且已经成为通用计算任务下放的一个重要范例。
还有另一个比TOE 卡和硬件信息交换机更重要的内核外任务处理的例子,它不仅仅是把计算任务放到其他一些专门用途的设备上,还把计算任务放到一个为通用计算任务重新设计过的专用设备上——这个设备就是图像处理器GPU ,这种为通用计算重新设计GPU 的概念称为GPGPU ( general-purpose computing on a graphical processing unit )。有意思的是,在图像处理器最初出现时,其目的就是把图像处理的计算任务从CPU 上转移出来。就像在网络和内存之间传递数据一样,图像处理的基本任务也是非常简单的一一确定电脑屏幕上一个像素点的颜色和强度,但是这种基本任务的数量却多得数不清。GPU 的出现让CPU 从这种繁重而单调的工作中解放出来了。而在GPGPU 的概念下, GPU 所处理的任务甚至可以和图像处理一点关系都没有。
现在我们可以确定, 一个GPU 没办法完成CPU 所做的那些复杂的计算,它只能够处理简单的任务,但它能在很短的时间内并行处理大量的简单任务。正因如此,高频交易中的许多计算并不适合使用GPGPU 来处理,但是在交易过程背后却有许多工作非常适合交给GPGPU , 其中的一项任务就是使用一种叫做蒙特卡洛模拟的方法为期权定价。众所周知,期权的价格是由其标的证券(例如股票)价格衍生而来的,而衍生证券的价格被假设为一条随机路径。使用蒙特卡洛模拟法,建模者可以生成(或者说模拟)大量的可能的价格路径,在每一条路径上确定期权的价值,并且通过将这些价值进行平均,得到一个比较合理的期权价值估计。计算一条随机路径上的股票价格是一个相对来说简单的任务: 给定一个初始价格,在这个价格之上加上或者减去一个随机数值,从而得到下一个时点的价值,然后重复这个过程。对于GPGPU 来说,这样的任务是小菜一碟。