中文 英语

从软件合成硬件

软件工程师能创造硬件吗?这也许是可能的,但不是现有的高级合成工具所能做到的。

受欢迎程度

从软件自动生成优化硬件的能力是系统级设计自动化的主要原则之一,但从未完全实现。现在的问题是,这种情况是否会发生,是否只是拥有正确的技术或动机的问题。

高级合成(HLS)确实出自这项工作,并已被证明是非常有价值的,但输入不是软件。相反,它是对硬件的更抽象的描述。大多数HLS工具可以采用C、SystemC或c++作为输入。

“关于C合成的常见抱怨一直都是,它不是‘真正的’C或c++,”微软营销副总裁克里斯·琼斯(Chris Jones)说Codasip.“这种语言使用了大量的自定义语法,以至于到最后,用户可能就像在用Verilog写作一样。”

当谈到C/ c++的合成时,这个术语有两个含义。“从技术上讲,c++是一种‘语言’,但在‘C/ c++到硬件’的上下文中,它也意味着算法抽象层,”ibm的产品管理总监戴夫·珀斯利(Dave Pursley)说节奏.“虽然HLS会综合你扔给它的算法,但为了获得良好的硬件,你需要从硬件的角度编写算法。”

这意味着原始的C代码经常需要修改。“算法通常是用C/ c++编写的,但缺乏SystemC硬件实现所需的细节,”微软营销主管罗布•范•布洛姆斯泰因表示OneSpin解决方案.即使是SystemC模型对于高层次的综合来说也经常过于抽象,必须在将其转换为硬件之前进行细化。这样的模型,尤其是由软件团队编写的模型,很少能反映硬件的重要方面,比如管道、有限的内部存储和有限的内存带宽。”

其他人也报告了类似的障碍。“使用HLS将软件转换为硬件有几个基本的挑战,首先代码必须由HLS引擎合成,”HLS的产品副总裁Jordon Inkeles说Silexica.这意味着代码必须被编写或重构为硬件可合成的格式,这对于习惯于用标准C/ c++编写的软件工程师来说并非易事。HLS的编码合成器指南是实质性的,工程师必须熟悉这些指南,涵盖数百页的文档。”

Inkeles说:“一旦代码是可合成的,它还需要对底层硬件有一定程度的了解,当你把一些东西放到硬件中时,考虑资源使用是很重要的。例如,当编写在处理器上运行的软件时,你可能只对所有数据类型使用浮点数,而不会产生重大损失,但在硬件上实现时,它会导致额外的宝贵硬件资源消耗,这可能是昂贵的,也会降低算法的性能。”

那么,从软件合成是一种幻想吗?“高级合成,无论是c++、SystemC、Matlab还是其他行为定义,在过去十年里都取得了长足的进步,”斯图尔特·拜尔斯(Stuart Biles)说手臂.“它是许多应用程序的一个很好的候选者,特别是在无线电、音频或图像处理领域可能会发现的数据处理管道。当与FPGA结合使用时,它可以促进快速的原型设计、验证和优化设计周期,并在部署之前从开发系统中观察到的性能反馈。”

它也被其他应用领域所接受。Jones说道:“其他高级描述语言也在使用中,并获得了市场的认可,包括Synopsys的NML语言或Cadence Tensilica的TIE语言,以及Chisel和Codasip自己的CodAL等新语言。“这些最好被定义为'处理器描述语言',并以各种方式使用,但主要用于定制已建立架构的指令集或从头开始设计处理器。”

市场压力越来越大。“经济增长放缓摩尔定律意味着处理器总体上不能再像过去30至40年那样继续推动性能,”CacheQ首席执行官克莱•约翰逊(Clay Johnson)表示。“还需要其他技术。其他技术包括gpu、机器学习和fpga等领域的定制设备。众所周知,fpga当然可以加快速度,但开发环境在传统上和今天都集中在硬件开发人员而不是软件开发人员。”

许多开发团队的组成正在发生变化。“一个客户告诉我,他们的员工中有多少人会写rtl——基本上是零,有多少人会写C/ c++——大约3万人,”Raymond Nijssen说Achronix.“我们当中有恐龙,他们说他们可以做得比工具更好,但他们是一个濒临灭绝的物种。他们正在被那些只想按下按钮、不在乎解决方案是否完美的人所取代。对他们来说,重要的是他们能相当快地得到结果。周转时间开始越来越多地推动这一趋势。因此,你要在效率方面付出代价,让这些工具更快地给出结果。”

CacheQ的Johnson对此表示赞同。“如果我是硬核玩家FPGA我是否能够设计出一个功能,得到更小的面积和更高的性能——可能是的。如果你看看大型fpga,我认为硬件人员无法充分理解所有的算法细节,从而在细节层面上实现它。”

在过去,许多协处理器解决方案一直受到通信成本的困扰。Nijssen指出:“加速器之间没有足够低的延迟来证明将工作负载从一个处理元素转移到另一个处理元素是合理的。”“如果将一些矩阵从一个地方移动到另一个地方需要毫秒,那么由于移动物体的时间和成本,CPU将能够在同一时间内以更少的能量完成任务。”

嵌入式FPGA在这个领域将会很有趣。”Mentor是西门子旗下的企业.“如果FPGA是一个独立的设备,那么从芯片到FPGA可能会抵消从软件到硬件实现的大部分好处。将FPGA保留在SoC上将缓解这些问题。”

找到合适的候选人
并非所有软件都适合映射到硬件。Arm的拜尔斯说:“从高级规格中映射处理器这样复杂的东西是可能的,尽管目前的结果还不是最优的。”“像转发和控制流这样的概念并没有得到很好的映射。数据处理是一个控制决策较少的领域,这使得更容易有效地映射。没有大量配置参数或多种操作模式的应用程序更容易让设计人员满意,因为已经合成了有效的实现,并且没有重复的通用功能。”

性能来自于采用串行进程并利用并发性。Johnson说:“获得性能的方法是加速循环。“如果你看一下C代码,复杂算法的绝大多数时间都花在循环中。加速循环的方法是使循环完全流水线化。在处理器中,如果我有一个循环,这个循环是n次迭代,它需要C个周期来完成,那么在处理器中它所花费的时间大约是(n x C)/时钟速率。如果你完全流水线化一个循环,那么时间量是(n + C)/时钟速率。”

这是HLS增加价值的地方之一。“高级合成工具在发现和引入并发性方面做得很好,”Mentor的Klein说。“由于算法描述的性质,在无法提取并发性的情况下,它将为开发人员识别依赖关系,使他们能够手动修改代码以增加并发性。”

这就是困难开始的地方,因为硬件和软件工程师有不同的观点和经验水平。Cadence的Pursley说:“考虑一个复杂的多级图像过滤器。在纯软件中,c++可能是几个函数,每个过滤器阶段一个,通过复制帧或向帧传递指针进行通信。然而,这不是算法,因为它将由优化的硬件执行。通常,硬件会尽量减少存储,尽量避免昂贵的帧缓冲区。相反,为了获得良好的QoR,硬件过滤器将通过行缓冲区传递像素(如果是2D过滤器的话)。”

Silexica的Inkeles说,从硬件实现中获得最佳性能的技巧之一是优化应用程序中的并行性。但这需要对算法的深入了解,以指导HLS工具如何实现并行性。通过使用工具检测设计中的隐式并行性并重构代码以转换它,开发人员可以在硬件上实现算法时最大化算法的性能。

数据存储和移动至关重要。约翰逊说:“我可以拥有大量的计算能力,但我必须有能力拥有支持这种计算的数据。”“这意味着如果我没有足够的带宽进入内存或足够的访问内存,那么我将有一个可以非常高效和快速运行的循环。但如果我被数据访问拖住了,那么我就无法实现那样的表现。”

许多算法都受到内存访问性能的限制。Klein补充道:“瓶颈通常不是计算时间,而是将数据传输到计算单元,这需要花费大部分时间和精力。”“再说一次,这是设计人员的责任,还不是编译器的责任。”

但是对于软件工程师来说还有一个更大的障碍和问题。他说:“高级合成没有全球知名度。”“虽然它在使用它的模块上做得很好,但它不能考虑其他模块中的活动,例如那些不使用高级合成或软件的模块。”

