处理器/DSP
在指令集和微结构方面,专用处理器用的技术基本上都是在通用处理器发展过程中探索过的东西。要说专用处理器设计最为特殊的地方,我个人认为应该是设计方法(方法学)和工具。专用处理器设计成功与否完全由目标应用来检验,而应用的多样性也决定了专用处理器的多样性。这种多样性不仅反映在软硬件设计本身,也反映在设计方法和工具上。
之前我们已经看到过上面这幅图了。应该说这里展示的domain-specific computing的概念既包括了专用处理器(图中的ASP,Application Specific Processor)设计和也包括了相应的工具开发。下面我们就结合这副图,把DNN作为一个domain,讨论一下专用处理器的设计方法和各种工具。
Domain Modeling
首先是对特定领域(domain,比我们说的目标应用的概念要更广泛一下)进行建模,把需求模型化和量化,作为后续工作的评价标准。建模可能会使用特殊的语言扩展或者数据流图的形式,比如在DNN领域经常使用的Tensorflow就是典型的例子。
Domain Model是后续开发的基础,据此可以得到两个重要的中间描述:一个是用于硬件架构设计的Domain Characteristics;另一个是用于生成C/C++应用代码(当然也可能是其它语言)的Application Model。这里的具体名称并不太重要,重要的是一个domain model需要经过处理,分离出指导硬件设计和生成应用软件代码的两部分信息。
HW Architecture design和Architecture Model
硬件架构设计的主要工作是设计专用的计算引擎(Customized Computing Engine)和互连机制(Customized Interconnection)。比如在CNN加速器中比较常见的由PE(Processing Engine)组成的2D mesh网络,PE就是专用的计算引擎,2D网络就是适应CNN 2D卷积特征的互连机制。
硬件架构设计还要输出一个架构模型。而这个硬件架构模型也是整个设计方法中重要的一环。一方面,这个架构模型可以生成虚拟原型系统(Virtual Prototyping);另一方面,它也是程序代码映射工具(Source-to-source mapper)的输入,而代码映射功能用于将一些特殊的模型转换为C/C++这类传统的编程语言(这类语言有很好的工具进行处理),同时输出Analysis Annotations,用于指导硬件设计和软件工具链的前端设计。
虚拟原型(Virtual Prototyping)
我们通常说的Prototyping一般指基于FPGA或者测试芯片(testchip)系统原型,即用于验证硬件设计,又可以debug固件,操作系统和应用程序。但是开发硬件原型系统本身也是一项费时的工作,并且要等等所有硬件设计完成了才能实现。虚拟原型则是个纯软件的仿真器。最常见的方式是使用SystemC这样语言(抽象层次更高)来对硬件进行建模,而不是直接使用RTL级的硬件模型。建模的抽象层次提高虽然会损失一些细节,但好处是开发便捷(C++编程),仿真速度快。和硬件的原型系统相比,虚拟原型可以在项目开始阶段就开发完成,提供给软件开发人员,而不需要等到硬件准备好。最后,虚拟原型是纯软件仿真,很容易debug,也很容易部署。虚拟原型是个有趣的话题,以后有机会可以专门讲一下。
计算引擎硬件实现
这里把计算引擎分为三种:专用处理器(ASP),硬件加速器(HW Accelerators)和可编程阵列(Programing fabric)。前两种我们都介绍过,第三种的硬件结果类似于FPGA,差别是这里的逻辑电路阵列也是根据应用定制的。实现这三类计算引擎可以靠工程师完成,也可以借助专门的工具,比如,High-level Synthesizer(高层次综合工具,也有叫行为级综合的)可以把C,systemC甚至Matlab代码(当然有一定的约束)自动综合成硬件设计(RTL代码)。也有一些工具可以根据特殊的处理器描述语言,如Synopsys的LISA,NML和RISC-V处理器用的Bluespec等,自动生成RTL代码。这其实也是ESL(Electronic System Level)级设计考虑的问题,有兴趣的读者可以自己深入研究。
这里插一句,自动生成RTL代码看起来高大上,实际也没那么难。记得10年前在SiliconHive(也是一个做专用处理器和工具的公司,后来被Intel收购了)实习做NoC的时候,RTL代码就是从XML描述里自动生成的。其实就是大家平时形成的好习惯:RTL代码尽量用脚本生成,积累起来也就成了自己的自动化工具。
这之后的工作主要就是将计算引擎和互连机制集成在一起,并且实现硬件的原型系统。互连机制的设计也有很多内容,这里就暂不深入了。
软件开发工具链
图的右半部分就是软件开发的工具链,这个和我们传统上说的工具链基本是类似的,即从C/C++的源代码,经过一系列的工具,生成运行在最终硬件上的机器代码(可以有很多形式)。工具链主要包括,前端(front end)后端(back end)和runtime。这里和通用CPU的工具链的主要差别在于back end和runtime,因为这两部分和硬件架构(指令集和微结构)关系密切。对应专用处理器的硬件,主要体现在customized和adaptive这种特征。
不过这里还有一些辅助性的工具,比较典型的比如debuger,就不细说了。
总 结
1. 专用处理器虽然特殊,但设计方法和工具是有普遍性的,这也是研究方法学的价值所在。2. 设计方法往大说是方法学,但在实际的工程中体现为任务,流程和工具,设计专用处理器的过程也是优化方法学的过程。3. 专用处理器设计面向应用,往往有比较高的Time to Market要求,因此从架构探索到RTL生成到原型验证,都要尽量利用自动化工具提高设计的效率,自己设计小工具并且不断积累是很好的实践;4. 采用专用处理器的系统往往是软硬件紧密协同的系统,设计方法上最重要的理念是软硬件的联合优化:在设计硬件的时候充分利用对应用软件的分析;而在设计软件工具链的时候也要充分结合硬件架构的特点;Architecture Model和Analysis Annotations就是软硬件设计和工具间的桥梁。
全部0条评论
快来发表一下你的评论吧 !