C++开源项目 |
您所在的位置:网站首页 › 逻辑图怎么写字 › C++开源项目 |
点击下方【一起学嵌入式】关注,一起学习,一起成长大家好,今天为大家分享一款基于C++的开源项目 —— CGraph。CGraph 中文名为【色丶图】,是一套无任何第三方依赖的跨平台图流程执行框架。通过 GPipeline (流水线)底层调度,实现了依赖元素依次顺序执行、非依赖元素并发执行的调度功能。做嵌入式应用开发,如果涉及到复杂的业务场景,难免会用到各种算法或者框架,这套并发的图流程执行框架也许会有所帮助。 项目仓库地址如下(复制,在浏览器中打开): https://github.com/ChunelFeng/CGraph 该项目的作者是我的多年好友 ChunelFeng。作者多年坚持贡献开源社区,热爱技术交流,也随时欢迎大家一起共建赋能。近日得知,CGraph 的性能得到了极大的提升,完全可以媲美 taskflow,甚至已经超越。下边让我们看看详细的介绍吧,后文中的“我”为CGraph项目的作者。最近,被微软的chatgpt刷屏,也知道国内有些厂商跟进追随。恰巧,前段时间知乎上,有人问我,CGraph(色丶图)和 taskflow 之间对比,如何选择。这个问题,让我惊讶于居然已经有人,将小破图和行业的标杆产品拿来做对比了。taskflow 是美国犹他大学开源的一款 C++17 编写的通用并行任务编程库,被广泛应用于科学计算、机器学习、网络编程的高性能计算任务中,也被广泛应用于科学研究领域和CAD相关产品的开发过程。nvidia, jetbrain,ros 等国际大厂和组织,都是taskflow的用户。 CGraph从立项之初,就是想做一款简单好用的类taskflow 作品,也一直将taskflow作为模仿和对标的对象。期间,我们也几次和taskflow做过性能对比和竞品分析,结果都是差强人意的。 我还记得,我之前来公司面试的时候,被问到 CGraph 和 taskflow的对比,性能如何。我只能说,功能和用法方面,巴拉巴拉巴拉。性能方面,目前“基本持平”吧。差在自信,懂的都懂,带带弟弟。开始之前,先上源码链接:https://github.com/ChunelFeng/CGraph 性能对比我们来看一下各个指标上具体的性能对比。主要分为 多线程并发处理、长链路串行执行、模拟真实dag使用 这三个部分。多线程并发处理在并发处理层面,我们选用的是 32 节点同时并发执行,循环执行 50w 次, 均开8 线程处理。void test() { GPipelinePtr pipeline = GPipelineFactory::create(); CStatus status; GElementPtr arr[32]; UThreadPoolConfig config; config.default_thread_size_ = 8; // 设定8个线程 config.max_thread_size_ = config.default_thread_size_; config.monitor_enable_ = false; // 关闭扩缩容机制 pipeline->setUniqueThreadPoolConfig(config); for(int i = 0; i 32; i++) { pipeline->registerGElementMyEmptyNode>(&arr[i]); } status += pipeline->init(); /** 其中流程进行计时 **/ for(int t = 0; t 500000; t++) { pipeline->run(); } /*******************/ status += pipeline->destroy(); GPipelineFactory::remove(pipeline); } 长链路串行执行 这里,我们测试的是超长链路的场景下,框架的执行效率和优化程度。 结果是令人振奋的。在串行执行的场景下,CGraph 的性能居然达到了taskflow的近三倍,直接秒杀的节奏。这主要得益于 CGraph 在底层解析dag 结构的时候,采用了 linkable 的优化思路,针对这种情况,将dag可以 linkable的部分,提前退化成一个 list 结构,从而极大的减少了调度层面的耗时。 模拟真实dag使用 最后,我们来模拟的是一个真实的dag使用的例子。形成一个如上的dag结构,大家比较熟悉吧, 在项目过程中,也会经常遇到,对吧。PS:记得在执行值之前,先切换一下动态执行模式。/* 切换动态执行引擎,在dag逻辑较复杂的情况下面, 推荐使用动态执行引擎。 PS:默认是静态执行引擎 */ pipeline->setGEngineType(GEngineType::DYNAMIC); 仅色丶图支持: cpp14或者 cpp11的工程版本(关键) 做整体链路的参数管控(关键) 自定义group逻辑 多dag之间交互 定时器功能 仅taskflow支持: 提供gpu支持(关键) 提供perf功能 比如,你的工程版本是cpp11的,你目前就只能选择色丶图,因为不太现实为了引入框架,给taskflow整个工程做降级,对吧。或者,你经常需要实现一些自定义的组合逻辑,甚至是将这些组合的功能开放到你的上游,那你也只能选色图。如果需要在pipeline中,频繁的用到异构计算的话,taskflow就比较合适了,CGraph在这一块并没有做过多的优化。 其他需要考虑的,就是一些比较主观的因素了。比如,如果你比较喜欢面向对象编程的思路,推荐色图,因为色图中,一切皆对象。如果比较喜欢面向流程,直接写lambda 的话,taskflow 比较适合。 近期,被chatgpt的各种新闻刷屏,并且已经在实际工作中,体会受益。想着面对这波排山倒海的降维打击,我们这波普通的程序员也就像300年前的纺织工人一样,随时可能面临着行业的洗牌和颠覆。 而这又可能才是这个行业正确打开姿势的开端。偶尔用业余时间做的一些小工作,如果能在这无时不在发生的变革中,有一点小小的贡献,而不是随波逐流和听天由命,那自己也会是非常开心的。好了,感谢你阅读我的博客,也希望这篇文章,能够帮助您在 CGraph 和 taskflow 之间做选择的时候,提供一些参考。很高兴能在项目开始的两年之内,在性能测试方面超越taskflow。但接下来还有很长的路要走,很多的东西要学,很多功能要去实现和完善,很多的瓶颈要去克服。期待你的交流、指导和加入。最后更多详细内容介绍,可以访问项目的官方网站(复制,在浏览器中打开):www.chunel.cn 作者写了很多相关的技术文章。觉得文章不错,点击“分享”、“赞”、“在看” 呗! |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |