EEJournal

专题文章
现在就订阅

多核自动化

发现快乐的媒介

我曾经是一个顽固的手动变速箱的司机。甚至在我开车,我学会了如何为光滑的活跃的双离合器齿轮改变在我们的例子中拖拉机(没有同步齿轮,因为它不是为了转移走)。我祖母坚持手动变速箱直到她停止驾驶80年代(或晚?):“我vant去做自我!”(这是一个德裔口音…)

最后我不得不思考我的原则,当我有一个手机。真理的时刻是当我在红绿灯等待左转而讲电话。光把绿色和我,但我意识到没有足够的手:我需要,改变齿轮,并持有手机,所有在同一时间。

重铸这真正的极客,我只做了很好当涉及到多任务指导和改变齿轮——两个独立的过程,都只需要一只手(但从两个其中一个好处)。我能够共享一个资源,我的右手,转向和更换齿轮的过程。

把手机扔到混合,现在我有一个资源共享的问题。电话(在用)取决于我拿着它到我的耳朵。(如果美国联邦调查局(FBI)或任何其他执法机构中窥探这个谈话,我想国家备案,这是几年前有免提法律。)换档过程依赖于相同的资源,和我现在有争夺资源。

所以…承认这可能有点达到作为一个隐喻,它导致一个问题:在一个更重要的情况下,你怎么知道如何在多核系统中任务和实施的方式不会导致一圈电话被删除或汽车转向到迎面而来的左转车而改变齿轮吗?(穿过整个在1装备太羞辱是一个真正的选择)。

随着多核变得越来越流行在嵌入式世界,这是一个越来越多的相关问题。嵌入式多核,到目前为止,被数据包处理占据第一,有自己的小世界的快和慢路径地手工,现在手机,与多个处理器做不同的事情。

在手机的情况下,它的工作很特别,因为处理器做不同的事情——他们通常不互动,或者,如果他们这样做,是很简单的手动管理。但现在一般多核处理器的手臂和MIPS品种越来越普遍。所以我们不再谈论给单独的处理器独立的进程:我们讨论的是分裂一个大过程分成多个任务——他们可能是线程或进程,让它们在并行工作。

现在,让我们假设一个大过程已经被实现为一个核心。这意味着这是一个顺序(或系列)程序与一切都发生在一个确定的,有序的时尚。一只脚总是在另一只的前面。

称它为离婚

当你开始分裂并行运行起来,有事情,你可以会深陷困境。第一,而不是单个进程请求资源,众多的现在这个过程可能被要求记忆的注意或边缘在同一时间。记忆只有这么多端口。

第二,这些任务都开始在他们的开端。如果一个任务年底发生反映了一个大的过程,然后,如果你不小心,它就开始当一切开始并生成无稽之谈。某种程度上它被告知不能开始,直到它取决于准备的东西。

琐碎的情况是,

一个= x + y

c = a + z

当这些发生在秩序,那么的价值c最后是x + y + z。但如果他们投入并行流程和在同一时间开始,c会的结果吗z添加到…无论发生什么一个当时(它可以是,但很可能不是,等于x + y)。

不幸的是,大多数情况下并不明显。它变得很棘手的指针用于c .演示的简单的例子就可以检测到代码的静态分析。但这并不是指针的情况——你不能确定他们会点什么(除了0,当你崩溃的系统),和指针运算和混叠问题棘手,没有动态分析使用足额的测试套件。

平行时如何划分一个程序有一个巨大的影响产生的并行实现将如何运行。有四种可能的结果:

  • 它完美地;拍拍自己的背,带一些正当的时间。(或醒来。)
  • 它工作,但是非常缓慢——可能比原来的连续版本慢。
  • 它不工作。好消息是,你知道立即可以开始调试。
  • 它似乎工作得很好。直到你船产品然后客户开始发现奇怪的,难以捉摸的缺陷,难以复制,甚至更难调试。这是你的噩梦。(你希望你能醒来。)

在大多数情况下,这个问题已经由专家手工处理的非常专业的编程环境。但没有足够的人来支持多核编程所需的数量。所以自动化来救援。但问题是,自动化什么?

让我们把问题为了包装我们的头(好吧,我的头),现在继续我们的假设,我们开始一个好的顺序程序。我将创建一个并行版本的过程划分为三个主要的块:

  1. 决定在哪里分区计划
  2. 实现分区
  3. 验证和调试

第一步是分析和决策,可能改变你原来的计划。第二个涉及更改原始程序代码转换成并行版本。第三是…嗯,平时坚持不懈和64盎司TweakStar能量饮料。我们要关注前两个。

如何分割资产

放大近在步骤1,它涉及到几个项目,订单可能会有所不同:

  • 分析程序中的依赖关系
  • 修改原来的代码来提供更多的机会并发性
  • 评估不同的分区方式代码
  • 分区映射到内核(不需要在SMP环境中,所有的核心看起来像和实时操作系统处理核心分配)。

有一些哲学上的依赖关系应该如何分析。两种不同的工具旨在帮助在这一过程中体现这两种哲学。

一个是CriticalBlue棱镜。用这个工具,你想先评估确定哪些分区。对于每一个可能性,棱镜可以分析依赖关系和“舞台”不同的线程(我们将使用术语“线程”松散)在一个时间表,这样你可以看到性能是什么样子。特定的核心行为可以建模为一些架构的特性可以包括任何特定的处理器或缓存。

从这个视图中,您可以看到在一个特定的任务可能会延迟,因为它是等待别的提供一些数据。所以您可以运行“如果”分析,看看会发生什么,如果依赖被移除。通过这样做,您可以评估不同的方法提高程序的性能,最终,选择最好的分区方案。它不会告诉你如何改变计划,当然,它也不会为你做改变(不久),但它确实你关注具体的事情解决为了消除瓶颈。

所以在这种情况下,你选择的分区,然后做分区的依赖性分析。CriticalBlue大卫斯图尔特说,你真的需要做这个订单,因为在整个程序依赖关系的数量是巨大的,你真的不关心他们中的大多数。确定分区的第一个你关注的依赖关系。

向量的面料有不同的方法。vfEmbedded工具分析整个项目,开发一个数据库的依赖关系。他们避免依赖杂乱问题通过程序的可视化:他们有图形显示,过滤掉无关的依赖关系,对于一个给定的视图。

尽管这两个工具看起来非常不同,到目前为止,他们类似于他们可以指出你依赖,你可能想要消除你的原始程序。但vfEmbedded方法将依赖分析的分区。的一个好处是工具本身可以推荐分区基于依赖关系和可能加速。

的技巧在于区分不同类型的依赖关系。很可能你会发现超净的休息在你的程序,没有依赖性。无论哪条路你打破东西,你可能要“十字架”或“打破”的依赖。

打破了依赖的概念就像当你重新配置一个建筑或修改衣服。你可能不得不削减通过一些木材或删除一个缝,但然后放回在一起的方式工作。

一些依赖关系——像我们上面看到的简单容易修复:只需同步c计算,等到一个准备好了之后再继续。流数据可以修复与线程之间的适当配置fifo。一些依赖项不能被修复。

所以问题,无论是手动完成或通过一个工具,是找到减少程序的一种方式

  • 没有依赖关系(不太可能),
  • 只有依赖项可以修复(尽可能少),
  • 或不可挽回的依赖性,不重要。

最后两个需要一些解释。当修复可以解决的依赖,你必须添加库调用,实现同步。它的工作添加这些呼声,他们有一些在运行时开销。因此,所有条件都相同的情况下,你想要修复尽可能少的依赖关系。

最后一点是更微妙的。整件事情关于“修复”是确保你不“语义”的计划。换句话说,新的并行版本应该在各方面工作像原始版本。如果你打破依赖没有修理它,通常是一件坏事(通常是很难检测)。但有时并不重要。

例如,如果你有一个程序日志数据到一个文件,那么它将在一个特定的顺序。如果订单很重要,那么,如果一个破碎的依赖性订购日志条目,这是一件坏事。但是如果订单并不重要——如果你想记录的一切,无论订单,那么你已经改变的语义(因为日志顺序改变了)并不重要。

vfEmbedded工具可以描述不同的依赖关系来确定,不能修复。基于这一点,这个工具将推荐分区。通过设计,建议分区将只修理性(或忽略了不可挽回的)依赖关系。这些分区也会免费竞态条件(另一个多核噩梦,我们不会住在这里)。

是否手动完成或借助工具,分区问题必须伴随映射步骤,如果使用,因为不同的核心可能有不同的表现,或一些核心可能会变得不堪重负。因此,有分裂的程序,你将并行块分配给不同的核心。根据结果,你可能会决定去尝试不同的分区。如果你手动映射,那么你可能会交替迭代分配和映射,直到你有一个解决方案。

棱镜和vfEmbedded都使用相对详细的模型选择核心——性能建模为这些“hardware-aware。“Cavium CriticalBlue列出各种ARM内核,飞思卡尔,英特尔x86, MIPS, Netlogic,瑞萨,东芝,一些在Linux下,一些在Android(加上一个裸露的金属和一个V-Kernel)。向量面料列表x86和ARM(独立于操作系统)。都说他们得到了更多的管道。

因此,回顾这些步骤1的第一块,我们有:

  • 分析依赖关系:棱镜和vfEmbedded自动化使用静态和动态分析。另一个公司,目标编译器,也这样,但只使用静态分析,悲观依赖性(换句话说,如果这可能是一个依赖项,它是标记为一个——如果你愿意的话,你可以忽略它)。更多关于目标编译器。
  • 修改原始代码:棱镜和vfEmbedded提供任何自动化。这就是用户更喜欢它。“不要碰我的代码”。
  • 评估分区:有些手工与棱镜,用他们的力量是“假设”的分析能力。vfEmbedded自动化识别法律(首选)分区的过程(虽然没有什么可以阻止你选择别的东西)。
  • 分区映射到内核:这是手动完成的棱镜和vfEmbedded,虽然有图形工具,使这一切变得更简单。这两个工具都支持映射在一个均匀的核心,但不是异构多核。斯图尔特指出,不太可能为一个单一的问题分开在不同的内核。

