一种分布式虚拟机的FPGA实现
摘要
函数式编程语言中的表达式可以被编译成一种大规模冗余、空间分布且并发的计算,称为 distributed virtual machine (DVM)。分布式虚拟机由字节码具象化为参与者组成,这些参与者在二维网格上通过包含封装的虚拟机状态的消息进行扩散通信 (continuations)。由于表达式求值的语义是纯函数式的,因此分布式虚拟机可以在堆的表示中采用大规模冗余,以帮助确保即使物理宿主基板的大面积区域发生故障,计算仍能完成。由于分布式虚拟机可以实现为异步电路,它们还解决了集成电路实现的传统机器架构中存在的众所周知的问题,即随着器件尺寸的增加,时钟网络所占面积比例越来越大。本文描述了首个分布式虚拟机的硬件实现。该实现通过将一种专用分布式内存多计算机的VHDL规范(带有网格互连网络)编译到现场可编程门阵列中的 globally asynchronous, locally synchronous (GALS) 电路中而完成。每个独立时钟驱动的节点结合了一个基于虚拟机的处理器,用于执行编译后的Scheme语言程序,并配备足够容纳单个堆分配对象和一个续体的本地内存。
1 引言
人工生命领域的研究通常涉及构建由人工生物占据的虚拟世界,这些人工生物进行繁殖并争夺资源。无论人工生物是用汇编语言编码的程序[3,23]还是细胞自动机[19,29], ,具体的实现都会明确其资源使用情况,这是实现有意义竞争所必需的。相比之下,在遗传编程中,程序通常以高级语言编码,从而使变异和交叉能够更高效地探索解决特定问题的计算空间[17,25]。尽管这可以实现更快的进化,但以高级语言编码的程序的资源使用情况往往难以准确评估。理想情况下,这两种方法可以结合:自复制用高级语言编写的程序可以被编译成虚拟世界中的具体实现,在该环境中通过竞争资源高效地演变为更复杂的形式。
作为迈向这一方向的一步,我们中的一人(第二作者)最近描述了一种基于自托管编译器的新颖人工生物,该编译器针对Scheme的一个小子集[31]。通过使人工生物成为一个通过编译自身源代码来实现复制的目标程序,弥合了抽象自描述(更快的进化)与具体实现(资源的透明使用)之间的鸿沟。目标程序(表型)和源程序(基因组)都被具体化为一个分布式虚拟机(DVM),一种空间分布的并发计算,可以实现为通信有限状态机的阵列,或者异步细胞自动机。
不幸的是,在笔记本电脑上对复制过程进行仿真几乎需要8小时才能完成。不用说,如果没有巨大的加速,基于自托管编译器的自复制分布式虚拟机在进化计算研究中的重要性将仍然 purely theoretical。本文所描述的工作具有非常实际的目标:设计、实现和测试一种专用的分布式内存多计算机系统,能够承载大量自复制分布式虚拟机,并将其执行速度提高四个数量级。
1.1 使用多指令流多数据流模拟单指令流多数据流
目前,世界上所有最快的计算机都是由大量带本地内存的多计算机通用处理器(节点)通过高速互连网络连接而成。根据弗林分类法[14],,采用这种架构的计算机被归类为分布式内存、多指令流多数据流(MIMD)系统(见图1)。
鉴于多计算机能够在不同节点上运行不同程序(MIMD中的第一个‘M’),这种情况却很少发生,这令人惊讶。即在解决最常应用的那类问题实例时,并未使用这一能力,所谓的高度并行问题,对于这类问题,在 n个节点上可能实现高达 n倍的加速[5]。通常情况下,多计算机作为全局异步局部同步( GALS)的非常大型单指令流多数据流(SIMD)系统的仿真来运行。1尽管以这种方式使用多计算机可能无法完全发挥其能力,但它仍然有用,因为同步实现的SIMD系统不具备可扩展性;若无相应的传输延迟增加,全局时钟信号无法传输到越来越多的空间分布节点。
1这让人想起一个非常有趣的结果,即异步细胞自动机能够以可忽略的减速来模拟同步细胞自动机[8]。
1.2 多指令流多数据流对单指令流单数据流的模拟
同步实现也限制了更传统的单指令流单数据流(SISD)系统的可扩展性。随着 SISD系统在集成电路实现中组件数量的增加,电路中用于分发时钟信号的部分也相应增加。这最终限制了全同步电路所能包含的组件数量 [12]。
我们已经看到,多计算机可以支持非常大的单指令流多数据流计算,从而克服完全同步实现的可扩展性限制。值得探讨的是,多计算机是否同样能够支持非常大的单指令流单数据流计算,即 需要远大于网络中任一节点地址空间的地址空间的计算,并在此过程中克服SISD系统同步实现的可扩展性限制。
这个问题在此前关于分布式虚拟机(DVMs)[30]的会议报告中已得到肯定回答。DVMs 的核心思想在于,表达式求值可以被实现为一种空间上分布的、异步的消息传递计算。程序堆(包括表示编译后的程序本身的字节码)被具象化为一组可分布在分布式内存 MIMD 系统各节点上的参与者。每个节点结合了一个通用处理器与少量的本地内存。参与者可以向相邻节点上托管的参与者发送包含封装的虚拟机状态(即续体)的消息。它们还可以在相邻节点上分配新的堆对象(也具体化为参与者)(如果这些节点为空)。为了使任何参与者原则上都能与其他任何参与者通信,并为新堆对象腾出空间,所有参与者都会持续进行随机移动(扩散),在网络的相邻节点之间移动。
具有讽刺意味的是,在使用多计算机来模拟单指令流多数据流系统时,系统的分布式内存中有很大一部分被低效地用于存储数百万份相同的程序副本(每个节点一份),而在上述对SISD系统的模拟中,程序的单一副本却能够高效地分布到所有节点上。遗憾的是,由于基于扩散的消息传递速度极慢,像上述这样的分布式虚拟机系统在短期内不太可能被构建出来。事实上,这种系统仅可能适用于那些需要长时间等待结果、同时又要求非常大的地址空间且无法分解为并行子问题的求解场景。2由于在实践中很少会同时出现这些条件,因此基于多计算机的分布式虚拟机似乎仅具有理论意义。但值得庆幸的是,分布式虚拟机相对于传统的SISD系统有一个优势,即它们可以利用空间分布的堆中的冗余来更稳健地解决问题。
1.3 表达式的健壮求值
纯函数式编程语言具有一种称为引用透明性的特性,使得程序可以像数学中的表达式一样被处理[21]。具体来说:(1)表达式的值不能依赖于其子表达式的求值顺序;(2)函数在应用于相同参数时必须始终返回相同的值。由于副作用会破坏这两个性质,因此被严格禁止。由此可得,纯函数式编程语言中的堆分配对象是不可变的,即一旦创建,就永远无法更改。3堆分配对象的不可变性对分布式虚拟机具有重要意义,因为它意味着每个对象(包括字节码)的多个实例可以在同一个空间分布的堆中同时存在而不会产生不一致。此外,代表并行执行线程的多个续体(每个处于不同的执行进度)也可以在同一分布式虚拟机中共存。由于引用透明性的存在,在一个线程上创建的对象与在其他线程上创建的对象完全可以互换。
在模块化基板上托管的分布式虚拟机,其中每个模块代表多计算机节点和互连网络的一小部分,将具有一些有趣的特性。首先,托管计算能够 surviving 故障的发生,即使基板中大量模块发生故障。其次,可以向基板添加模块,以替换已发生故障的模块或扩展基板;托管计算将继续不受中断地运行。尽管这不会加快托管计算的速度,但会提高其完成的可能性。这两个设计特性的结合,使得计算的生命周期有可能超过其托管硬件的生命周期。
2 虚拟机
通过将表达式编译为字节码并在虚拟机上执行来求值表达式的过程,最初由兰丁 [18]针对Lisp提出,并由戴比格 [13]推广至Scheme。由于该过程在我们的工作中起着重要作用,因此值得详细考察戴比格的Scheme求值模型。
Scheme中的表达式可以是数字、布尔值、基本函数、闭包、符号和对[26]。闭包是带有自由变量的表达式以及对词法环境的引用;这两项足以描述 Scheme中的一个函数。符号可以用作其他表达式的名称,而对则是列表的基本构成单元。因此,它们被用来表示Scheme源代码和基于列表的数据结构。所有其他类型都是自求值的,即它们仅仅是常量。
求值一个非常量或非符号的表达式需要将当前求值上下文保存到栈上,然后递归地求值子表达式,并将得到的值压入第二个栈中。第二个栈随后通过对其包含的值应用一个基本函数或闭包来进行归约。之后,弹出第一个栈,恢复之前的求值上下文。Scheme中的表达式被编译成语法树形式的字节码,当解释这些字节码时,就会执行上述操作。在此过程中用于记录管理, Dybvig的虚拟机需要五个寄存器(见图2)。
除了可以指向任意类型表达式的累加器和指向字节码树中某个位置的程序计数器之外,虚拟机中的每个寄存器都指向由对组成的堆分配数据结构;环境寄存器指向表示外围词法作用域中符号值的栈,参数寄存器指向函数(或闭包)所应用到的值的栈,而帧寄存器指向挂起的求值上下文的栈。
求值过程通过字节码的解释来转换这些寄存器的内容而发生。例如, constant字节码将一个常量加载到累加器中,而refer字节码则从环境栈中加载一个值到累加器中。其他字节码会压入帧栈和参数栈(并分配构成它们的对)。例如,frame字节码将一个求值上下文压入帧栈,而argument字节码则将累加器(其中保存了已求值子表达式的值)压入参数栈。还有一些字节码会弹出这些栈。例如,apply字节码在将一个基本函数(或闭包)应用于参数栈中的值之后,恢复一个求值上下文,并将结果留在累加器中。
Dybvig的虚拟机中剩余字节码最重要的一个是close,它用于构造一个闭包并将指向该闭包的指针放入累加器中。我们通过添加一个新的字节码扩展了 Dybvig的虚拟机,该字节码与其close字节码完全相同,唯一的区别是:由我们的字节码创建的闭包在其所封闭的词法环境中,第一个值是一个自指针。这一机制使得在无需可变全局环境的情况下定义递归函数成为可能。通过这种方式,我们在不引入应用序Y组合子相关开销的同时保持了引用透明性。
3 分布式虚拟机
构成分布式堆的参与者可以表示Scheme中允许的任何数据类型,包括数字、布尔值、基本函数、闭包和对。重要的是,它们还可以表示编译后的Scheme程序的字节码。与其他堆对象一样,字节码参与者在接收到get消息时会返回其值;但与表示其他堆对象的参与者不同,它还可以发送和接收封装的虚拟机状态,即续体。当字节码参与者接收到一个续体时,会根据其类型对其进行特定的转换,然后将其传递给程序中的下一个字节码,依此类推,直到续体到达一个halt字节码为止,此时续体的accumu-lator字段包含表达式求值的结果。
与所有控制都集中在一个传统虚拟机不同,分布式虚拟机的控制分布在构成它的各个字节码之间;我们不是将字节码取到一个位置并在那里更新集中的虚拟机状态,而是将该状态封装起来,并从一个字节码参与者传递到下一个(见图 3)。
回想一下,应用函数需要构建一个已求值子表达式的栈。在最简单的情况下,这些子表达式是常量,栈通过交替执行常量和参数字节码来构造。我们将使用这两个字节码序列来更详细地说明分布式虚拟机的操作。
一个类型为常量子节码且处于锁定状态的字节码参与者会将其累加器加载为其常量值操作数的地址,并进入继续状态。当一个处于继续状态的字节码参与者在其邻域中看到其在字节码树中的子节点时,它会用自己的寄存器内容覆盖该子参与者的寄存器,将子参与者的状态设置为锁定,然后返回到就绪状态。
一个类型为参数字节码且处于锁定状态的参与者的操作更为复杂。它必须将其累加器压入由堆分配的对组成的参数栈中。由于这需要分配一个新的对,因此它将保持在放置状态,直到在其邻域中发现一个相邻的空闲位置。在相邻的空闲位置创建新的对参与者后,它会递增表示最后分配的堆地址(针对此执行线程)的寄存器,并进入继续状态。
在很大程度上,我们忠实地实现了戴比格所描述的基于堆的Scheme编译器[13],并且在实现构成我们的分布式虚拟机的字节码参与者对续体执行的转换时,也遵守了其虚拟机的语义。
4 四种实现模型
在本节中,我们将介绍实现分布式虚拟机的四种可能方法,最终聚焦于本文所研究的方法,即使用现场可编程门阵列(FPGA)实现的一种全局异步、局部同步电路。
4.1 共享内存多处理器
爱立信语言 [6]是一种基于并发参与者模型的函数式编程语言[4,7,11]。由于通信进程(参与者)不共享状态,所有通信都通过消息传递进行。如果参与者拥有其他参与者的标识符,就可以向其发送消息。
鉴于其对参与者模型的支持,用爱立信语言实现分布式虚拟机将非常直接;字节码和其他堆分配对象将由参与者表示,而唯一标识符将与堆地址相关联。本地代码编译器随后会将爱立信语言源代码编译成一个(或多个)目标程序,这些程序将在单处理器(或共享内存多处理器)系统上运行。
遗憾的是,上述分布式虚拟机实现相对于传统的单指令流单数据流计算机没有任何优势。特别是,它无法仿真地址空间大于共享内存多处理器内存的单指令流单数据流计算。此外,由于缺乏冗余,它也无法提供额外的鲁棒性。
4.2 分布式内存 多计算机
这导致了第二种可能的分布式虚拟机实现。爱立信语言原则上可以被编译为分布在多计算机节点上的一组程序[33]。如果处理器数量允许,堆分配对象的地址可以以一对一的方式映射到参与者,而参与者又可以通过静态分配策略以多对一的方式映射到节点。事实上映射是静态的,这将允许在通信进程之间高效地路由消息。与上述多处理器实现不同,多计算机实现确实能够模拟具有比任何单个节点中所包含内存更大的地址空间的单指令流单数据流计算。此外,如果处理器数量允许多个处理器对分布式堆表示进行冗余(将一对一的地址到执行体映射替换为一对多映射),则该实现在节点故障时也具有鲁棒性。然而,使消息路由相对高效的这一特性,即静态分配,与无限可扩展性的设计原则不兼容。
4.3 移动盛宴机
最近,阿克利等人 [1]提出了具有未知大小地址空间的分布式内存多计算机系统的概念。这种a priori无限可扩展的计算机由独立时钟模块组成,这些模块平铺空间,并且仅与相邻模块通信。由于信息传播速度不能超过光速,且处理单元具有有限尺寸,因此无限可扩展计算机中的处理器和内存必须是空间分布的。
上一节描述的多计算机实现并非无限可扩展,因为任何允许高效消息路由的静态分配策略的具体细节必然取决于网络中的节点数量。这提出了第三种可能的分布式虚拟机实现,该实现基于具象参与者。与经典参与者模型中的参与者不同(后者存在于由唯一全局标识符索引的绝对地址空间中),具象参与者位于二维网格上的特定位置,并且只能与其邻域内的其他参与者通信[30]。这一限制,加上表达式求值可能需要从地址空间中的任意对象向另一任意对象发送消息的事实, necessitates 网格上表示堆分配对象的参与者持续进行随机移动。
在最近的研究中,阿克利 D.H. 和阿克利 E.S. [2]描述了一种用于实现具象参与者模型的并发编程语言。理论上,ulam充当到底层基板的高级接口,该基板由一个异步细胞自动机(ACA)阵列构成。实际上,它是一种编译型语言,目标是面向一种称为Movable Feast Machine (MFM)的无限可扩展模块化计算机。
与多计算机实现类似,分布式虚拟机的MFM实现能够模拟地址空间大于任一单个节点内存的单指令流单数据流计算。它对MFM模块的故障也具有较强的容错能力。然而,与多计算机实现不同的是,它实际上可以无限扩展,因为原则上可以向机器中添加模块,并且正在运行的分布式虚拟机计算可以通过增加其堆表示的冗余度来有效利用这些新增模块。
4.4 现场可编程门阵列
尽管这三种实现模型在某些重要方面有所不同,但它们有一个共同点,即它们都将字节码和其他堆分配对象表示为通信进程(参与者)。在多处理器和多计算机实现中,这些参与者存在于一个非物理的抽象标识符空间中。在MFM实现中,通过将参与者分配到二维网格上的位置,并依赖扩散进行消息传递,从而使参与者具体化。第四种实现也是基于参与者的,但这些参与者代表的是网状连接网络中的处理器,而不是堆分配对象。
现场可编程门阵列(FPGA)由可编程逻辑块阵列和可配置互连网络[15]组成。通过现场编程,即在制造完成后,现场可编程门阵列能够实现大量特定应用集成电路的组合空间。VHDL 是美国国防部于 20 世纪 80 年代设计的一种并发编程语言,用作超高速集成电路的硬件描述语言 [22]。合理使用时,用 VHDL 编写的并发程序可自动编译为 FPGA 实现。该编译 (综合)过程将 VHDL 结构分配到器件中特定位置的各个逻辑块,并配置互连网络以实现指定的功能。
尽管VHDL可以像爱立信语言一样被用作通用并发编程语言,但如果仅将其用于实现分布式虚拟机的仿真,其中字节码和堆分配对象表示为相互通信的进程(如同其他三种实现方式),则无法保证由此产生的并发程序是可综合的,即能够被编译为FPGA实现[9]。此外,即使该程序是可综合的,也无法保证其综合后的元件能够具备足够的并行性,从而相对于顺序实现获得加速;必须采用不同抽象层次的并发程序才能确保这两个特性。为确保可综合性和有效并行性,通信的VHDL进程必须表示托管分布式虚拟机的分布式内存多计算机的节点,而不是构成分布式虚拟机本身的堆分配对象。5
5 技术细节
在我们的VHDL规范中,用于建模多计算机节点的进程由作为环形振荡器实现的独立本地时钟驱动[24]。环形振荡器通常由奇数个非门串联组成,最后一个门通过反馈回路连接到第一个门;参见图4(顶部)。奇数个门确保最后一个门的输出相对于第一个门的输入是反相的。当通电时,该电路开始自发振荡,周期大约为各个门延迟总和的两倍。通过在环中增加或移除奇数个门,可以降低或提高振荡器的频率。遗憾的是,在现场可编程门阵列设计中使用环形振荡器存在问题,因为大多数设计工具会积极尝试阻止这些所谓的组合环路 ,并积极优化掉看似多余的门。这些优化可以通过使用允许组合环路的指令以及标记门以防止在优化过程中被移除来克服。我们在每个节点生成一个长度在9到31个门之间的随机环形振荡器,从而产生30兆赫兹至100兆赫兹范围内的时钟频率。
全局异步、局部同步电路需要随机性源来实现支持消息传递的扩散过程。在探索了使用细胞自动机进行伪随机数生成以及使用环形振荡器进行真随机数生成之后,我们最终选择了线性反馈移位寄存器(LFSR),这是一种简单且常用的生成方法硬件中的伪随机数 [20]。更具体地说,我们在实现中使用了16位斐波那契线性反馈移位寄存器;参见图4(底部)。每个节点包含一个由本地环形振荡器时钟驱动的线性反馈移位寄存器进程。在每个时钟节拍,寄存器右移1位,称为抽头的位位置通过异或运算组合后反馈到最左端(输入)位。输出为线性反馈移位寄存器的最右端位。如果由抽头定义的多项式具有偶数个项且抽头索引互质,则产生最大长度周期(2^n −1)。在我们的实现中,每个16位斐波那契线性反馈移位寄存器的种子和抽头由代码生成器随机分配。
具有独立时钟的两个节点之间的通信和数据传输需要两个节点达成协议,即:(1)传输将要发生;(2)传输已经完成。如果未达成此协议,多个进程可能会同时尝试向单个节点读取或写入数据,导致设备状态不一致。为避免此问题,我们的设计采用四相握手协议来确保相邻节点之间的数据传输是同步的 [10]。
6 实验结果
我们在Xilinx XC7A100 CSG324‐2 现场可编程门阵列 [32] 上实现了一个具有8位地址空间的分布式虚拟机。该现场可编程门阵列芯片采用28纳米技术制造,包含 101,440个逻辑块。该现场可编程门阵列搭载在Trenz Electronics 开发板上,开发板配备100兆赫兹时钟,并通过JTAG转USB适配器与运行在Windows个人计算机上的Xilinx Vivado 设计套件进行通信。我们已利用该现场可编程门阵列实现了最多40 个节点的分布式虚拟机。为了展示实现中由于并行性带来的加速效果,我们进行了一个实验,使用了表达式
(pred (+ 2 3))
其中pred是减一函数。该表达式编译为12个字节码。在求值期间,会创建5个额外的参与者,代表堆分配对象(2个数字和3对)。因此,在 4 × 5网格上足以容纳分布式堆的参与者,其最大规模为17。
密度是网格大小除以冗余度。密度与预期求值时间之间存在复杂的关系。预期求值时间是预期消息传递延迟和预期对象分配时间的函数。随着密度增加,预期消息传递延迟减少,因为消息的发送者在遇到其消息的接收者之前需要等待的时间更短。然而,预期对象分配时间增加,因为分配对象的参与者必须更长时间地等待其邻域中出现空位。6由此可见,对于给定的表达式和期望的鲁棒性水平,存在一个能够最小化预期求值时间的密度。
该实验在三种不同条件下进行: 4×5(×1)、 8×5(×1) 和 8 × 5(×1),其中 m × n(×k) 表示一个大小为 m × n 的网格,初始化时每个字节码参与者有 k 个副本。选择这些条件的原因是第二种和第三种的节点数量是第一种的两倍,而第一种和第三种具有相等的参与者密度。相等密度消除了消息传递延迟和对象分配时间不同的混杂因素,从而可以测量并行加速效果。
一个用Java编写的代码生成器会根据所需的网格大小生成VHDL代码,并以期望的冗余级别将表示已编译表达式的字节码参与者随机填充到网格中。然后,设计工具对VHDL代码进行综合,生成用于对FPGA进行编程的比特流。我们还将集成逻辑分析仪(ILA)核心插入比特流中,以便从运行中的设备捕获数据,用于实验结果。
该实现包含一个由100MHz开发板时钟驱动的附加进程,该进程在每个时钟脉冲上递增一个32位计数器。该计数器用于以每次计数增量10纳秒间隔获得精确的定时。当halt字节码接收到续体时,计数器停止,ILA被触发以捕获数据。计数值即为分布式虚拟机评估编译后表达式所需的时间。测试了三种不同的条件,每种条件运行十次。求值时间如表1所示。
| 条件 | 4 × 5(×1) | 8 × 5(×1) | 8 × 5(×2) |
|---|---|---|---|
| Mean (µs) | 1321.65 | 1953.48 | 1585.64 |
| 标准差 (µs) | 471.46 | 603.38 | 391.80 |
8 × 5(×1) 条件比 4 × 5(×1) 条件更慢,因为较低的参与者密度增加了消息传递延迟。参与者在遇到其消息的接收者之前,平均需要扩散两倍的时间。然而,它并没有慢两倍,这是因为 8× 5(×1) 条件下预期的对象分配时间减少了。包含 17 个对象的堆几乎刚好适合 4 × 5网格,但在 8 × 5网格上有充足的空间。
与消息传递延迟随密度增加而减少的预期一致,我们观察到 8 × 5(×2)条件比 8 × 5(×1)条件更快。然而,它并未快上一倍,这是因为 8 × 5(×2)条件下的预期对象分配时间增加所致。包含34个对象的堆 barely 适合 8 × 5网格,而包含17个对象的堆则很容易容纳。
最后, 8 × 5(×2) 条件的评估时间仅比相等密度 4 × 5(×1) 条件略长。这表明该 FPGA 实现是一个真正的并行电路,解决了两倍问题在(本质上)相同的时间内完成。我们推测, 8 × 5(×2) 条件下的评估时间更长,是因为在 8 × 5 网格上实现的分布式虚拟机几乎占满了整个现场可编程门阵列,导致综合算法的元件布局效率降低。我们假设,如果使用容量更大的现场可编程门阵列重复该实验,则在密度相等的情况下,求解不同规模问题所需时间的比率将更接近于一。
7 结论
最近的研究表明,函数式编程语言中的表达式如何被编译成一种称为分布式虚拟机(DVM)的大规模冗余异步空间计算。由于表达式求值的语义完全是函数式的,因此分布式虚拟机可以在堆的表示中采用大规模冗余,以帮助确保即使物理宿主基板的大部分区域发生故障,计算仍能完成[30]。由于它们可以被实现为异步电路,分布式虚拟机还解决了作为集成电路实现的传统机器架构所面临的一个众所周知的问题,即随着器件尺寸的增加,时钟网络占用的面积比例越来越大。
尽管在进化计算研究中使用自复制分布式虚拟机 [31] 有可能结合人工生命和遗传编程方法的优势,但这无法在没有硬件实现的分布式虚拟机的情况下实现,该硬件实现必须比当前的软件模拟快几个数量级。本文描述了首个分布式虚拟机的硬件实现。这是通过从一种专用分布式内存多计算机的VHDL规范综合出一个全局异步、局部同步电路,并在FPGA中实现而完成的,该多计算机具有网格互连网络。多计算机的节点结合了一个基于戴比格虚拟机的处理器,用于执行编译后的Scheme程序 [13],并配备足够的本地内存以存储单个堆分配对象和续体。每个节点包含其自己的时钟和伪随机数生成器,相邻节点之间的同步通过四相握手协议实现。一个由40个节点组成的 5×8 网格结构的工作实现被用于评估一个编译后的Scheme表达式。值得注意的是,测得的求值时间与并行实现一致。使用具有更多逻辑块的FPGA器件将允许实现和测试具有更大网格规模的分布式虚拟机,从而能够评估更复杂的表达式并具备更高的冗余度。
1429

被折叠的 条评论
为什么被折叠?



