0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用静态分析工具构建模型实现多核处理器的高质量软件

星星科技指导员 来源:嵌入式计算设计 作者:Paul Anderson 2022-06-19 07:52 次阅读

对多核处理器进行编程以利用其强大功能意味着编写多线程代码。C 和 C++ 不是为并发而设计的,因此开发人员必须为这些语言使用诸如 pthreads 之类的库。由于全新类别的编程缺陷带来的风险,多线程代码比单线程代码更难正确处理。

在流氓的并发错误库中,竞争条件是臭名昭著的屡犯者。竞争条件发生在程序检查资源属性并假设该属性没有更改的情况下执行操作,即使外部参与者已经介入并更改了该属性。

数据竞争是一种特殊类型的竞争条件,它涉及对多线程程序中内存位置的并发访问。当有两个或多个执行线程访问共享内存位置,至少一个线程正在更改该位置的数据,并且没有明确的协调访问机制时,就会出现此缺陷。如果发生数据竞争,它会使程序处于不一致的状态。

数据竞争的阴险本质

人们普遍认为,一些数据竞争是无害的,可以安全地忽略。不幸的是,这仅在极少数情况下是正确的。最好通过举例说明原因。

单例模式是一种常见的习惯用法,其中程序维护对单个底层对象的引用,如果已初始化,则布尔变量对其进行编码。这种模式也称为延迟初始化。以下代码是该模式的示例:

if (!initialized) {

object = create();

initialized = true;

}

。。. 目的 。。.

这段代码完全适合单线程程序,但它不是线程安全的,因为它在名为initialized的变量上存在数据竞争。如果由两个不同的线程调用,则存在两个线程几乎同时观察到初始化为 false 的风险,并且都将调用create(),从而违反了单例属性。

为了使这个线程安全,自然的方法是用锁保护整个if语句。然而,获取和释放锁的成本可能很高,因此程序员试图通过使用双重检查锁定习惯用法来避免这种成本——在锁范围之外进行检查,在锁范围内进行检查。内部检查用于确认在获得锁后第一个检查仍然有效:

if (!initialized) {

lock();

if (!initialized) {

object = create();

initialized = true;

}

unlock();

}

。。. 目的 。。.

从表面上看,这看起来就足够了,实际上,只要保证语句按该顺序执行就足够了。但是,优化编译器可能会生成实质上切换object = create()和initialized = true顺序的代码。毕竟,这两个语句之间没有明确的依赖关系。在这种情况下,如果第二个线程在分配给initialized之后的任何时间进入此代码,则该线程将在object被初始化之前使用它的值。

优化编译器是不可思议的野兽。那些优化速度的人会考虑许多深奥的考虑,其中很少有对程序员来说是显而易见的。他们通常会生成明显无序的指令,因为这样做可能会导致更少的高速缓存未命中,或者因为需要更少的指令。

假设因为重新排序在前面的示例中引入了竞争条件,所以认为编译器有问题是错误的。编译器正在做它被允许做的事情。语言规范对此非常清楚和明确:允许编译器假设程序中没有数据竞争。

实际上,规范更广泛:允许编译器在存在未定义行为的情况下做任何事情。这有时被开玩笑地称为着火语义;如果程序具有未定义的行为,该规范允许编译器将计算机置于火上。除了数据竞争之外,缓冲区溢出、无效地址的取消引用等许多传统错误也构成了未定义的行为。因为编译器可以自由地做任何事情,而不是烧毁建筑物,他们通常会做明智的事情,即假设未定义的行为永远不会发生并相应地进行优化。

即使对于并发和编译器方面的专家来说,这样做的后果有时也会令人惊讶。很难让程序员相信看起来完全正确的代码可以编译成有严重错误的代码。

另一个例子是值得描述的。假设有两个线程,一个读取共享变量,另一个写入共享变量。让我们假设读者在写入者更改之前或之后看到该值并不重要(这不是一种不常见的模式)。如果这些访问不受锁保护,那么显然存在数据竞争。然而,尽管着火规则,大多数程序员会得出结论,这是完全良性的。

事实证明,至少有两种合理的方式可以编译这段代码,读者会看到错误的值。第一种方法很容易解释:假设该值是一个只能读取 32 位字的架构上的 64 位数量。那么读者和作者都需要两条指令,不幸的交错可能意味着读者看到旧值的前 32 位和新值的后 32 位,当它们组合时可能不是旧值也不是新的。

生成错误代码的第二种方式更为微妙。假设读者做了以下事情,其中​​数据竞争在名为global的变量上:

int local = global; // Take a copy of

// the global

if (local == something) {

。..

}

。.. // Some non-trivial code that does

// not change global or local

if (local == something) {

。..

}

在这里,读者正在制作 racy 变量的本地副本并引用该值两次。可以合理地期望两个地方的值相同,但同样,优化编译器可以生成未满足期望的代码。如果将local分配给一个寄存器,那么它将有一个值用于第一次比较,但如果两个条件之间的代码足够重要,那么该寄存器可能会溢出——换句话说,为了不同的目的而重用。在这种情况下,在第二个条件下,local的值将从全局变量重新加载到寄存器中,此时编写器可能已将其更改为不同的值。

程序员应该非常怀疑某些数据竞争是可以接受的,并且应该努力从他们的代码中找到并删除它们。

发现风险缺陷的技术

在发现并发缺陷时,传统的动态测试技术可能不够用。一个通过一百次测试的程序并不能保证下一次通过,即使是相同的输入和相同的环境。这些错误是否出现对时间非常敏感,线程中的操作交错的顺序本质上是不确定的。

用于发现数据竞争的新动态测试技术正在出现。这些技术通过在应用程序执行时监视它们并观察每个线程持有的锁以及这些线程正在访问的内存位置来工作。如果发现异常,则发出诊断。其他工具有助于诊断可能导致故障的数据竞争。一些公司现在提供工具来促进数据竞争的诊断,从而允许重播导致异常的事件。

静态分析工具也可用于查找数据竞争和其他并发错误。动态测试工具会发现针对具有固定输入集的程序的特定执行出现的缺陷,而静态分析工具会检查所有可能的执行和所有可能的输入。出于性能原因,工具可能会限制进行多少探索,因此可能并不完全详尽;即便如此,它们可以涵盖的范围远远超过动态测试所能实现的范围。静态分析的优点是不需要测试用例,因为程序从未真正执行过。

相反,这些工具通过创建程序模型然后以各种方式探索模型以发现异常来工作。GrammaTech 的 CodeSonar 通过创建表示每个线程持有的锁集的模型并通过执行探索执行路径的程序的符号执行来发现数据竞争。它记录受锁保护的变量集,并使用此信息来查找可能导致共享变量在没有适当同步的情况下使用的交错。类似的技术可用于发现其他并发缺陷,例如死锁和锁管理不善。

一旦发现,数据竞争通常很容易修复,尽管这样做会导致性能损失。在某些情况下,可能会尝试使用 C 中的 volatile 关键字来纠正数据争用,但不建议这样做,因为 volatile 并非旨在解决并发问题,并且在任何情况下都是一个难以理解的构造,经常被错误编译。最新版本的 C 和 C++ 包含并发并支持原子操作。对这些操作的编译器支持正在慢慢出现,在它变得可用之前,最好的方法是使用锁。

为了实现多核处理器的高质量软件,建议对数据竞争采取零容忍政策。使用静态和动态技术的组合来查找它们,并注意不要过度依赖深奥的编译器技术来修复它们。这些缺陷是如此危险和不可预测,因此系统地消除它们是确保它们不会造成伤害的唯一安全方法。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19286

    浏览量

    229842
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73651
  • 编译器
    +关注

    关注

    1

    文章

    1634

    浏览量

    49132
