在研究硬件如何影响计算性能时,我们一端有 GPP(通用处理器),另一端有 ASIC(专用集成电路)。处理器具有高度可编程性,但在功耗和性能方面通常效率低下。ASIC 实现专用和固定功能,并提供最佳的功耗和性能特性,但任何功能更改都需要完全(且极其昂贵)的电路重新设计。
幸运的是,在这两个极端之间存在几种架构。PLD(可编程逻辑器件)就是一个例子,它提供了两全其美的优点。它们更接近硬件,并且可以重新编程。
PLD 最突出的例子是 FPGA(现场可编程门阵列)。它由 LUT(查找表)组成,用于实现组合逻辑;以及 FF(触发器),用于实现时序逻辑。除了同质的逻辑单元阵列外,FPGA 还包含离散组件,例如 BRAM(块 RAM)、DSP(数字信号处理)切片、处理器内核以及各种通信内核(例如,以太网 MAC 和 PCIe)。
BRAM 是专门的存储结构,分布在 FPGA 结构的列中,尤其重要。每个 BRAM 最多可容纳 36 Kbits 的数据。BRAM 可以以各种外形尺寸使用,并且可以级联以形成更大的逻辑存储结构。由于 BRAM 的分布式组织结构,它们可以为内存带宽密集型应用提供 TB 级的带宽。赛灵思和 Altera 在 PLD 市场占据主导地位,合计占有超过 85% 的市场份额。
长期以来,FPGA 被认为是小批量、低密度的 ASIC 替代品。然而,遵循摩尔定律,FPGA 的密度和速度都在不断提高。现代 FPGA 可以拥有多达 200 万个逻辑单元、68 Mbits 的 BRAM、超过 3,000 个 DSP 切片以及多达 96 个用于实现多千兆位通信通道的收发器。23 赛灵思和 Altera 最新的 FPGA 系列更像是 SoC(片上系统),在同一芯片结构上混合了双核 ARM 处理器和可编程逻辑。加上更高的器件密度和性能,FPGA 正在迅速取代 ASIC 和 ASSP(专用标准产品)以实现固定功能逻辑。分析师预计,到 2016 年,可编程 IC(集成电路)市场将达到 100 亿美元。20
最令人费解的事实是,以比 CPU 和 GPU(图形处理器)低一个数量级的时钟频率运行的 FPGA 能够胜过它们。在几类应用中,尤其是基于浮点的应用中,GPU 的性能略好于或非常接近 FPGA 的性能。然而,在功耗效率(每瓦性能)方面,CPU 和 GPU 都远落后于 FPGA,如现有文献所示,这些文献比较了 CPU、GPU 和 FPGA 在不同应用类别中的性能。6,18,19
处理器和 FPGA 之间性能的对比在于架构本身。处理器依赖于冯·诺依曼范式,其中应用程序被编译并存储在指令和数据存储器中。它们通常在指令和数据提取-解码-执行-存储流水线上工作。这意味着指令和数据都必须从外部存储器提取到处理器流水线中。尽管使用缓存来减轻从外部存储器进行昂贵的提取操作的成本,但每次缓存未命中都会导致严重的性能损失。处理器和内存之间的带宽通常是决定整体性能的关键因素。这种现象也被称为“撞到内存墙”。21
FPGA 具有可编程逻辑单元,可以用于在空间和时间上实现任意逻辑功能。FPGA 设计实现了数据和控制路径,从而摆脱了提取和解码流水线。分布式片上存储器为满足并发逻辑的需求提供了急需的带宽。FPGA 固有的细粒度架构非常适合利用应用程序中存在的各种形式的并行性,从位级并行到任务级并行。除了在执行前使用映像对整个 FPGA 结构进行编程的传统重新配置功能外,FPGA 还能够进行部分动态重新配置。这意味着当 FPGA 的其余部分正常工作时,可以加载 FPGA 的一部分新映像。这类似于处理器分类法中的分页和虚拟内存的概念。
如今,各种基于 FPGA 的系统已经上市。它们的范围从针对 HPC(高性能计算)的异构系统(将 FPGA 与传统 CPU 紧密耦合,例如 Convey Computers)到使用 PCIe 连接 FPGA 的中档商用现成工作站,再到将嵌入式处理器直接集成到 FPGA 结构或同一芯片上的低端嵌入式系统。
尽管 FPGA 具有优势并且发展迅速,但 FPGA 技术的使用仅限于一小部分硬件程序员。更广泛的软件程序员群体一直远离这项技术,这主要是因为初学者在学习和使用 FPGA 时遇到了挑战。
FPGA 主要使用 HDL(硬件描述语言)进行编程,例如 Verilog 和 VHDL。这些语言可以追溯到 20 世纪 80 年代,并且几乎没有经过修订,就为用户提供的抽象级别而言,它们非常低级。硬件设计师以低级构建块(例如门、寄存器和多路复用器)来考虑设计。VHDL 和 Verilog 非常适合在那个抽象级别上描述设计。以行为级编写应用程序并将其命运交给综合工具通常被认为是不良的设计实践。
这与过去 60 年中不断发展的软件编程语言形成鲜明对比。CPU 编程受益于完善的 ISA(指令集架构)和高级编译器,它们提供了更简单的编程体验。面向对象和多态编程概念以及自动内存管理(垃圾回收)不再仅仅被视为理想的功能,而是必需品。更高的抽象级别大大提高了程序员的生产力,并降低了出现错误的可能性,从而缩短了产品上市时间。
另一个与语言相关的问题是,只有 VHDL 和 Verilog 的一小部分子集是可综合的。更糟糕的是,不同的 EDA(电子设计自动化)工具支持的功能没有标准化。很大程度上取决于 EDA 工具供应商来决定他们想要支持哪些语言功能。
虽然对 char、int、long、float 和 double 等数据类型的支持是所有软件语言不可或缺的一部分,但 VHDL 和 Verilog 长期以来仅支持 bit、bit 数组和 integer。VHDL 标准(IEEE 1076-2008)的最新修订版引入了定点和浮点类型,但即使不是全部,大多数综合工具尚不支持这些抽象。
图 1 是一个将摄氏度转换为华氏度的 C 程序。该语言带有许多有用函数的标准库。为了在 FPGA 实现中用 VHDL 或 Verilog 实现相同的程序,用户必须使用 FPGA 供应商特定的 IP(知识产权)内核生成器工具(例如,Xilinx 的 Coregen 和 Altera 的 MegaWizard)生成网表(预编译代码)。然后,以结构化方式连接生成的网表。图 2 显示了顶层包装器,它由叶级模块(即,双精度浮点乘法器 (fp mult) 和加法器 (fp add))的结构化实例化组成。(为了简洁起见,此处未显示叶级模块。)
设计和验证在硬件世界中齐头并进。验证很容易成为整个设计周期中最大的部分。它需要创建一个测试平台,该测试平台可以使用 HDL 或使用高级语言(例如 C、C++ 或 SystemC)创建,这些语言使用 VHDL 和 Verilog 提供的 FLI(外部语言接口)扩展连接到 DUT(被测设计)。DUT 和测试平台使用基于事件的模拟器(例如,Mentor Graphics ModelSim 和 Cadence Incisive Unified Simulator)进行模拟。每个信号事务都被记录并显示为波形。基于波形的调试适用于小型设计,但随着设计规模的增长,很快就会变得乏味。此外,随着设计规模的增加,仿真速度会迅速下降。一般来说,仿真比在硬件中运行的真实设计慢几个数量级。通常,大型系统设计人员必须转向使用 FPGA 的原型设计(仿真)来加速设计仿真。这与软件验证的工作方式形成鲜明对比。从简单的printf语句到高级静态和动态分析工具,软件程序员有许多工具和技术可用于以更简单但更强大的方式调试和验证程序。
除了与语言相关的挑战外,FPGA 编程还需要使用复杂且耗时的 EDA 工具。综合时间(从源代码生成用于编程 FPGA 的位流所花费的时间)可能从几分钟到几天不等,具体取决于代码大小和复杂性、目标 FPGA、综合工具选项和设计约束。
图 3 显示了 Xilinx FPGA 的设计流程。22 在功能验证之后,由 VHDL、Verilog 和网表组成的源代码被馈送到综合工具。综合阶段编译代码并生成网表 (.ngc)。转换阶段合并所有综合的网表以及物理和时序约束,以生成 NGD(原生通用数据库)文件。映射阶段将网表中的逻辑符号分组到物理组件中,例如 LUT、FF、BRAM、DSP 切片、IOB(输入/输出块)等。输出以 NCD(原生电路描述)格式存储,并包含有关开关延迟的信息。如果设计超出可用资源或用户指定的时序约束被开关延迟本身违反,则映射阶段会导致错误。PAR(布局布线)阶段在实际 FPGA 器件上执行映射符号的布局和布线。对于某些 FPGA 器件,布局在映射阶段完成。PAR 以 NCD 格式存储输出,如果总延迟(开关加布线)超过用户指定的时序约束,则通知用户时序错误。
在 PAR 之后,执行时序分析以生成详细的时序报告,其中包含不同路径的所有延迟。用户可以参考时序分析报告来确定哪些关键路径未能满足时序要求,然后在源代码中修复它们。大多数综合错误意味着用户必须返回到源代码并重复整个过程。一旦设计满足资源和时序约束,就可以生成位流。bitgen 工具接收完全布线的设计并生成可用于编程 FPGA 的配置位流。最后,可以使用 Impact 工具将设计下载到 FPGA。
图 3 中描述的设计流程因 FPGA 供应商而异。此外,为了充分利用综合工具,用户必须对目标 FPGA 架构有充分的了解,因为几个综合选项与该架构相关联。这些选项的调整方式最终决定了设计是否会满足资源和时序约束。
设计可移植性是另一个巨大的挑战,因为将设计从一个 FPGA 移植到另一个 FPGA 通常需要重新创建所有 FPGA 器件特定的 IP 核。从一个 FPGA 供应商迁移设计到另一个 FPGA 供应商甚至是一个更大的挑战。
HLS(高级综合)是指将应用程序的算法描述转换为低级 RTL(寄存器传输级)描述或数字电路。在过去的十年左右,已经提出了几种语言和编译器框架,以减轻 FPGA 编程的痛苦。它们都旨在提高用户可以编写程序以将其编译为 VHDL 或 Verilog 的抽象级别。这些框架中的大多数可以分为五类:类似 HDL 的语言;基于 C 的框架;基于 CUDA(计算统一设备架构)/OpenCL(开放计算语言)的框架;基于高级语言的框架;以及基于模型的框架。
尽管自 VHDL 和 Verilog 推出以来,仅对其进行了微小的增量更改,但 SystemVerilog 代表着一个巨大的飞跃。它在语义上与 Verilog 有一些相似之处,但它比相似之处更不相似。SystemVerilog 由两个组件组成:可综合组件,它扩展了 Verilog-2005 标准并添加了几个功能;以及验证组件,它大量使用了面向对象的模型,并且更类似于 Java 等面向对象的语言,而不是 Verilog。SystemVerilog 大大改进了 Verilog 的类型系统和参数化能力。不幸的是,EDA 工具今天对该语言的支持有限:Xilinx 综合工具不支持 SystemVerilog,而 Altera 综合工具支持一小部分子集。
该类别中的另一种值得注意的语言是 BSV(Bluespec SystemVerilog),它像 Verilog 和 VHDL 一样,结合了模块、模块实例和模块层次结构等概念,并遵循 SystemVerilog 的接口模型来在模块之间进行通信。在 Bluespec 中,模块行为使用受保护的原子动作来表示,这些动作基本上是并发 FSM(有限状态机),硬件程序员非常熟悉这个概念。用 Bluespec 编写的程序被传递给 Bluespec 编译器,该编译器生成高效的 RTL 描述。2011 年 上的一篇文章对该语言和编译器进行了全面描述。14
HLS 领域的早期工作大多是在基于 C 的语言(例如 C、C++ 和 SystemC)上完成的。这些框架中的大多数将程序员限制为仅使用父语言的一小部分子集。禁止使用指针、递归函数和动态内存分配等功能。其中一些框架要求用户在编译前对程序进行大量注释。有关基于 C 的框架的完整列表,请参见 João M. P. Cardoso 和 Pedro C. Diniz 的著作《可重构架构的编译技术》。7
有趣的是,所有 EDA 供应商都开发或收购了工具套件,以实现高级综合。他们的 HLS 框架(例如,Cadence C-to-Silicon Compiler、Synopsys Synphony C Compiler、Mentor Graphics Catapult C 和 Xilinx Vivado),除了 Altera 提出的框架外,都基于类 C 语言。以下部分将介绍 Xilinx Vivado HLS 工具。
Xilinx Vivado(以前的 AutoPilot)。 2011 年,Xilinx 收购了 AutoESL 开发的 AutoPilot 框架5,8,现在将其作为 Vivado Design Suite 的一部分提供。它支持从用 C/C++/SystemC 编写的行为描述编译到 RTL。行为综合包括四个阶段:编译和阐述;高级代码转换;核心行为和通信综合;以及微架构生成。
C/C++/SystemC 中的行为代码由与 GCC(GNU 编译器集合)兼容的编译器前端解析和编译。前端添加了几个面向硬件的功能,例如数据类型的位宽优化,以精确使用表示数据类型所需的位数。对于 SystemC 设计,阐述阶段提取进程、端口和其他互连信息,并生成综合数据模型。
综合数据模型在高级代码转换阶段进行多个编译器优化(例如,常量传播、死代码消除和位宽分析)。
在核心行为和通信综合阶段,Vivado 考虑了用户指定的约束(例如,频率、面积、吞吐量、延迟和物理位置约束)以及目标 FPGA 器件架构,以进行调度和资源绑定。
在微架构生成阶段,编译器后端生成 VHDL/Verilog RTL 以及综合约束,这些约束可以作为综合工具的输入传递。该工具还生成 SystemC 中的等效描述,该描述可用于对生成的 RTL 代码进行验证和等效性检查。
随着 Nvidia 在 2006 年发布 CUDA 框架,GPU 在通用计算中的普及程度飙升。该框架包括 C 编程语言的语言和运行时扩展,以及用于主机和 GPU 设备之间通信的驱动程序级 API。借助 CUDA,研究人员和开发人员可以利用大规模 SIMD(单指令,多数据)风格的架构并行性来运行计算密集型任务。2008 年,OpenCL 作为异构系统并行编程的开放标准公之于众。OpenCL 支持在 CPU 和 GPU 等目标上执行。为了利用 CUDA 和 OpenCL 的普及,已经提出了许多编译器框架,用于将 CUDA16 和 OpenCL3,13,15 代码转换为 VHDL/Verilog。这些产品之一是 Altera OpenCL 框架。
Altera OpenCL-to-FPGA 框架。 Altera 提出了一个从 OpenCL3 合成位流的框架。图 4 显示了 Altera OpenCL-to-FPGA 框架,用于将 OpenCL 程序编译为 Verilog,以便在主机和 Altera FPGA 上协同执行。该框架由内核编译器、主机库和系统集成组件组成。内核编译器基于开源 LLVM 编译器基础设施,将 OpenCL 内核代码综合为硬件。主机库提供 API 和绑定,用于在处理器上运行的应用程序的主机部分和 FPGA 上运行的应用程序的内核部分之间建立通信。系统集成组件将内核代码与内存控制器和通信接口(例如 PCIe)封装在一起。
用户应用程序由用 C/C++ 编写的主机组件和一组用 OpenCL 编写的内核组成。OpenCL 内核使用开源 LLVM 基础设施编译。解析器完成编译的第一步,生成一个 IR(中间表示),该 IR 由通过控制流边连接的基本块组成。
实时变量分析确定每个基本块的输入和输出。一个基本块由三种类型的节点组成:合并节点负责聚合来自先前节点的数据;操作节点表示加载、存储和执行指令;分支节点从多个基本块中选择一个线程后继者。
在实时变量分析之后,对 IR 进行优化以生成 CDFG(控制数据流图)。从 CDFG 为每个基本块生成 RTL。使用 SDC(差异约束系统)调度算法为 CDFG 中的每个节点计算执行计划。调度程序使用线性方程来调度指令,同时最小化成本函数。
内核编译器为 CDFG 中的节点生成的硬件逻辑与实现 CDFG 控制边的 stall、valid 和数据信号一起添加。生成的 Verilog 代码与通信(例如 PCIe)和内存基础设施封装在一起,以分别与主机和片外内存交互。使用基于模板的设计方法,其中与应用程序无关的通信和内存基础设施被锁定为系统的静态部分,只有与应用程序相关的内核部分被综合。这种分层、基于分区的方案减少了综合时间。然后对设计进行综合以生成位流。
Altera 还提供了一个主机库,其中包含将主机函数调用绑定到 FPGA 中实现的 OpenCL 内核的 API。用 C/C++ 编写的主机端代码链接到这些库,从而实现主机处理器上运行的应用程序代码和 FPGA 上运行的 OpenCL 内核之间的运行时通信和同步。主机库还包含 Auto-Discovery 模块,该模块允许主机程序查询和检测 FPGA 上运行的内核类型。
由于现代编程语言的普及,最近提出的几个框架使用高级语言作为生成硬件电路的起点。该类别中的语言高度抽象,通常是面向对象的,并提供高级功能,例如多态性和自动内存管理。一些值得注意的语言和框架是 Esterel、23 Kiwi、12 Chisel、4 和 IBM 的 Liquid Metal1。
Liquid Metal。 IBM 的 Liquid Metal 项目旨在不仅为 FPGA 提供高级综合,1 而且更广泛地为异构架构编程提供一种统一的语言。该项目提供了一种名为 Lime 的语言,2 可用于编程硬件(FPGA)以及在传统 CPU 和更奇特的架构(例如 GPU)上运行的软件。10 Lime 语言建立在避免困扰基于 C 的框架的复杂程序分析的原则之上,同时还提供强大的编程模型,这些模型拥护函数式和面向流式编程的优势。
Lime 的显着特点包括能够以单个位的粒度表示位字面量和计算 - 就像在 HDL 中一样 - 但具有高级抽象和面向对象编程的强大功能。例如,这些允许定义由位宽参数化的泛型类、多态方法和重载运算符。
Lime 与 Java 兼容,因此是强类型的。该语言添加了有助于编译器推导出重要属性的功能,以便高效地行为综合到 HDL 中。这些包括基于实例化的泛型、有界数组、不可变类型和局部副作用,这些副作用由类型检查器保证并由编译器利用,以用于生成高效和流水线化的电路。
Lime 的另一个重要功能是基于任务的数据流编程模型,该模型允许在任务粒度级别进行程序分区,通常类似于架构或 FPGA 电路的框图。
Lime 中的任务可以被强烈隔离,使其无法访问可变全局程序状态(因为它在 FPGA 中成本过高),并且不存在对任务的外部引用,因此除了从任务内部(如果存在)之外,其状态无法被修改。任务图是通过将任务连接在一起(使用一流的连接运算符)而产生的,因此一个任务的输出成为另一个任务的输入。
图 5 显示了 Liquid Metal 编译和运行时架构。前端编译器首先将 Lime 程序转换为描述任务图的中间表示。每个编译器后端都是一个垂直集成的工具链,它不仅为目标架构编译代码,还生成适用于该架构的可执行工件。例如,从 Lime 合成 HDL 的 Verilog 后端还将自动调用目标 FPGA 的 EDA 工具,以执行逻辑综合并生成可以加载到 FPGA 上的位文件。每个后端都提供一组排除规则,将 Lime 语言限制为可综合的子集。一些值得注意的排除项是使用无界数组和非最终类。动态内存分配仅限于对象的最终字段,并且递归方法调用可能最多只有一个参数。随着编译技术的成熟,这些规则预计会随着时间而改变。
Lime 代码始终可以在至少一个架构上执行:JVM(Java 虚拟机)。因此,可以使用高级调试工具(包括基于 Eclipse 的 Lime IDE)完全在软件中执行 Lime 程序的函数验证。映射到 FPGA 的任务可以与映射到系统其他部分(例如 GPU 或 JVM)的任务协同执行,并且整个系统的通信由 Lime 运行时协调。
该语言允许程序员通过 Lime Native Interface 将本机 HDL 代码无缝集成到他们的 Lime 代码中。这允许程序员在 HDL 中实现应用程序的时序和性能关键组件,并在 Lime 中实现应用程序的其余部分,以便满足当前行为综合技术可能不容易实现的性能规范。
基于模型的框架提供了一种设计复杂控制和信号处理系统的抽象方法。它们通过使用可执行规范来提高设计质量并加速设计和验证任务。可执行规范有助于硬件-软件分区、验证和快速设计迭代。NI(美国国家仪器)LabView9 和 Matlab HDL Coder17 是两个基于模型的框架。它们对于具有强大领域专业知识但软件/硬件编程语言经验较少的设计人员尤其有用。
NI LabView。NI LabView 是一种图形化编程和设计语言。使用功能块和互连,设计人员可以创建一个看起来像他们白板设计的图形化程序。LabView 提供了一个集成环境,该环境由用于开发的图形编辑器;调试器;编译框架;以及在各种目标(例如台式机处理器、PowerPC、ARM 处理器和许多 FPGA)上执行的中间件组成。借助 LabView,用户可以在一个平台上开始开发和测试,然后逐步迁移到另一个平台。
Matlab HDL Coder。Matlab 是一种用于数值和科学计算以及系统建模的高级语言和交互式环境。它提供了许多工具和功能丰富的库,可用于快速实现算法和建模各种应用领域的系统。Simulink 是 Matlab 产品套件的一部分,它为系统仿真和基于模型的设计提供了基于框图的图形环境。Simulink 基本上是用于不同应用领域的库(工具箱)的集合。HDL Coder 是其中一个工具箱,它从 Matlab 函数和 Simulink 模型生成可综合的 VHDL 和 Verilog 代码。用户可以使用库块和 Matlab 函数在 Simulink 中建模他们的系统,然后通过使用相同的模块化方法创建测试平台,轻松地针对功能规范测试模型。验证后,用户可以生成位优化的、周期精确的可综合 RTL 代码。
微处理器设计中的频率缩放时代在很大程度上被认为是结束了,程序员越来越多地转向异构架构以寻求更好的性能。
我们已经开始看到通用处理器和 GPU 集成在同一芯片上。预计未来多样性将增加,包括 ASSP,甚至可编程逻辑(例如 FPGA)。关键是更紧密地集成这组不同的计算元素。CPU、GPU、FPGA 和其他 ASSP 将集成在同一芯片上的时代指日可待。有几个用于协同编程 CPU 和 GPU 的标准和规范,但 FPGA 迄今为止一直处于孤立状态,这主要是因为缺乏对设备驱动程序、编程语言和工具的支持。
如果要使 FPGA 加入主流异构计算,就迫切需要改进 FPGA 的编程方面。FPGA 的编程技术落后于半导体技术的进步。正如本文所讨论的,HDL 太低级了。必须花费大量设计周期时间在编码和验证上。设计迭代非常昂贵,并且禁止彻底的设计空间探索。
HLS 提出了一个有希望的方向,但即使在该领域进行了数十年的研究之后,FPGA 编程实践仍然支离破碎且具有挑战性,给研究人员和开发人员带来了沉重的工程负担。一些问题出现的原因是同时进行了太多的工作,没有任何标准化,但没有一个提供全面的生态系统来促进采用和增长。许多正在进行的努力都集中在基于 C 的语言上。只有时间才能证明 C 是否是未来的正确抽象,因为它最初是为植根于冯·诺依曼架构的顺序执行模型而设计的,而现有的设计趋势表明异构和并行架构越来越多。
我们还需要重新审视将高级语言编译为 VHDL/Verilog,然后使用供应商特定的综合工具来生成位流的方法。如果 FPGA 供应商公开 FPGA 架构细节,则第三方可以开发新的工具,将高级描述直接编译为位流,而无需经过生成 VHDL/Verilog 的中间步骤。这很有吸引力,因为当前的综合时间太长,以至于在主流中无法接受。
1. Auerbach, J., Bacon, D. F., Burcea, I., Cheng, P., Fink, S. J., Rabbah, R., Shukla, S. 2012. 异构计算的编译器和运行时。在第 49 届 /EDAC/IEEE 设计自动化会议 (DAC) 会议记录中:271-276。
2. Auerbach, J., Bacon, D. F., Cheng, P., Rabbah, R. 2010. Lime:一种与 Java 兼容且可综合的异构架构语言。在 面向对象编程、系统、语言和应用程序国际会议 (OOPSLA) 会议记录中:89-108。
3. Aydonat, U., Denisenko, D., Freeman, J., Kinsner, M., Neto, D., Wong, J., Yiannacouras, P., Singh, D. P. 2012. 从 OpenCL 到 FPGA 上的高性能硬件. 载于第22届国际现场可编程逻辑与应用会议 (FPL) 论文集: 531-534.
4. Bachrach, J., Richards, B., Vo, H., Lee, Y., Waterman, A., Avidienis, R., Wawrzynek, J., Asanovic, K. 2012. Chisel:在 Scala 嵌入式语言中构建硬件. 载于第49届 /EDAC/IEEE 设计自动化会议 (DAC) 论文集: 1212-1221.
5. Berkeley Design Technology. 2010. AutoESL AutoPilot 高层次综合工具的独立评估. 技术报告.
6. Brodtkorb, A. R., Dyken, C., Hagen, T. R., Hjelmervik, J. M., Storaasli, O. O. 2010. 异构计算的最新技术. 科学程序设计 18(1).
7. Cardoso, J., Diniz, P. 2009. 可重构体系结构的编译技术. Springer.
8. Coussy, P., Morawiec, A. 高层次综合:从算法到数字电路. Springer, 2008.
9. Dase, C., Falcon, J. S., MacCleery, B. 2006. 使用基于 FPGA 的嵌入式控制系统进行摩托车控制原型设计. IEEE 控制系统 26(5): 17-21.
10. Dubach, C., Cheng, P., Rabbah, R., Bacon, D. F., Fink, S. J. 2012. 为 GPU 编译高级语言:(通过架构和编译器的语言支持). 载于第 33 届 SIGPLAN 程序设计语言设计与实现研讨会 (PLDI) 论文集: 1-12.
11. Edwards, S.A. 2002. 从同步语言 Esterel 进行高层次综合. 载于IEEE/ 国际逻辑与综合研讨会 (IWLS) 论文集: 401-406.
12. Greaves, D., Singh, S. 2010. 使用并发 C# 程序设计专用电路. 载于第 8 届 /IEEE 形式化方法与模型用于协同设计国际会议 (MEMOCODE) 论文集.
13. Jaaskelainen, P. O., de La Lama, C. S., Huerta, P., Takala, J. H. 2010. 基于 OpenCL 的专用处理器设计方法. 载于嵌入式计算机系统 (SAMOS) 论文集: 223-230.
14. Nikhil, R. S. 2011. 硬件系统设计中的抽象. 9(8); https://queue.org.cn/detail.cfm?id=2020861.
15. Owaida, M., Bellas, N., Daloukas, K., Antonopoulos, C. 2012. 从 OpenCL 程序合成平台架构. 载于FCCM (现场可编程定制计算机器) 论文集: 186-193.
16. Papakonstantinou, A., Karthik, G., Stratton, J. A., Chen, D., Cong, J., Hwu, W.-M. W. 2009. FCUDA:实现 CUDA 内核在 FPGA 上的高效编译. 载于专用处理器 (SASP) 论文集: 35-42.
17. Sharma, S., Chen, W. 2009. 使用基于模型的设计加速汽车应用的 FPGA 开发. The MathWorks.
18. Sirowy, S., Forin, A. 2008. 牛肉在哪里?为什么 FPGA 如此之快. Microsoft Research 技术报告 MSR-TR-2008-130.
19. Thomas, D. B., Howes, L., Luk, W. 2009. CPU、GPU、FPGA 和大规模并行处理器阵列在随机数生成方面的比较. 载于/SIGDA 国际现场可编程门阵列研讨会 (FPGAs) 论文集: 22-24.
20. WinterGreen Research Inc. 2010. 2010 年至 2016 年全球可编程逻辑 IC 市场份额和预测. 技术报告.
21. Wulf, W. A., McKee, S. A. 1995. 撞上内存墙:显而易见的含义. SIGARCH 计算机体系结构新闻 23(1): 20-24.
22. Xilinx. 2012. 命令行工具用户指南. 技术报告 UG628 (14.3).
23. Xilinx. 2012. 7 系列 FPGA 概述. 技术报告 DS180 (1.13).
喜欢还是讨厌?请告诉我们
David Bacon 是 IBM T.J. Watson 研究中心的研究人员。他的研究兴趣在于程序设计语言设计和实现,目前正在从事 Liquid Metal 项目。
Rodric Rabbah 是 IBM T.J. Watson 研究中心的研究人员。他对异构计算的程序设计语言、编译器和架构感兴趣。自 2007 年 IBM Liquid Metal 项目成立以来,他一直在这些领域工作。
Sunil Shukla 是 IBM T.J. Watson 研究中心的研究人员。他喜欢研究各个方面,包括基于加速器的计算的架构和编程方法,特别是动态可重构加速器。他目前正在从事 Liquid Metal 项目,该项目为异构架构(CPU、GPU、FPGA)编程提供单一语言解决方案。
© 2013 1542-7730/13/0200 $10.00
最初发表于 Queue vol. 11, no. 2—
在 数字图书馆 中评论这篇文章
Michael Mattioli - FPGA 在客户端计算硬件中的应用
FPGA(现场可编程门阵列)功能非常多样化。它们被广泛应用于各种应用和行业,在这些领域中使用 ASIC(专用集成电路)在经济上不太可行。尽管设计师在将 FPGA 集成到设备时面临面积、成本和功耗方面的挑战,但它们提供了显著的安全性和性能优势。这些优势中的许多可以在客户端计算硬件(如笔记本电脑、平板电脑和智能手机)中实现。
Christoph Lameter - NUMA(非均匀内存访问):概述
NUMA(非均匀内存访问)是一种现象,即处理器地址空间中不同位置的内存具有不同的性能特征。在当前的处理器速度下,从处理器到内存的信号路径长度起着重要作用。信号路径长度的增加不仅会增加内存延迟,而且如果信号路径被多个处理器共享,还会迅速成为吞吐量瓶颈。内存的性能差异首先在大型系统中变得明显,在这些系统中,数据路径跨越了主板或机箱。这些系统需要修改后的操作系统内核,该内核具有 NUMA 支持,可以显式理解系统内存的拓扑属性(例如内存区域所在的机箱),以避免过长的信号路径长度。
Bill Hsu, Marc Sosnick-Pérez - 实时 GPU 音频
今天的 CPU 能够为许多流行的应用程序支持实时音频,但一些计算密集型音频应用程序需要硬件加速。本文着眼于一些实时声音合成应用程序,并分享作者在 GPU(图形处理单元)上实现它们的经验。
Andrew Danowitz, Kyle Kelley, James Mao, John P. Stevenson, Mark Horowitz - CPU DB:记录微处理器历史
1971 年 11 月,英特尔推出了世界上第一款单芯片微处理器,英特尔 4004。它拥有 2300 个晶体管,运行频率高达 740 KHz,每秒可执行 60,000 条指令,功耗为 0.5 瓦。在接下来的四十年里,计算能力呈指数级增长,这一趋势促成了气候建模、蛋白质折叠和计算愤怒的小鸟实时弹道轨迹等各种应用。