英语原文共 4 页,剩余内容已隐藏,支付完成后下载完整资料
Java处理器的时态多线程体系结构设计
摘要 :在本文中,我们介绍了Java处理器的硬件时间多线程体系结构的设计。Java虚拟机(JVM)模型是一个堆栈计算机,其中进程状态是Java堆栈的快照。如果出于性能原因将运行时堆栈存储(或缓存)在片上存储器中,则用于上下文切换的Java运行时堆栈的备份和恢复将是昂贵的操作。我们在本文中提出了一种乒乓缓冲架构,以便为Java处理器提供完全基于硬件的多线程功能。所提出的硬件架构已在FPGA平台Xilinx ML605上实现和验证。实验结果表明,所提出的上下文切换效率远高于基于软件的VM,如CVM-JIT。因此,所提出的硬连线Java处理器对于需要大量多线程操作的嵌入式应用是有希望的。
关键词:java处理器,时间多线程,嵌入式系统。
- 介绍
对于Java处理器,运行时堆栈的设计是实现高性能的重要因素。片上堆栈高速缓存寄存器或便笺式存储器通常用于实现Java堆栈[1] [2] [6]。例如,在[2]中,我们提出了一种低成本的运行时堆栈设计,它可以实现Java加速器IP(JAIP)的双折叠指令折叠。为了使用单个Java核心支持Java程序的时间多线程执行,必须提供一种机制来保存和恢复Java线程状态。
在[3]中,提出了逻辑双栈高速缓存设计,使得片上堆栈存储器被组织为包含两个运行时堆栈。一个堆栈从低地址到高地址增长,另一个从高地址到低地址增长。此方法在运行时仅允许两个并发线程。虽然可以继续添加多个片上存储器组以允许更多线程[4],但成本将使该方法不切实际。另一种方法是采用多核架构同时进行多线程执行[6] [7]。但是,硬件成本甚至会高于时间多线程方法。
对于具有高性能应用处理器的嵌入式系统,通常采用具有即时(JIT)编译技术的基于软件的VM。对于软件VM, Java程序的多线程执行通常需要抢占式多线程操作系统内核的支持。另一方面,对于深度嵌入的Java应用程序,所有这些软件抽象层都可能过于昂贵,因为通常首选低功耗处理器。
在本文中,我们为深度嵌入式Java处理器JAIP提出了一种时间多任务架构。
JAIP是一种专为嵌入式Java SoC设计的硬连线可重用IP[2] [8]。虽然它需要(弱)主机处理器来支持动态类加载,但是一旦将类加载到系统的主存储器中,它就可以自己执行Java类。JAIP具有两级堆栈,因此其大部分运行时堆栈存储在片上存储器中(每个线程4KB)。因此,JAIP 内核执行上下文切换比传统RISC处理器更昂贵。本文提出的多线程体系结构使用DDR3内存来存储任务队列中线程的上下文(特殊用途寄存器和堆栈)。为了减少上下文切换的开销,我们采用了Ping-Pong堆栈架构,以便在另一个线程运行时可以同时执行保存/恢复线程的运行时堆栈。更重要的是,所提出的架构可以仅使用一对片上运行时堆栈来支持任意数量的线程。该设计是完全硬连线的,因此它不依赖主机处理器进行线程管理。
本文的结构如下。第二节概述了JAIP的基本架构,它能够单线程执行Java字节码。第三节介绍了提出的多线程架构。这里描述的两个主要硬件组件是Ping-Pong堆栈架构和Thread Manager硬件单元。在第IV节中,嵌入式Java应用程序的JemBench基准测试套件[10]用于测试多线程JAIP 与CVM-JIT的PowerPC版本的性能。最后,第五节给出了一些讨论。
- 目标Java处理器体系结构的概述
图1显示了目标Java应用程序处理器SoC的总体框图。处理器由RISC核心和Java核心JAIP组成。对于Java程序的执行, RISC 内核仅负责动态加载和解析存储在Compact Flash(CF)卡上的JAR文件中的类。Java核心完全负责字节码,内存管理和多线程调度的执行。
JAIP采用两级方法区域设计。运行时加载的所有类将使用后期解析策略存储在DDR3 SDRAM(即第二级方法区域) 中。但是,必须将Java方法(及其相关符号信息)加载到片上方法高速缓存(第一级方法区域)中,然后才能由字节码执行引擎执行。简而言之,Java应用程序的完整类映像最多存储在DDR3 SDRAM中最近使用的方法和符号信息以FIFO方式存储在片上方法高速缓存中。
Java SoC
Java Accelerator IP (JAIP)
interrupt
system bus
CF card controller
CF card (application classes)
DDR3-SDRAM
(Class images pool, object heap space)
External memory controller
RISC Core
Object Heap Controller |
Bytecode Execution Engine Dual Java Stack |
Method Area Manager |
Dynamic Resolution Controller |
Method Image Circular Buffer |
|||
Mailbox |
Thread Manager |
SymbolTable Circular Buffer |
Cross Reference Table |
图1. Java应用程序处理器SoC的体系结构。
由于Java VM基本上是堆栈机器,即所有局部变量和操作的中间值都存储在运行时堆栈中,因此对最新堆栈帧的快速访问对于Java处理器的性能是必不可少的。JAIP使用片上存储器块和三个topof-stack寄存器来形成两级Java 运行时堆栈[2]。与具有大堆栈缓存的设计相比,该设计在性能和实现成本之间是一个很好的权衡[10]。因此,保存/恢复JAIP线程的上下文涉及将多个堆栈帧(每个范围从几个字节到几百个字节)传输到DDR3 SDRAM存储器或从DDR3 SDRAM存储器传输。为了使JAIP支持基于硬件的多线程,我们提出了一种低成本的硬连线线程管理器单元,它具有片上Ping-Pong堆栈架构,以减少上下文切换开销。因此,在大多数情况下,从当前线程切换到下一个活动线程只需要一个周期。这比任何基于软件的抢占式多任务操片上运行时堆栈。一旦线程被选为当前线程并开始执行, 多线程逻辑也将选择要执行的下一个线程,并在第一个线 程运行时,在第二个线程的运行时堆栈中交换主记忆。当 第一个线程的时间片为up时,JAIP可以在一个周期内切换 到第二个线程,因为它已经设置了堆栈。在极少数情况下, 第二线程的运行时堆栈的设置花费的时间长于第一线程的 预定时间片,时间片将被扩展,直到第二线程的运行时堆 栈被正确设置。当系统时钟为83.3MHz时,本文中使用的 目标系统(Xilinx ML 605)备份或恢复运行时堆栈到/从后备存储(DDR3内存)的平均时间约为10 s。当执行切换到第二个线程时,第一个线程的运行时堆栈将保存到main。
内存与第二个线程的执行并行。一旦保存了第一个线程的堆栈,多线程控制逻辑将继续进行第三个线程的设置。使用此设计,保存/恢复运行时堆栈的开销可以与当前线程的执行重叠。根据我们的实验,所提出的架构的时间片可以小到20mu;s,并且上下文切换中的唯一开销实际上是处理器流水线的重置。较小的时间片意味着每个线程的CPU资源分配更均匀。使用基于软件的抢占式多任务操作系统很难实现这种级别的多线程效率。
- 建议的多线程架构
A. 乒乓堆栈结构
用于执行多线程Java程序,每个线程必须维护自己的寄存器和运行时堆栈。通常,Java处理器的寄存器文件仅由专用寄存器(例如,程序计数器,堆栈指针,局部变量指针等)组成,并且可以非常有效地换出到主存储器。另一方面,Java运行时堆栈比寄存器文件大得多。如果运行时堆栈存储在主存储器(例如DRAM)中, 则无需保存运行时堆栈。但是,大多数高性能Java处理器使用大堆栈缓存[1] [10]或两级片上堆栈来支持指令折叠并减少操作数的访问延迟。在任何一种情况下,换出堆栈所花费的时间都是不可忽视的。
JAIP的原始设计具有定制的4端口内存作为Java运行时堆栈。为了减少上下文切换开销,我们在JAIP的4端口堆栈架构中增加了另一组交织块RAM。换句话说,4端口堆栈现在包含两个片上运行时堆栈。一旦线程被选为当前线程并开始执行, 多线程逻辑也将选择要执行的下一个线程,并在第一个线 程运行时,在第二个线程的运行时堆栈中交换主记忆。当 第一个线程的时间片为up时,JAIP可以在一个周期内切换 到第二个线程,因为它已经设置了堆栈。在极少数情况下, 第二线程的运行时堆栈的设置花费的时间长于第一线程的 预定时间片,时间片将被扩展,直到第二线程的运行时堆 栈被正确设置。当系统时钟为83.3MHz时,本文中使用的 目标系统(Xilinx ML 605)备份或恢复运行时堆栈到/从后备存储(DDR3内存)的平均时间约为10s。
当执行切换到第二个线程时,第一个线程的运行时堆栈将保存到main。
内存与第二个线程的执行并行。一旦保存了第一个线程的堆栈,多线程控制逻辑将继续进行第三个线程的设置。使用此设计,保存/恢复运行时堆栈的开销可以与当前线程的执行重叠。根据我们的实验,所提出的架构的时间片可以小到20mu;s,并且上下文切换中的唯一开销实际上是处理器流水线的重置。较小的时间片意味着每个线程的CPU资源分配更均匀。使用基于软件的抢占式多任务操作系统很难实现这种级别的多线程效率。
B. 线程管理器单元
本文提出的多线程机制的主控制器是线程管理器单元(TMU)(见图2)。当Java程序执行从Thread类派生的对象的start()方法时,JAIP执行管道将向线程控制器发送信号,通知控制器初始化线程控制块(TCB)中的新任务并进入线程ID进入线程队列。在当前的设计中,使用了一个公平的循环算法。
图2.线程管理器单元。
图3.线程控制块。
控制器选择下一个准备好的线程。TCB本身使用寄存器文件实现,因此可以在一个时钟周期内保存和检索TCB条目中的信息。TCB的结构如图3所示。线程的状态存储在TCB 条目中,该条目由以下信息组成:
1.线程的ID。
2.线程的Java类和方法ID。
3.局部变量指针和操作数堆栈指针。
4.程序计数器和线程的局部变量数。
5.线程的第一级运行时堆栈元素(TOS_A,B和C寄存器)。有关详细信息,请参阅[2]。
6.Java堆中线程对象的对象引用(指针)。
每个TCB条目由8 32位组成。在当前设计中,线程控制块使用片上存储器实现。我们将最大线程数设置为16,以将TCB的大小限制为512字节。可以以更大的片上存储器为代价容易地扩展最大线程数。
对于线程管理,我们使用循环队列来存储队列中每个线程的ID。每次Java应用程序通过执行Thread对象的start()方法创建新线程时,将生成新的线程ID并将其输入到线程队列的末尾。当前线程的时间片结束时,其ID将移动到队列的末尾,“下一个”指针指向其ID的线程将成为当前线程。例如,在图4中,当前线程ID为1,下一个线程ID 为2.如果线程1的时间片为up,则ID 1将存储在tail指针位置和指针 next将被提前1指向ID 8.线程2将成为当前线程。
建议的线程控制器还处理Java同步机制。有两种类型的同步方法。第一个是使用monitorenter和monitorexit字节码声明同步块(类似于临界区)。第二种方案是通过使用synchronized关键字声明互斥对象来实现同步。使用称为数据相干控制器的硬件同步控制模块,所提出的架构支持这两种方法。该模块可以扩展到多个JAIP内核,以实现在不同内核上运行的线程的同步,这超出了本文的范围。
图4.圆形线程队列。
- 实验结果
拟议的架构已经实现了Xilinx ML605 FPGA 平台。该平台包含Xilinx Virtex-6 FPGA(XC6VLX240T)。设计中用于协助JAIP从CF卡进行动态类加载的RISC内核是Microblaze软核RISC处理器。JAIP 的RTL模型使用VHDL编写,并使用Xilinx XST进行合成13.4.系统的目标频率设置为83.3MHz。资源使用情况见表I.
为了评估提议的JAIP 的多线程性能, 我们使用了为了评估提议的JAIP 的多线程性能, 我们使用了JemBench套件的多线程基准程序[10]。这些测试程序解释如下。Dummy测试创建多个线程来执行5000次迭代的繁忙循环。对于Matrix测试,每个线程计算两个20 20矩阵的乘法。NQueens测试解决了每个线程中N
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[20649],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。