[C++翻译]使用C++17并行算法以提高性能这篇文章是一个定期的系列文章的一部分,微软这里的C++产品团队和其他客人回

C++17在标准库中增加了对并行算法的支持,以帮助程序利用并行执行的优势来提高性能。MSVC在15.5中首次为一些算法增加了实验性支持,在15.7中删除了实验性标签。

标准中描述的并行算法的接口并没有确切地说明一个给定的工作负载是如何被并行化的。特别是,该接口旨在以一种适用于异构机器的通用形式来表达并行,允许像SSE、AVX或NEON那样的SIMD并行,像GPU编程模型中的矢量"通道"那样的并行,以及传统的线程并行。

我们的并行算法实现目前完全依赖于库的支持,而不是编译器的特殊支持。这意味着我们的实现将与目前消费我们标准库的任何工具一起工作,而不仅仅是MSVC的编译器。特别是,我们测试了它与Clang/LLVM和支持Intellisense的EDG版本的工作关系。

要使用并行算法库,你可以按照以下步骤进行。

.\debug.exeTestingwith1000000doubles…Serial:Lowest:1349Highest:4.29497e+09Time:310.176500msSerial:Lowest:1349Highest:4.29497e+09Time:304.714800msSerial:Lowest:1349Highest:4.29497e+09Time:310.345800msSerial:Lowest:1349Highest:4.29497e+09Time:303.302200msSerial:Lowest:1349Highest:4.29497e+09Time:290.694300msC:\Users\bion\Desktop>.\release.exeTestingwith1000000doubles…Serial:Lowest:2173Highest:4.29497e+09Time:74.590400msSerial:Lowest:2173Highest:4.29497e+09Time:75.703500msSerial:Lowest:2173Highest:4.29497e+09Time:87.839700msSerial:Lowest:2173Highest:4.29497e+09Time:73.822300msSerial:Lowest:2173Highest:4.29497e+09Time:73.757400ms接下来,我们需要确保我们的排序调用是安全的,可以并行化。如果"元素访问函数"--也就是迭代器操作、谓词以及你要求算法代表你做的其他任何事情都遵循正常的"任意数量的读者或最多一个写者"的数据竞赛规则,那么算法的并行化是安全的。此外,它们必须不抛出异常(或者抛出的异常很少,以至于在它们抛出时终止程序是可以的)。

接下来,选择一个执行策略。目前,该标准包括并行策略,由std::execution::par表示,以及并行无序列策略,由std::execution::par_unseq表示。除了并行策略所暴露的要求外,并行无序策略还要求你的元素访问函数能够容忍比并发的前向进度保证更弱的内容。这意味着它们不加锁或以其他方式执行需要线程并发执行以取得进展的操作。例如,如果一个并行算法在GPU上运行并试图取得一个自旋锁,在自旋锁上旋转的线程可能会阻止GPU上的其他线程执行,这意味着持有自旋锁的线程可能永远不会解锁,从而使程序陷入死锁。你可以在C++标准的[algorithms.parallel.defns]和[algorithms.parallel.exec]部分阅读更多关于具体的要求。如果有疑问,请使用并行策略。在这个例子中,我们使用的是不需要任何锁的内置双倍小于运算符,以及标准库提供的迭代器类型,所以我们可以使用并行的无序策略。

请注意,VisualC++的实现以同样的方式实现了并行和并行不排序策略,所以你不应该期望在我们的实现上使用par_unseq来获得更好的性能,但是有一天可能存在可以使用这种额外自由的实现。

在上面的双打排序例子中,我们现在可以添加

我们建立了并行反向,在我们的测试硬件上它比串行版本慢了1.6倍,即使是大的N值。这并不意味着标准委员会在STL中加入这些算法是错误的;这只是意味着我们的实现所针对的硬件没有看到改进。因此,我们提供了签名,但实际上并没有对那些只是按顺序排列的元素进行交换、复制或移动的算法进行并行化。如果我们得到反馈,有一个并行化会更快的例子,我们将研究这些算法的并行化。受影响的算法是。

copycopy_nfillfill_nmovereversereverse_copyrotaterotate_copyswap_ranges有些算法目前还没有实现,将在未来的版本中完成。我们在VisualStudio201715.8中并行化的算法是。

adjacent_differenceadjacent_findall_ofany_ofcountcount_ifequalexclusive_scanfindfind_endfind_first_offind_iffor_eachfor_each_ninclusive_scanmismatchnone_ofpartitionreduceremoveremove_ifsearchsearch_nsortstable_sorttransformtransform_exclusive_scantransform_inclusive_scantransform_reduceMSVC的并行算法实现的设计目标虽然标准规定了并行算法库的接口,但它根本没有说算法应该如何并行化,甚至没有说算法应该在什么硬件上并行化。一些C++的实现可以通过使用GPU或其他异构计算硬件来实现并行化,如果目标上有的话。对于我们的实现来说,复制并行化是没有意义的,但对于以GPU或类似加速器为目标的实现来说,这确实是有意义的。在我们的实现中,我们重视以下几个方面。

