驯服的并发

设计师要什么制约,避免并行bug ?

受欢迎程度

并发性增加了复杂性的行业缺乏适当的工具,问题已发展到的错误可以潜入设计没有简单和一致的方式来检测他们。

在过去,当芯片在本质上是一个管道,这不是一个问题。事实上,早期的先驱EDA创建了一个合适的语言来描述,包含必要的并发性,存在内部和跨时钟周期。这种语言演变成Verilog。

但当管道的性能可能不再是通过设计或改进设备扩展,唯一的出路是多个管道。“这一切都改变了在2000年代中期,当我们不再有频率缩放和我们不再有能力效率,”克雷格·雪莉说,总裁兼首席执行官Oski技术。“所以当我们仍有晶体管密度扩展,我们不得不从同步主序贯设计并行性。这是并行的时代的开始。”

到那个时候,软件行业是牢牢地固定在一个顺序编程范式和绷带在系统级上创建延长生命的方法。不幸的是,EDA行业本质上是在同一个方向,添加高级编程概念从软件语言而不是创建语言能够忠实地代表了新层次的并发性,被集成到一个芯片上。

时间花在验证增长,因为这将继续增长。“在复杂芯片设计,发现个别案例bug是一个关键的功能验证过程的一部分,”汤姆·安德森说,技术营销顾问OneSpin解决方案。“个别案例的bug,反过来,都是关于并发性。他们发生在特定的组合事件发生在同一时间和触发行为未行使。”

问题是不可能核实所有的潜在问题。补充道:“我们称这些simulation-resistant超级病菌,”雪莉。“这些功能缺陷对模拟因为极端角情况下需要激活和检测。他们是设计师创新并行和并发性的副作用抵消减缓频率扩展后摩尔定律时代。”

其中一些是很难发现的。“性能问题将更频繁地出现在这种类型的设计,“提醒拉塞尔·克莱恩,HLS平台项目负责人导师,西门子业务。“我看到这与频率增加的客户,我的工作。创建这样设计的目的是为了提高吞吐量和性能,但副作用和意想不到的后果导致意想不到的性能问题”。

图1所示。并发中定义的便携式刺激。来源:Accellera系统计划

这一切都是因为没有办法明确定义并发线程之间的通信。当发生意外或隐式通信,麻烦潜伏。

语言和并发性
语言中扮演着至关重要的角色是如何指定。“我们有非常好的硬件设计语言在描述并发性,”克莱恩说。“我没看到太多的缺乏。在软件方面有很多并行编程语言,但软件开发人员继续坚持他们的单线程的编程模型。Anant Agarwal和Tilera公司建立了一个技术上成功的并行实现方法的软件。尽管它交付大约3倍的性能同样的功率比传统的处理器,它从来没有取得商业上的成功。随着比例变得更有挑战性,我们可能会看到软件团队重新考虑这些编程模型,来继续提高系统的性能。”

但在一些细分领域,并发语言已经有所成功。“如果你使用OpenMP或OpenCL表达并行在更高的层面,甚至CUDA-now编译器,确保你没有相干或死锁问题,”弗兰克Schirrmeister解释道,高级集团董事、产品管理和营销节奏。“设计使用也是如此fpga。你如何计划类似Xilinx Zynq ?当他们说话的时候,他们指的是OpenCL,你有能力表达并发性。然后你有一个编译器,确保解析依赖项”。

高级合成(HLS)是中间立场,而不是定义一个合适的语言,该行业走的方向发现潜在的并发性。“足够HLS的范围是有限的,它的工作原理,”Schirrmeister补充道。“重点是我微架构级别中展开循环和如何得到正确的级别的并行性,以满足性能要求。但我没有分享,与软件运行在并行处理器访问块。”

