未来已来:C++17 并行STL性能测评

C++17 并行STL使用与测评

目录

  1. 各个编译器支持进度

  2. 并行算法库要求

  3. 如何使用

  4. 性能测试

最近在研究一些并行框架,发现C++17之后STL支持并行,于是使用并做了个性能测评,在测评过程中遇到一些问题,特别是TTB,本文将会带大家扫盲学会STL并行。

注:本文的所有代码已放星球,感兴趣可以拿去学习。

1c26347ca9284d5f070f6b9898883cc2.jpeg


1.各个编译器支持进度

不同编译器对并行算法库的支持,如下:

https://en.cppreference.com/w/cpp/compiler_support/17#C.2B.2B17_library_features

可以看到gcc9之后就支持了,clang目前支持还不完全,自己也本地测了一下确实不支持。

8d16f343ed01fabe3254a7afaba9d989.png

其支持的算法包括:

c8710a27601e0ab1a6c7bdda61849e68.png

https://en.cppreference.com/w/cpp/experimental/parallelism

2.并行算法库要求

gcc9以后便可以使用并行算法库了,我们可以看一下下面的gcc-9文档。

https://gcc.gnu.org/gcc-9/changes.html

其中,提到一个非常重要的信息:需要tbb支持

8d12b07fdcd92c2454394441ba6d0003.png

TBB是由英特尔(Intel)公司开发的一个用于并行编程的 C++ 库。TBB 旨在简化多核处理器上的并行软件开发,提供了一套抽象和模型,使程序员能够更容易地实现并行算法。

1.C++17当中使用并行算法库的前提必须得安装tbb,那如果不安装tbb会怎样呢?

我自己实测就是可以编译与运行,只是没有任何加速,跟原来非并行跑出来的结果是一样的。

2.TBB如何安装呢?

一个是官方的tbb,叫做oneTBB。

https://github.com/oneapi-src/oneTBB

另一个是其他人写的tbb,叫做tbb。

https://github.com/wjakob/tbb

区别在于添加了基于 CMake 的构建系统。

现在官方也是支持cmake ,所以建议去使用官方的吧。

编译也是非常简单:

mkdir build && cmake ..
make -j8
make install

3.如何使用

相比于传统的STL使用又有哪些改变呢?

1.接口层面

其实比较简单,例如 sort原来是:

std::sort(begin, end, comp);

现在变为:

std::sort(exe_policy, begin, end, comp);

只需要添加执行策略(execution policy),有三个选项:

  1. std::execution::seq(顺序执行):

  • 这是默认的执行策略,也就是说,如果你没有明确指定执行策略,算法将使用顺序执行。

  • 算法将按照顺序依次处理元素,不涉及并行处理。

std::execution::par(并行执行):

  • 使用这个执行策略将启用并行执行。算法会尝试以并行的方式处理元素,充分利用多核处理器。

std::execution::par_unseq(并行和向量化执行):

  • 这个执行策略允许算法在并行的同时进行向量化(vectorization),这意味着可以利用 SIMD(Single Instruction, Multiple Data)指令集进行并行向量化操作。

  • 与 std::execution::par 不同,par_unseq 在能够并行处理的同时还允许矢量化处理,从而更充分地利用硬件的并行和向量化能力。

2.头文件层面

必须要引入:

#include <algorithm>
#include <execution>

如果有tbb的操作,可以引入tbb的头文件,例如:设置线程数。

3.编译层面

编译时需要指定链接信息,例如:

g++ -O3 -std=c++17 -Wall -Wextra -pedantic -I/usr/local/include/tbb -L /usr/local/lib/ -o main.out main.cc -ltbb

4.性能测试

最近在做sort相关的工作,想看看merge与sort的性能,所以写了个benchmark,逻辑如下:

  • 串行sort vs 并行sort(par策略)

  • 串行merge vs 并行merge(par策略)

数据范围:

BENCHMARK(BM_ParallelSort)->Arg(16384)->Arg(16384000)->Arg(163840000);

下面的测试结果将采用tbb默认线程调度策略。

对比组1:并行Sort/串行Sort详细数据与加速比

6d122cad728092ed8521a6ca806ac103.png

9965f41a43a7a31683c5184465a99557.png

对比组2:并行Merge/串行Merge详细数据与加速比

62195e56b7262b7fc9ec96a4a92db6f6.png

646630e72c70cdae739de77f9da7673a.png

tbb文档:

https://oneapi-src.github.io/oneTBB/index.html

如果要设置线程数,可以这样操作:

#include <tbb/tbb.h>tbb::task_scheduler_init init(16);

往期回顾:

热度更新,手把手实现工业级线程池

秒杀面试题:深入final,掌握C++性能优化

欢迎加入一起学习~

85ca662ccb9490c4ef92e4ec925f0858.jpeg

462dd43225c87821038c9eee75f3c2cb.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/345148.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python24.1.13for循环

对列表、字典、字符串等进行迭代 range

【AI大模型应用开发】1.1 Prompt Engineering(提示词工程)- 用OpenAI API实战,优化方法论总结

书接上文 【AI大模型应用开发】1.0 Prompt Engineering&#xff08;提示词工程&#xff09;- 典型构成、原则与技巧&#xff0c;代码中加入Prompt&#xff0c;我们开始实战。 文章目录 0. 从最简单的开始0.1 通用代码封装0.2 使用 - 从最简单的Prompt开始0.2.1 temperature参数…

红黑树(RBTree)

目录​​​​​​​ 一、红黑树简介 二、红黑树的来源 三、什么是红黑树 四、红黑树的性质 五、红黑树的节点定义 六、红黑树的操作 6.1、红黑树的查找 6.2、红黑树的插入 七、红黑树的验证 八、红黑树和AVL树的比较 一、红黑树简介 红黑树是一种自平衡的二叉查找树…

Webhook端口中的自定义签名身份认证

概述 如果需要通过 Webhook 端口从交易伙伴处接收数据&#xff0c;但该交易伙伴可能对于安全性有着较高的要求&#xff0c;而不仅仅是用于验证入站 Webhook 要求的基本身份验证用户名/密码&#xff0c;或者用户可能只想在入站 Webhook 消息上增加额外的安全层。 使用 Webhook…

DolphinScheduler伪集群部署

一.伪集群部署 伪集群部署目的是在单台机器部署 DolphinScheduler 服务&#xff0c;该模式下master、worker、api server、logger server都在同一台机器上。单机版本稳定性较差&#xff0c;官方建议20个以下流程使用。 二.前置需求 &#xff11;、&#xff12;.&#xff10;.…

智能小程序小部件(Widget)开发详解

Widget 代表应用的一个小部件&#xff0c;负责小部件的展示和交互。 小部件(Widget) 的开发在智能小程序的基础上增加一个目录即可&#xff0c;用于存放小部件(Widget)的代码。并在 project.tuya.json 中增加一个声明。 创建小部件(Widget)项目 在 Tuya MiniApp Tools 中&…

anaconda创建虚拟环境启动jupyter notebook

1.进入虚拟环境 &#xff08;以环境名为py37_pytorch1.9为例&#xff09; 创建虚拟环境: conda create -n py37_pytorch1.9 python3.7 查看已经创建的虚拟环境&#xff1a; ​​​​​​​conda env list 切换/进入环境&#xff1a; conda activate py37_pytorch1.9 删除环…

【数据集处理】FFHQ如何进行人脸对齐,Aligned and cropped images at 1024×1024

什么是人脸对齐&#xff1f; 人脸对齐是一种图像处理技术&#xff0c;旨在将图像中的人脸部分对齐到一个标准位置或形状。在许多情况下&#xff0c;这通常涉及将眼睛、鼻子和嘴巴等关键点对齐到特定的位置。通过这种方式&#xff0c;所有的人脸图像可以有一个一致的方向和尺寸…

C++进阶--AVL树

AVL树 一、AVL树的概念二、AVL树节点的定义三、AVL树的插入四、AVL树的旋转4.1 左单旋4.2 右单旋4.3 左右双旋4.4 右左双旋 五、AVL树的验证六、AVL树的删除七、AVL树的性能 一、AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退…

哪个牌子的护眼台灯适合学生?2024护眼台灯推荐

不知道各位父母对孩子的视力健康有没有关注&#xff0c;我国儿童青少年的近视率高达52.7%&#xff0c;也就是说&#xff0c;平均是个儿童中就有五个儿童存在视力问题&#xff0c;而且近视发生年龄提前至3到7岁。作为一名眼部护理博主&#xff0c;孩子从小看书、看屏幕起&#x…

Docker与微服务实战(高级篇)- 【上】

Docker与微服务实战&#xff08;高级篇&#xff09;- 【上】 一、Docker复杂安装详说1.1 Mysql主从复制--原理-【尚硅谷Mysql高级篇】1.2 Mysql主从复制--【一主一从】搭建步骤1.2.1新建--【主服务器】--容器实例--33071.2.2.进入/app/mysql-master/conf目录下新建my.cnf1.2.3.…

旅游数据可视化大屏:一屏掌控,畅游数据之海

随着旅游业的蓬勃发展&#xff0c;如何有效地管理和分析旅游数据成为行业关注的焦点。旅游数据可视化大屏作为一种新兴的技术手段&#xff0c;为旅游业带来了前所未有的机遇和挑战。 旅游数据可视化大屏集成了丰富的数据资源&#xff0c;通过直观的图表、图像和交互界面&#x…