异构处理器的编程挑战
来源:内容由半导体行业观察(ID:icbank)编译自semiengineering,谢谢。
针对不同的处理器类型优化PPA需要非常不同的方法,现在所有这些方法都包含在相同的设计中。
随着同一体系结构中包含越来越多不同类型的处理元素,编程处理器变得越来越复杂。
虽然系统架构师可能陶醉于可用于改进功率、性能和面积的选项的数量,但编程功能并使其协同工作的挑战正在成为一个主要挑战。它涉及来自不同IP提供者的多种编程工具、模型和方法。
Quadric首席营销官史蒂夫•罗迪(Steve Roddy)表示:“在任何一种边缘推断产品中,无论是Nest摄像头、汽车应用中的摄像头,甚至是笔记本电脑,基本上都会有三种功能软件,主要来自三种不同类型的开发人员——数据科学家、嵌入式CPU开发人员和DSP开发人员。”
根据他们在开发过程中所处的位置,他们的方法可能看起来非常不同。“数据科学家花时间在Python上,在框架的培训上,在数学抽象层面上做事情,”Roddy说。PyTorch是非常高级的,抽象的,解释的,不太关心实现的效率,因为他们只关心数学中的增益函数和模型的准确性等。从中产生的是PyTorch模型、ONNX代码和Python代码,这些代码嵌入在PyTorch模型中。嵌入式开发人员是一种完全不同的人格类型。它们使用更传统的工具集,可能是CPU供应商的工具,或者Arm工具包,或者一些通用的东西,比如用于C/ c++开发的Microsoft Visual Studio。无论它是哪种CPU,你都将获得针对该特定芯片的供应商版本的开发工作室,它将附带预构建的东西,如RTOS代码和驱动程序代码。如果你从一个特定的供应商那里购买一个芯片级的解决方案,它将有DDR的驱动程序,PCI接口,等等。”
例如,考虑iPhone的应用程序编程,它是高度抽象的。他说:“iPhone开发者有一个开发工具包,上面有很多其他软件。”“但在大多数情况下,这是一种根深蒂固的东西。有人在写C代码,有人在拉操作系统,不管是Zephyr还是微软的OS,或者类似的东西。他们生产什么?它们生成C代码,有时根据编译器的质量生成汇编代码。DSP开发人员也是算法开发人员,通常以数学家为导向,并使用MATLAB或Visual Studio等工具。这里创建了三层代码。类似python的数据科学代码、DSP、c++和嵌入式代码。”
Arm客户业务线产品管理总监罗南•诺顿(Ronan Naughton)以Android开发者的视角表示:“典型的软件工程师可能会开发一款可部署到多个平台的移动应用。在这种情况下,他们将寻求最低的维护开销,无缝的可移植性和高性能,这些都可以由无处不在的Arm CPU和支持工具链提供。”
在Android环境中,为CPU编程可以提供最广泛的工具选择。
“例如,”诺顿指出,“一个好的向量化编译器,如LLVM或GCC,可以针对多个CPU和操作系统目标。针对功能特定任务,有丰富的库生态系统,例如针对ML的Arm计算库。或者,开发者可以将指令集架构本身作为目标,例如Arm C语言扩展。”
在这一切之下是一个传统的体系结构,由NPU、DSP和CPU组成,并具有在目标主机CPU上着陆所需的所有步骤。所有或大多数都在使用某种形式的运行时应用程序。
Roddy指出:“如果你正在运行机器学习代码,CPU会积极参与每一次推理,每一次迭代,每一次通过机器学习图来协调整个事情。”
如何对dsp、cpu和npu进行编程取决于应用程序、用例、系统架构和环境。这将决定如何优化代码以实现特定应用程序或使用模型的最佳性能。
“在CPU上,大多数编译器都可以很好地优化代码,但当编程dsp或npu时,特别是并行化代码时,软件工程师必须做很多工作,因为所有编译器都失败了,”弗劳恩霍夫IIS自适应系统工程部高效电子部门负责人Andy Heinig说。这意味着在硬件上进行的并行工作越多,软件工程师必须手工完成的工作就越多。而且大部分工作都需要进行低级编程。”
虽然有一些重叠,但这些不同的处理元素之间也有一些基本的区别。Synopsys产品经理Guy Ben Haim表示:“CPU是一种通用架构,因此支持广泛的用途、操作系统、开发工具、库和许多编程语言,从传统的低级C语言到高级c++、Python、Web应用程序和Java。”DSP应用程序通常运行在优化的实时系统上,因此编程DSP处理器需要使用低级语言(例如汇编语言、C语言)、DSP库和特定的编译器/分析器来实现数据并行、性能调优和代码大小优化。与通用cpu不同,与dsp类似,NPU架构也致力于加速特定任务,在这种情况下加速AI/ML应用程序。”
DSP架构可以并行处理来自多个传感器的数据。传统的CPU或DSP编程依赖于带有一组规则的程序或算法来处理数据,而人工智能从数据中学习,并随着时间的推移提高其性能。
Ben Haim解释说:“人工智能使用PyTorch和TensorFlow等高级框架来创建、训练和部署模型。”“神经网络模型受到人类大脑神经元结构的启发,由一个系统的数学表示组成,该系统可以根据输入数据做出预测或决策。”
还有其他不同之处。除了使用C和c++等高级语言编程外,Cadence Tensilica Vision和AI dsp的产品营销和管理集团总监普林·德赛(Pulin Desai)表示,“dsp和cpu还使用各种库,如math lib、fp lib。dsp也有一个特定的库,用于特定的垂直方向,它们可能正在寻址以执行特殊用途的应用程序。dsp和cpu还可以使用OpenCL和Halide等高级语言,客户可以使用这些语言开发应用程序。”
NPU编程是在使用人工智能训练框架的完全不同的环境中完成的。这些,反过来,在TensorFlow和PyTorch中生成神经网络代码,并使用神经网络编译器为特定硬件进一步编译网络。”
“神经网络不是‘编程’的。“他们受过训练,”新思科技的产品经理戈登·库珀(Gordon Cooper)说。“dsp和cpu是以更传统的方式编程的。代码用C/ c++编写。然后你需要一个IDE和调试器来测试和编辑代码。”
编程模型如何工作
因此,对于cpu和dsp,设计人员将使用C或c++编程,但他们可能会调用特定的库api。“例如,对于视觉,代码可能调用OpenCV API调用,”Desai说。
弗劳恩霍夫的Heinig说,大多数时候,优化代码的工作都是手工完成的。“当涉及到并行使用硬件时,高级编程模型往往会失败。但是,当然,使用具有基本高度优化功能的库是可能的。”
开发人工智能模型是非常不同的。这需要几个步骤。“首先是识别和准备,”新思科技的Ben Haim说。“在确定适合由人工智能解决的问题之后,选择正确的模型并收集将在此过程中使用的数据是很重要的。第二是模型训练。训练模型意味着使用大量的训练数据来优化模型,提高性能并保证准确性。第三是推理。人工智能模型部署在生产环境中,用于根据可用数据快速得出结论、预测和推断。”
还有其他不同之处。大多数dsp都是矢量处理器,其架构针对并行处理数据阵列进行了优化。新思科技高级产品经理Markus Willems表示:“为了有效地使用硬件,需要对数据进行矢量化。当从标量代码开始时,优化编译器可以应用某种程度的自动向量化。然而,对于绝大多数用例来说,要获得最佳结果,程序员需要使用专用的矢量数据类型,以向量化的方式编写代码。”
Willems建议,为了充分利用指令集的全部功能,通常使用内在特性。与普通的汇编代码不同,内在代码将寄存器分配留给编译器,这允许代码重用和可移植性。
此外,对于大多数DSP算法,设计都是从MATLAB开始分析功能性能(即检查算法是否解决了问题)。对于越来越多的DSP,有一个直接的路径将MATLAB算法映射到矢量化的DSP代码,使用MATLAB嵌入式编码器和处理器特定的DSP库。
但是为了充分利用处理器,Heinig说有必要对硬件和软件进行共同优化。否则,你的解决方案可能会失败,因为你可能太晚意识到设计的硬件不太符合问题规范。如果你想并行执行越来越多的操作,这一点尤其正确。”
对于SoC架构师来说,要从目标市场和目标应用开始,因为这将推动硬件和软件架构。
“在可编程性和固定硬件之间做出选择总是一个挑战,”Desai解释道。决策是由成本(SoC的面积)、功耗、性能、上市时间和面向未来的能力驱动的。如果您了解目标应用程序并希望优化功率和面积,那么固定硬件是最好的选择。H.264解码器就是一个例子。神经网络是不断变化的,所以可编程性是必须的,但一些功能是固定功能(硬件加速器,如NPU),一些功能是可编程cpu或dsp的架构是最适合人工智能的。”
划分处理
所有这一切都变得更加复杂,因为不同的设计师/程序员可能负责不同的代码。
德赛说:“我们在讨论推理应用,但我们也在讨论一家系统公司制造一个系统。”“由于SoC是通用的,可能会有人工智能开发人员开发特定的神经网络来解决特定的问题,例如,为麦克风减少噪音的降噪网络,为安全摄像头减少人员检测网络等。该网络需要转换为可以在SoC上运行的代码,因此您将拥有知道如何使用工具将神经网络转换为可以在带有CPU/DSP/NPU的SoC上启动的代码的程序员。然而,如果它是一个实时应用程序,您还需要知道如何使用实时操作系统、处理器级系统软件等的系统软件工程师。此外,如果这是一款消费类设备,可能会有高级软件开发人员负责开发GUI或用户界面。”
对于NPU,有几个考虑因素。“首先,NPU必须被设计为加速人工智能工作负载,”Ben Haim说。“人工智能/神经网络工作负载由深度学习算法组成,这需要在许多层中进行大量的数学和多重矩阵乘法,因此需要并行架构。”
他解释说,一个好的NPU的关键特征之一是能够快速处理数据并完成操作,其性能以TOPS/ mac来衡量。“典型的半导体在功率/性能/面积(成本)之间的权衡也与NPU设计非常相关。对于自动驾驶汽车的使用,NPU的延迟是至关重要的,特别是在决定何时踩下汽车刹车的生死攸关的问题上。这也与功能安全设计考虑有关。设计团队还必须考虑NPU的设计是否符合安全要求。”
程序员要考虑的另一个关键问题是开发和编程工具。
他说:“如果没有合适的软件开发工具,构建一个伟大的NPU是不够的,这些工具将能够轻松地从流行的AI框架中导入NN/AI模型,编译,优化它,并自动利用NPU架构,包括内存设计考虑。”“提供一种检查模型准确性的方法以及仿真工具也很重要,因此程序员可以在硬件存在之前开始软件开发和验证。这是上市时间的一个重要考虑因素。”
库珀表示同意。“npu比DSP,特别是GPU或CPU更接近于定制加速器,这是完全灵活的。您可能不会选择添加NPU,除非您在相当长的时间内对NN性能有强烈的需求。我们有只需要一点点AI的客户,他们使用矢量DSP来实现DSP性能,并在需要时重新配置它来处理AI,以确保其模具空间的最大灵活性。这很好,但在功耗或面积效率方面不如专用NPU。”
最后,当试图确定图形的哪个子集适合NPU,而哪些子集不适合NPU时,编程挑战就出现了。[见上图1左侧]
“如果不能,它就必须在其他地方运行,所以代码必须被分割,”Quadric的Roddy说。“与此同时,还有一个存储在内存中的二级命令流生成器或链表生成器,NPU知道如何获取它的命令。虽然这部分非常简单,但是那些不在系统上运行的部分怎么办呢?这些运营商应该在哪里运营?是否存在一个有效的机器学习操作符实现?如果有,它是在DSP上,还是在CPU上,如果它不存在?总得有人去创造一个新版本。你在DSP上做这些是因为你想要它的高性能。现在你必须在DSP上编写代码,而许多DSP缺乏好的工具,特别是专门为机器学习而构建的工具。通用版本的dsp——音频dsp或基本通用dsp——可能有两个MAC,或四MAC类型的东西。为机器学习构建的dsp将是非常广泛的dsp。超宽的dsp可以成为非常广泛的激活和规范化以及数据科学中发生的事情的良好目标,但它们是新颖的,因此可能没有可靠的编译器。”
结论
在过去,这些编程世界是独立的学科。但随着人工智能计算越来越多地包含在设备中,随着系统变得越来越异构,软件开发人员至少需要更多地了解其他领域正在发生的事情。
最终,这可能成为单一硬件/软件体系结构的驱动程序,它允许工程团队编写和运行复杂的c++代码,而不必在两种或三种类型的处理器之间进行分区。但要实现这一目标,从现在到那时还有很多工作要做。考虑到人工智能和硬件架构的发展速度,目前还不完全清楚,当这种架构准备就绪时,它是否仍然具有相关性。
*免责声明:本文由作者原创。文章内容系作者个人观点,半导体行业观察转载仅为了传达一种不同的观点,不代表半导体行业观察对该观点赞同或支持,如果有任何异议,欢迎联系半导体行业观察。
今天是《半导体行业观察》为您分享的第3430期内容,欢迎关注。
推荐阅读
半导体行业观察
『半导体第一垂直媒体』
实时 专业 原创 深度
识别二维码,回复下方关键词,阅读更多
晶圆|集成电路|设备|汽车芯片|存储|台积电|AI|封装
回复 投稿,看《如何成为“半导体行业观察”的一员 》
回复 搜索,还能轻松找到其他你感兴趣的文章!
微信扫码关注该文公众号作者