“高级合成工具做一个很好地发现和引进并发性,”克莱恩说。”在这种情况下,它不能提取并发由于算法描述的性质,确定开发人员的依赖,使他们能够手动修改代码来提高并发性。然而,HLS没有全球可见性。它不能考虑活动在其他模块或软件。之间的partitioning-specifically做好硬件和软件,并跨多个cores-one分区软件需要一个全局视图的数据流的系统,包括硬件和软件两个方面。”

这是问题开始的地方。

在系统级并发性
如果没有指定并发性,它必须被发现。“今天,这意味着运行完整的系统,硬件和软件,并监控它,”克莱恩解释道。“当然,一旦你有了完整的系统运行的设计通常不是很多会发生,除非它真的无法满足其需求。这个行业真的需要想出一个办法监控和查看这些交互和依赖关系,在硬件和软件,使开发人员能够更好地理解他们的系统。并在设计周期的早期,可以实现更改时,将影响当前设计。”

尝试了通信明确。“这的日子阿尔贝托Sangiovanni Vincentelli提升communications-based设计,”Schirrmeister说。“沟通是明确的,你就会知道如何实现通信在一个安全的方式,这样就不会有死锁的机会。这也是MCAPI的基础。这个API启用通讯的分离处理。MCAPI的美妙之处在于,你可以预测说这一块需要跟块,这处理需求和处理。所以你通信分开处理。你知道的依赖关系是什么,您可以使用自动化的方式实现优化,永远不会失败。”

今天,硬件和软件的设计本质上分别观察。“系统级并发性在设计不是一个障碍,因为我们提供的知识产权必须工作在不同的系统有不同的时间限制,”副总裁彼得•格林哈尔希说技术和研究员手臂。”,并发控制是可见的在软件层面,建立建筑技术锁定指令(如load-exclusive,商店独家)和原子。数据完整性还使用标准的一致性协议管理和维护,如MOESI IP相干互联等。”

试图使硬件对异步事件是标准的做法。“理想情况下,你想赶在设计过程中尽可能早地依赖,”戴夫Pursley说产品经理HLS节奏。“举个例子,你想避免代价高昂的错误设计几大块的硬件结果发现当放置原位意想不到的时间(延迟)依赖关系引入一个死锁等问题,数据被删除,或内存腐败。这些情况可以避免通过使用latency-insensitive在所有模块的硬件接口。完整的握手保证流经系统处理的数据如预期的那样,没有数据被删除。显式地执行,没有隐藏的假设之间时间同步块。”

这是要付出代价的。“这个非常小的成本或可以忽略不计,添加一个额外的位或两个握手block-to-block接口,“Pursley补充道。“这个设计实践设计IP重用时尤其有用。Latency-insensitive IP接口不会过时。”

但有一个更大的价格支付。许多安全问题和漏洞被利用今天进行隐式通信的直接结果是可能的。相干的直接结果。如果所有通信是显式的,不会有普遍的连贯性的必要性。线程之间共享内存的能力产生漏洞,然后需要更多的硬件来试图阻止它的发生。

调试并发
最终并发将创建一个bug。“这些都是非常困难的调试,因为他们经常涉及软件分布在多个处理器,和事务交互跨多个总线结构,”克莱恩说。“没有很多工具可以显示开发人员所发生的多个核心与总线事务和硬件相关的活动。解决这些问题所需的可见性是很难实现。”

大部分时间它归结为特别的方法。“我们一直依赖于设计师足够聪明来理解整个操作设计他们的头,“说一个典型的设计师。“当你搬到更大、更复杂的设计,你是曲线上升,越来越少的人在团队将能够这样做。在某些时候,你达到一个阈值,没有人能理解它。你怎么发现bug时你必须越过边界的知识?”

克莱恩说,他认为“开发人员使用大量美元显示语句,解析模拟记录,从波形和倾销vcd文件数据库。他们盯着数据,直到一个开发人员,“啊哈”的时刻。这是一个非常特别的方法,但是系统不存在。”