珀斯利说的更具体。HLS本质上是一种不同类型的编译器,所以根据经验,c++必须在编译时完全解析。它明确地强制没有关于块之间定时同步的隐藏假设。例如,你不能有无界malloc(),因为最后,你需要在实际的硅上实现一定物理大小的内存。”

软件工程师不喜欢这种限制。“如果我是一个软件开发人员,我想要的是对一个变量说malloc(),我想要分配内存,我想要指向那个数据,我想要数据返回,”Johnson说。“使用HLS,我必须基于我使用HLS工具所做的事情来构建一个内存结构。这是一件非常复杂和困难的事情,这就是为什么开发一个东西通常需要9或12个月。对于编写软件的人来说,这是一个巨大的负担。他们无法形成一种记忆结构。”

构建解决方案
这就是每个开发团队的解决方案可能存在分歧的地方。“作为一个硬件设计师,你可能想要明确地建模像位宽和进程级并发这样的东西,”Pursley说。在这些应用程序中,您的c++模型应该使用IEEE 1666标准c++类库SystemC。”

硬件工程师的目标是达到最有效的实现。Johnson说:“软件工程师希望使用标准C代码,并能够将x86和FPGA组合作为加速器。”“他们希望以一种自己熟悉的方式来做这件事,而不是那些有硬件背景的人。”

将FPGA作为目标可能会改变这个等式。“如果最终产品的目标是FPGA而不是ASIC,那么高级编译方法可能是可取的,”Biles说。“这不仅适用于快速原型设计。因为它能够基于观察到的应用程序行为快速增强算法,这可以带来更好的实际性能。”

Silexica使软件工程师能够将其C/ c++代码转换为硬件的方法是在执行HLS之前帮助优化应用程序代码。Inkeles说:“通过在HLS阶段之前执行和结合静态、动态和语义代码分析,我们可以指导软件工程师克服对硬件编码的不熟悉——本质上,指导软件工程师使他们的代码可合成,并识别顺序代码中的并行性。”之后,该工具自动在代码中插入pragmas/指令,以指导HLS编译器。在HLS设计流程中添加代码分析工具可以显著减少软件工程师在将软件转换为硬件时所面临的障碍。”

CacheQ正在尝试一种解决方案,使软件工程师能够使用这种技术。Johnson解释道:“我们生成了一个虚拟机。“这是一堆指令,其中的指令就是你所认为的微处理器指令集——条件、布尔函数、算术——我们生成这些指令的连接虚拟机。它们连接的方式就是数据在系统中的流动方式。通过这样做,它允许我们运行性能模拟来确定它能有多快。我们可以通过处理器和FPGA对其进行分析,这种表示方式允许我们自动完整地管道循环。”

关键是查看代码并找到需要加速的主循环,然后确定该循环的补充函数。“我的printf()将在处理器中完成,而不是在FPGA中,”Johnson说。“仅仅有能力在FPGA中获取代码并生成一些东西是不够的。你必须有能力在此基础上进行性能模拟,进行某种类型的分析,以便识别代码中的热点。这就是FPGA的内容。当数据可用时,所有的指令都以一种方式操作。如果所有输入都不可用,则指令将等待。这允许我们在不知道访问内存的返回时间的情况下实现一些事情。此外,能够从同步的角度确定操作何时以适当的顺序发生-虚拟机理解并处理这一点。”

验证
这两个世界的另一个区别出现在验证.没有软件人员会考虑验证编译器的输出,但这是硬件的标准实践。

Breker Verification Systems的副总裁兼首席营销官Dave Kelf说:“常规综合可以依赖于分析静态寄存器之间设计逻辑的形式化等效检查工具。对于不定时的逻辑来说,这要难得多。它可以通过对有限数量的状态转换进行属性检查来解决简单的综合问题。模拟对于严肃的设计是必要的。创建一个模仿DSP功能的基于意图的测试平台,可以为非定时到定时逻辑合成提供严格的解决方案,这是便携式刺激测试套件合成工具的另一个应用。”