微软之前推出了一个并行化框架ConcRT,它为标准库的部分内容提供了支持。ConcRT允许不同的工作负载透明地使用可用的硬件,并让线程完成彼此的工作,这可以提高整体吞吐量。基本上,每当一个线程在运行ConcRT工作负载时通常会进入睡眠状态,它就会暂停当前正在执行的工作,而运行其他准备运行的工作。这种非阻塞行为减少了上下文切换,可以产生比我们的并行算法实现所使用的Windows线程池更高的整体吞吐量。然而,这也意味着ConcRT工作负载不能与操作系统同步原语,如SRWLOCK、NT事件、semaphores、COM单线程公寓、窗口程序等组成。我们认为,对于标准库中的"默认"实现来说,这是一个不可接受的折衷。

我们关心的是调试性能。那些需要打开优化器才能实用的解决方案并不适合在标准库中使用。如果我在前面的例子程序中添加一个Concurrency::parallel_sort的调用,ConcRT的并行排序在发布时要快一点,但在调试时几乎慢了100倍。

关于线程池代表你(和我们)所做的各种优化的更多信息,请查看PedroTeixeira关于线程池的演讲,以及CreateThreadpoolWork、SubmitThreadpoolWork、WaitForThreadpoolWorkCallbacks和CloseThreadpoolWork函数的官方文档。

如果我们不能想出一个实用的基准,让并行算法在合理的N值下获胜,那么它将不会被并行化。我们认为在N=1'000'000'000时速度是两倍,而在N=100时速度慢3个数量级是不可接受的折衷。如果你想要"不计成本的并行化",有很多其他的实现可以和MSVC一起使用,包括HPX和线程构件。

同样地,C++标准允许并行算法分配内存,并在无法获得内存时抛出std::bad_alloc。在我们的实现中,如果不能获得额外的资源,我们会退回到算法的串行版本。