另一种方法是添加性能限制的保障措施。“如果你遇到一个一致性的问题,一种方法是平的东西,回到正确的状态,“提供Schirrmeister。“那将花费你的性能。这些问题都很难找到。他们超出一切,做一个ip级别测试。他们测试组件之间的相互作用。”

有两种方法中,大多数公司试图排除这些问题便携式刺激(PSS)和正式的。”约束求解PSS你通过所有可能的排列,“Schirrmeister说。“这允许你找出是否有任何问题。调试发生在更高的水平。你表达的方式看起来像UML图,然后你看序列图表和这表明你被激活,当什么。这使它更容易调试问题。”

这确实需要一种不同的思考方式验证。“你必须把功能一边和测试系统组件交互,”戴夫Kelf说CMOBreker。“这包括性能和压力测试,系统级一致性,和关键路径。这样做,更复杂的角落案例可以发现bug。随机的系统级交互可以揭示奇怪行为很难设想由工程师集中在功能规范,揭示错误或性能/电力瓶颈。”

做这种类型的验证也可以帮助在更抽象的模型。“精确建模系统的延迟和数据流使用松散或约时间事务级模型(TLM)是一种常见的方法,“Pursley补充道。“这些模型模拟快得多RTL。更重要的是,这些可以更早在开发过程中,常常在RTL设计已经严肃认真地开始。然后,如果TLM模拟中发现意想不到的依赖性,RTL规范可以修改,以适应任何附加依赖项latency-insensitive接口无法避免。”

另一种方法来发现这些问题是正式的。“形式验证尤其有效地发现问题的缺陷,因为它详尽分析了设计、“OneSpin的安德森说。“没有必要担心失踪一个测试用例,会发现bug。此外,正式的分析假设事件和行为可以同时发生,除非另有指定。虽然软件不能直接分析,许多断言和约束指定设计行为反映软件(固件)如何使用硬件。这提供了一个衡量的系统级验证确定用其他方法无法实现的水平。调试以来发生在熟悉的环境中发现的任何缺陷,正式的复制在仿真测试。”

前进
若不采取行动,这一问题将变得更糟,而不是更好。“真正解决并发问题在系统层面上,我们应该因为带来的好处是巨大的,有两件事发生在开发者社区,”克莱恩说。“一个是硬件和软件不能保持独立和不同的学科。第二,软件开发人员需要接受并行编程模型”。

Schirrmeister需要使并发明确补充道。“OpenCL正试图在更高层次的抽象以同样的方式,从通信MCAPI分离处理。如果这些,那么就可以将这个过程自动化。就可以选择两个实现选项,如HW和西南。当我知道所有的输入和输出,谁有能力谈它,我可以看所有的选择从性能的角度而言,避免缺陷。”

当你加入功率方程,它变得更加重要,问题已经解决了。“编程语言有,但适度的采用,”克莱恩总结道。“开发人员的好处是巨大的,在性能和功耗。如果你看看排队的处理器,您会发现最高的MIPS每毫瓦特是最小的核心,不是最大的。如果软件负载分发到多个小你会得到更快的处理器执行较低的功率比单线程程序运行在一个处理器。软件开发人员不会得到扩展,提高了所以他们也许会开始寻求这些方法。”

有关的故事

使用更多的验证核

当虫子逃离

如何处理并发性



2的评论

BillM 说:

布莱恩,
这将是有趣的,如果你使用自动驾驶汽车(终端市场)和文章中列出的问题如何解决。我希望许多并发事件在汽车软件导致许多超级细菌。
比尔

凯文·卡梅隆 说:

我放弃了Accellera和IEEE努力处理并发性和高水平设计前一段时间,特别是在离开RTL(同步FSM),和移动到数据流(异步FSM)方法(很容易做到功能验证)。作为一个替代我想出了一个扩大c++取代Verilog,和一种利用高度并行架构与遗留代码

http://parallel.cc

EDA行业即将发现神经网络工程有很多类似的要求,但AI的家伙要建立新的工具…

留下一个回复


(注意:这个名字会显示公开)

Baidu