收藏 人收藏

    评论

    相关推荐

    旋智多核处理器助力电机控制应用

    电机控制应用软件通常需要实时处理,以确保精确控制和快速响应。高性能、多核嵌入式处理器能够实时处理多项复杂计算,是保持电机控制系统稳定性和准确
    的头像 发表于 10-24 16:17 481次阅读
    旋智<b class='flag-5'>多核</b>心<b class='flag-5'>处理器</b>助力电机控制应用

    信雅达入选2024年度中国软件高质量发展前百家企业

    近日,中国软件行业协会首次发布《中国软件产业高质量发展报告(2024)》(以下简称“报告”),深入分析了我国软件产业的发展现状、特点与问题,
    的头像 发表于 10-22 11:08 213次阅读

    中国算力大会召开,业界首个算力高质量评估体系发布

    首次完整地构建了人工智能时代高质量算力的理论体系,并探索性提出业界首个 "五位一体"的高质量算力评估体系。 发布现场 在当前由大模型和AIGC驱动的AI时代,算力需求暴增,同时还面临供
    的头像 发表于 09-28 16:50 268次阅读
    中国算力大会召开,业界首个算力<b class='flag-5'>高质量</b>评估体系发布

    知识分享 | 轻松实现优质建模

    知识分享在知识分享栏目中,我们会定期与读者分享来自MES模赛思的基于模型软件开发相关Know-How干货,关注公众号,随时掌握基于模型软件设计的技术知识。轻松
    的头像 发表于 09-12 08:08 404次阅读
    知识分享 | 轻松<b class='flag-5'>实现</b>优质<b class='flag-5'>建模</b>

    DevOps中的质量门工作原理,以及静态代码分析Klocwork和Perforce Helix QAC在质量门中的实践应用

    如何使用静态代码分析工具(如Klocwork 和 Helix QAC)实现质量门。 什么是质量
    的头像 发表于 07-29 15:12 401次阅读

    科技创新!国产自主三坐标测量机推动产业高质量发展

    科技创新推动高质量发展,精密几何测量仪器是核心。中图三坐标测量机采用创新技术,提升测量精度和稳定性,拥有自主可控软件,助力产业升级,实现高质量发展。
    的头像 发表于 07-12 11:32 1250次阅读
    科技创新!国产自主三坐标测量机推动产业<b class='flag-5'>高质量</b>发展

    上位机监控软件如何提高质量

    上位机监控软件在工业自动化和智能制造领域中扮演着举足轻重的角色。它通过实时监控、数据采集、分析处理,帮助企业实现生产过程的优化和自动化。然而,要提高上位机监控
    的头像 发表于 06-07 09:14 380次阅读

    【直播预告】基于ISO 26262实现高质量的MBD过程

    直播时间:2024年6月12号20:00直播平台:视频号、CSDN、B站、抖音下方一键预约直播大纲•基于模型软件开发(MBD)基本原则和优势模型质量是高效MBD的关键设计
    的头像 发表于 06-06 08:25 382次阅读
    【直播预告】基于ISO 26262<b class='flag-5'>实现</b><b class='flag-5'>高质量</b>的MBD过程

    【大语言模型:原理与工程实践】大语言模型的预训练

    和多样性。高质量数据能确保模型稳定收敛,而数据的多样性则有助于模型学习广泛的通用能力,如文本生成、信息抽取、问答和编程等。此外,数据的多样性对于确保模型在实际应用中具有良好的泛化能力至
    发表于 05-07 17:10

    发改委发布《关于新形势下配电网高质量发展的指导意见》,CET中电技术如何助力配电网实现高质量发展?

    为推动新形势下配电网高质量发展,助力构建清洁低碳、安全充裕、经济高效、供需协同、灵活智能的新型电力系统,国家发展改革委、国家能源局发布《关于新形势下配电网高质量发展的指导意见》。指导意见中提到“提高
    的头像 发表于 04-17 08:36 995次阅读
    发改委发布《关于新形势下配电网<b class='flag-5'>高质量</b>发展的指导意见》,CET中电技术如何助力配电网<b class='flag-5'>实现</b><b class='flag-5'>高质量</b>发展?

    北斗芯片产业的高质量发展之路

    高质量发展是全面建设社会主义现代化国家的首要任务”,二十大报告中对高质量发展有着明确的论断和要求。在2023年的全国两会中还指出,加快实现高水平科技自立自强,是推动高质量发展的必由之
    的头像 发表于 03-15 14:03 395次阅读
    北斗芯片产业的<b class='flag-5'>高质量</b>发展之路

    镭雕机:如何利用激光技术实现高质量的产品标记

    镭雕机是一种利用激光技术实现高质量产品标记的设备。它通过激光束在各种不同的物质表面进行精确的打标,可以产生永久性的标记效果,这些标记不仅精美,而且具有高度的精度和清晰度。以下是镭雕机如何利用
    的头像 发表于 03-14 20:10 501次阅读
    镭雕机:如何<b class='flag-5'>利用</b>激光技术<b class='flag-5'>实现</b><b class='flag-5'>高质量</b>的产品标记

    名单公布!【书籍评测活动NO.30】大规模语言模型:从理论到实践

    参数的训练。这一阶段的难点在于如何构建训练数据,以及如何高效地进行分布式训练。 有监督微调阶段利用少量高质量的数据集,其中包含用户输入的提示词和对应的理想输出结果。提示词可以是问题、闲聊对话、任务指令
    发表于 03-11 15:16

    稳中创新•产业升级•高质量发展 | 联诚发高质量发展工作推进会议召开

    推动企业高质量发展。联诚发创始人兼总裁龙平芳、董秘毛强军等公司领导、员工代表出席了本次大会。 会上,董秘毛强军首先提到,在当今竞争激烈的市场环境中,公司的高质量发展是企业追求的最终目标。为了实现这一目标,各板块和各岗
    的头像 发表于 02-22 11:33 471次阅读
    稳中创新•产业升级•<b class='flag-5'>高质量</b>发展 | 联诚发<b class='flag-5'>高质量</b>发展工作推进会议召开

    商汤科技与库醇科技达成合作 为垂域大模型构建高质量大规模的领域微调数据

    数字化转型,为垂域大模型构建高质量大规模的领域微调数据。   本次合作将基于商汤通用大模型进行二次开发,给模型注入领域知识, 训练一个专门根
    的头像 发表于 01-10 09:46 712次阅读
    商汤科技与库醇科技达成合作 为垂域大<b class='flag-5'>模型</b><b class='flag-5'>构建</b><b class='flag-5'>高质量</b>大规模的领域微调数据