THE END
1.智能时代的算法优化:提升效率与用户体验的关键复杂度分治法大模算法优化是一个复杂而又充满挑战的领域,但其重要性不言而喻。通过选择合适的数据结构、减少不必要的计算、采用分治法、贪心算法、动态规划和并行计算等技术,我们可以显著提高算法的性能。在未来,随着技术的不断进步,算法优化将继续发挥重要作用,为各个行业带来更高的效率和更好的用户体验。https://www.163.com/dy/article/JEQ1M27M0512BOIV.html
2.算法优化在提升计算效率方面的作用是什么算法优化不仅关注时间效率,还致力于减少内存占用。通过优化数据结构、避免不必要的内存分配和释放,以及利用缓存等技术,可以降低算法的空间复杂度,从而在有限的内存资源下处理更大的数据集。 算法优化的过程中,往往会发现和修复原始算法中的错误或潜在问题,从而提高算法的正确性。正确的算法能够避免产生错误的结果,减少计算https://blog.csdn.net/ly_7956/article/details/139134097
3.GBDT(梯度提升决策树)算法(详细版)腾讯云开发者社区参数v称为学习率,通常学习率会选择较小的值,小于0.1能够提高算法的泛化能力,但是越小的学习率也会增加算法的迭代次数。 六、总结 本文简单介绍的boost提升方法和讲解了Gredient Boost框架和Gredient Boost框架的应用GBDT,并且介绍了提高算法泛化能力的方法,正则化。还有一些内容本文没有提及,比如Gredient Boost中M回归问https://cloud.tencent.com/developer/article/1082482
4.组合优化的算法优化:如何提高算法性能51CTO博客组合优化问题是一类涉及到寻找最佳组合或分配的问题,它们在计算机科学、数学、经济学、工程等领域具有广泛的应用。这类问题通常是NP难题,因此需要使用高效的算法来解决。在这篇文章中,我们将讨论如何通过优化算法来提高组合优化问题的性能。 2.核心概念与联系 https://blog.51cto.com/universsky/9143743
5.机器学习各算法的优缺点!!适用场景:通过迭代训练多个决策树来提高性能,适用于分类和回归任务。 案例:股票市场预测。使用多个梯度提升树来预测股票价格。 6、XGBoost(极端梯度提升)和LightGBM(轻量级梯度提升机) 这些是梯度提升树的高效实现,具有高度可扩展性和性能。 适用场景:高效的梯度提升算法,适用于大规模数据和高维特征。 https://www.360doc.cn/article/50382475_1111478886.html
6.使用Go语言提高图片分辨率的方法与实践Golang// 使用双线性插值算法提高图片分辨率 gocv.Resize(lowResImage, &highResImage, image.Point{},2,2, gocv.InterpolationBilinear) // 保存高分辨率图像 gocv.IMWrite("high_res_image.jpg", highResImage) } 在上述代码中,我们首先使用gocv.IMRead函数读取低分辨率图像。然后,使用gocv.NewMat函数创建高分辨率https://www.jb51.net/jiaoben/3073004km.htm
7.《小猿搜题》的搜索算法如何工作?《小猿搜题》的搜索算法通过高效处理关键词、灵活的匹配策略、优化技术和实时更新维护,实现了在海量题库中快速、准确地为用户找到合适的学习资料。这不仅提高了用户的使用体验,也展示了人工智能技术在教育领域的应用潜力。未来,随着技术的不断发展,我们期待《小猿搜题》的搜索算法能够在更多领域发挥重要作用,助力教育事业https://www.sousou.com/wd/26922.html
8.物流管理的算法有什么1、路径规划算法:用于确定最短路径或最有效路径,如Dijkstra算法、A*算法。 2、库存管理算法:帮助决定最佳库存水平和补货时机,如ABC分析、EOQ模型。 3、分拣优化算法:用于提高分拣效率和减少成本,如最近邻算法、遗传算法。 4、运输调度算法:优化运输路线和车辆调度,如车辆路径问题(VRP)算法。 https://h.chanjet.com/ask/50ea1e041bfdf.html
9.学习编程为什么要学习算法?Worktile社区学习编程是现代社会中非常重要的一项技能,而学习算法作为编程的基础知识更是不可忽视的部分。那么为什么学习编程要学习算法呢?下面将为大家详细解答。 首先,学习算法能够提高编程的效率和质量。算法是解决问题的方法和步骤的描述,它可以帮助程序员解决各种问题,提高编程效率。通过学习和理解各种常见的算法,程序员能够快速地https://worktile.com/kb/ask/2300337.html
10.数据中台的五个关键要素如今,以算法推动业务智能化成为一种趋势,随着这种趋势的发展,算法业务将迎来更高水平的决策自动化,各企业开始高度重视算法的开发和应用。 在未来10年,全球超过一半的大型企业将会用先进的分析和专有的算法提高竞争力。对企业来说,了解算法在组织架构中的价值、制定配套的工作流程体系是非常关键的。 01 了解算法的分类https://maimai.cn/article/detail?fid=1740961222&efid=RSQIkiQ0Gsf3Ppa8xVPmXg
11.老电影和图片变清晰的秘密!分辨率提升400%的AI算法已开源老照片、老电影、动漫等画质可快速提升,分辨率自由调节 产业算法效果可以随着数据质量的提升大幅提高 在网络信号较差时,也能快速查看高清视频或图片 影像传输带宽与存储空间大幅压缩,传输成本也将大大减少图片引用自公开数据集[1][2][3] 让世界变得更清晰的不是魔法,而是一项被称为超分辨率提升的技术(简称「超分https://www.paddlepaddle.org.cn/support/news?action=detail&id=2716
12.头条文章算法推荐新闻提高了内容分发效率,实现了对信息和人的精准与高效匹配,有利于增强用户黏性,为高效实现内容产品的商业变现提供了技术支持。从传统媒体时代到互联网时代,新闻分发变革是媒介技术发展的必然要求。算法推荐新闻以智能推荐工具替代传统物流分发流程,实现自动化发行与营销,有利于增强用户与新闻产品之间的黏性,提升新闻https://card.weibo.com/article/m/show/id/2309404697962310664345
13.AI算法决策能提高员工的程序公平感知吗?客观上,AI算法比人类更能够理解和解释决策的过程,大数据资源为算法提供了众多的模型和架构从而提高决策效率(Schildt,2017)。但是,由于现阶段人们并不能真正地了解机器学习算法是怎样在不断变化的市场环境下学习适应并且自行优化的,算法运作的过程存在着“黑箱”问题,即基于神经网络的深度学习,将抓取的数据细分为数以千万https://www.fx361.com/page/2021/1114/18487673.shtml
14.完胜人类选手后,“冷扑大师”想用人工智能提高肾脏移植效率虽然利用人工智能算法提高了肾脏移植的匹配率,但因为死者捐赠的肾远远不够满足无亲属捐赠的病人需求。一个肾在一方面可以通过链式移植救很多的病人,同时一定会有病人因此无法得到合适的器官移植。这样一来就会出现经典的电车难题:一辆电车脱轨了,一边的轨道上有一群小朋友在玩。如果你是火车司机,你可以选择将火车扳一个https://www.thepaper.cn/newsDetail_forward_1750449