把它在纸上

一旦你完成这些步骤,你有一个分区(映射)计划,您需要实现。如果你映射代码,然后在系统级工作分配核心代码,这是一个人工任务。你怎么做取决于系统的类型(例如,SMP与AMP)。我只想说,没有自动化。

但是我们仍然在我们的程序需要实现分区。涉及到将代码分解(字面意思),添加线程调用(如果线程)或创建单独的将完整运行程序,例如。但同样重要的是添加的代码同步数据和修复任何破碎的依赖关系。

虽然这是乏味的,勤劳的,容易出错的工作,它是确定的并具有良好边界。它是容易出错的原因是有很多的细节,和缺少其中任何一个会引起问题。

目标编译器自动化这个过程。这来自一个非常不同的心态,因为目标编译器是一家专业制造他们所谓的特定于应用程序的处理器(asip)。这些asip创建一个SoC将通用处理器,它们本质上是辆定制处理器专用于一个特定的函数。因为他们只执行一个程序的一部分,他们必须与主处理器,以便所有依赖项都占了。

在创建ASIP,目标编译器也会自动创建基础设施进行通信,这样一切都到位了。

虽然这可能是可接受的特定上下文的SoC设计加速器,程序员更倾心于这种变化被自动的更一般的情况下简单的顺序程序并行。再次,“别碰我的代码”往往会占上风。这部分是因为人们不相信新工具,但它也是因为程序员希望拥有他们的代码,他们必须能够维护它。机器生成的代码往往不是在这方面做得很好。

vfEmbedded需要一步一个自动化的代码变化:它生成一个“配方”:这是一个循序渐进的指令集的变化需要确保并行程序的语义相同的顺序。

我们可以重新开始吗?

您可能还记得,我初步合格的这个过程假设你从一个好的计划。这些工具可能是理想的并行,发霉的遗留项目,但是如果你从零开始呢?有方法编写程序,从一开始是平行的。但CriticalBlue和向量面料感觉最好写一个新的顺序计划,然后并行化。

这是有两个原因。首先,人们认为顺序,所以就更容易。但更实际,许多程序不同的平台。这表明有一个金色的原始顺序可以根据需要调整。所以我们看过的过程可以应用到新项目以及遗留代码。

所以…绕组,生成并行程序的过程被选择性地自动化。已经自动的分析步骤帮助分区和映射的决定。实际实现,是否改善旧的代码或生成新的程序,是手动(可能由配方)。这里的异常目标编译器,但这是一个系统设计的过程,包括创建一个定制的处理器,所以环境是不同的。

所以进一步…绕组,也有我这样的工具可以在决定在车上使用我的手机,他们明确表示,我需要一个自动变速器为了不发现自己语义改变在人行道上。但是工具没有驾驶我的车。

是的,我想我会好有限的自动化。

注意:有另一家公司叫Compaan也做类似的工作在这个领域,但他们无法得到任何信息在这篇文章之前我去打印。

和…充分披露,我在高管团队向量面料过去…足够长的时间前需要听取了产品的当前状态。

更多信息:

棱镜

目标编译器

vfEmbedded

留下一个回复

有特色的博客
2023年3月24日,
与CadenceCONNECT CFD不到一个月的时间了,现在是时候让你的旅行计划加入我们4月19日在圣克拉拉会议中心为我们最大的CFD事件。作为奖励,CadenceCONNECT CFD共存与CadenceLIVE硅的第一天……
2023年3月23日,
探索人工智能芯片架构,了解人工智能的需求和应用形状的人工智能优化硬件设计在处理器,内存芯片等等。邮局为什么AI需要一个新的芯片架构首先出现在芯片设计的新视野....
2023年3月10日,
证明指南,使项目经理成功接管正在进行的项目和完成工作!…

有特色的视频

第一次CXL 2.0 IP互操作性演示与合规测试

Synopsys对此

老在这个视频中,研发工程师Rehan伊克巴尔,将指导您通过Synopsys对此CXL IP通过合规测试和演示我们的无缝互操作性Teladyne LeCroy Z516做运动。这首开先河的互操作性演示证明Synopsys对此的承诺提供可靠的IP解决方案。

了解更多关于Synopsys对此CXL这里

以注入式教学法亚博里的电子竞技

兆瓦充电器在电动商用车的基础设施
为了推进商业化电动汽车的大规模实施,我们需要考虑效率、可用性、可靠性和寿命的照耀,这些应用程序所需的充电器。注入式教学法在这节课中,马丁·舒尔茨博亚博里的电子竞技士从Littelfuse加入阿米莉亚道尔顿讨论电动商用车的基础设施需求,电隔离扮演的角色,为什么晶体闸流管的未来可能是一个很好的选择电动商用车。
2023年1月17日,
9302的浏览量
Baidu