正式的可以在这里发挥很大的作用。OneSpin的van Blommestein补充道:“现有技术可以在c++ /SystemC模型和后hls RTL代码之间共享通用的SystemVerilog断言(SVA)。“c++ /SystemC的静态分析工具现在与SystemVerilog RTL的静态分析工具不相上下。这些可以检测到可能危及HLS的问题,包括过大的数据长度、竞态条件和初始化错误。即使设计过程不像人们希望的那样自动化,自动验证也是关键。”

潜在地,这些问题对于针对FPGA的软件来说并不重要,因为如果发现问题,您可以快速应用更新。

足够好
虽然有些人可能认为这是一场政治辩论,但实际上这只是表现和生产力的问题。

“经常有人问我,‘HLS能把软件变成硬件吗?’”珀斯利说。“答案是否定的,或者更准确地说,不是你想要的硬件。”

克莱因用数字表示。“假设你可以做一个‘糟糕的’实现,但通过将其转移到硬件,可以使函数运行速度快100倍。您可能会发现,接口和将数据移动到加速器的开销消耗了大部分收益,因此在系统级别上,您的速度只提高了10倍。但是构建一个“伟大的”实现,一个与手工RTL相当的实现,比糟糕的实现快10倍,或比软件快1000倍。它仍然具有与糟糕的实现相同的开销,所以如果你计算一下,糟糕的实现与出色的实现之间的系统级别差异可能不到1%。”

但是软件团队有不同的观点。Biles说:“我们希望实现这样一种运行时,它可以将工作负载的一部分部署到最合适的执行资源(基于功能、性能和可用性),同时满足开发人员提供的高层次约束。”“预期的行为将通过软件和硬件功能的组合来实现,并能够在需要时进行优化和重新定位。”

约翰逊说,让软件工程师掌握这种技术将极大地扩大潜在市场。“你如何创造出能够支持我们所谈论的各种功能的东西,因为这是人们编写软件的方式?如果你不能做到这一点,那么你就不能扩展,说我支持一个非硬件的用户社区。软件人员不会做大量的数据流分析来弄清楚什么数据去了哪里,如何加载到内存中,确保当我读取时它在那里,因为如果它不在那里,我就会失败,而软件人员写代码分配内存,我得到一个指针,它访问它,在某个时间点它就出现了。内存架构是如何支持这一点的——作为一个软件人员,我不知道。”

结论
软件工程师和硬件工程师仍然处于不同的领域,当涉及到工具时,他们通常有不同的目标。对于硬件工程师来说,效率仍然是驱动因素。对于软件工程师来说,生产力是目标。工具供应商正试图找到满足这两组需求的方法。

克莱因说:“对于许多应用程序来说,即使是糟糕的硬件也比优秀的软件好得多。”“许多设计师低估了软件的实际速度有多慢,以及处理器的效率有多低——尤其是大处理器。超越软件和处理器的能力真的很容易。”

有关的故事
硬件-软件协同设计重现
可能会有第二次合作设计的机会,但同样的障碍也可能成为阻碍。
机器学习驱动高水平合成臂
随着端点架构变得越来越复杂,EDA工具成为试验不同选项的关键工具。
如何集成嵌入式FPGA
在SoC中添加eFPGA比仅仅添加加速器要复杂得多。
高水平综合知识中心
头条新闻,白皮书,HLS的博客。



1评论

西奥多·威尔逊 说:

我不知道这是技术问题还是经济问题。软件开发团队的工作与硬件开发团队的经济现实不同。布莱恩关于效率和生产力的笔记是它的核心。

在硬件加速交付之前,将软件产品带到硬件的有效流程可能必须以可销售的方式改进产品,以满足软件团队每周的需求。

RTL是一种高度限制的编码风格,它降低了硬件项目的风险。当你加入有效的模拟、形式检验、UPF等需求时,它的限制就更多了。将已经发布的软件重构为限制加速的形式,应该会带来更好的测试、架构灵活性和性能,而不是最终的加速。识别和冻结产品中的一些核心部件似乎很关键,这样硬件加速工作就不会因为典型的客户驱动的CI/CD而追逐一个移动的目标。

留下回复


(注:此名称将公开显示)

Baidu