C++17中引入STL算法执行策略

news2025/1/15 21:07:38

      C++算法是一组预定义函数,可以对容器(例如数组、向量和列表)执行各种操作。这些算法具有定义的执行策略(have a defined execution policy),决定它们如何执行以及如何与底层硬件交互。STL算法执行策略首先在C++17标准中引入
      C++17标准引入了三种新的执行策略:实例(instance)用于指定并行算法的执行策略
      1.std::execution::sequenced_policy:实例std::execution::seq
      该策略指定算法应按顺序执行,即没有并行化。当不指定执行策略时,算法将按顺序执行。使用这个选项和使用不接受执行策略参数的非并行化版本的效果类似。提供这个策略的目的是让你可以只修改一个参数来要求顺序执行,而不是换用一个签名不同的函数来做到这一点。
      (1).优点:简单且可预测;避免数据竞争;适合小型任务,因为不存在并行开销
      (2).缺点:对于大型任务效率不高
      2.std::execution::parallel_policy:实例std::execution::par
      该策略指定算法应并行执行,即使用多个线程。该标准没有指定应使用的线程数,但应该不止一个(你不能控制使用多少个线程)。
      (1).优点:更快地执行更大的任务;多核系统的最佳使用
      (2).缺点:可能会引入开销;由于这种开销,可能并不总是比顺序执行更快;可以引入竞争条件
      3.std::execution::parallel_unsequenced_policy:实例std::execution::par_unseq
      该策略指定算法应并行执行,并可能产生不确定的结果,即不保证处理元素的顺序。这些执行策略是使用硬件和软件机制(例如线程和SIMD指令)的组合来实现的,以优化算法的性能。
      (1).优点:更快地执行重复操作;可以在带有矢量指令(vector instructions)的硬件上使用
      (2).缺点:并不适合所有任务;可能并非所有硬件都支持

      使用并行算法是很简单的:
      (1).包含头文件<execution>
      (2).像通常调用算法一样进行调用,只不过需要添加一个第一个参数std::execution::par或std::execution::par_unseq,这样我们就可以要求算法在并行模式下运行

      适合使用并行算法的场景应该是:对每个元素的处理需要消耗很多的时间并且处理过程需要独立于其他元素的处理。

      支持执行策略的C++算法的列表:https://www.geeksforgeeks.org/execution-policy-of-stl-algorithms-in-modern-cpp/

      注意
      (1).并非所有算法都支持所有执行策略,并且某些算法根据所使用的执行策略可能具有不同的性能特征
      (2).这些策略的可用性可能会根据所使用的C++标准的实现和版本而有所不同
      (3).所有的并行算法要求迭代器至少是前向迭代器
      (4).并行算法实际运行的方式是实现特定的。当然,使用多线程不一定能加快速度,因为启动和控制多线程也会消耗时间
      (5).当处理元素的函数因为未捕获的异常而退出时所有的并行算法会调用std::terminate()
      (6).并行算法本身也可能抛出异常。如果它们申请并行执行所需的临时内存资源时失败了,可能会抛出std::bad_alloc异常。然而,不会有别的异常被抛出

      以下为测试代码:

namespace {

template<typename T>
inline void print(const std::vector<T>& vec)
{
	std::cout << "result: ";
	for (const auto& i : vec) {
		std::cout << i << " ";
	}
	std::cout << "\n";
}

} // namespace

int test_parallel_stl()
{
	// 1.std::execution::sequenced_policy
	std::vector<int> vec1 = { 5, 2, 3, 1, 4 };
	std::sort(std::execution::seq, vec1.begin(), vec1.end());
	print(vec1); // result: 1 2 3 4 5

	// 2.std::execution::parallel_policy
	std::vector<int> vec2(5);
	std::transform(std::execution::par, vec1.begin(), vec1.end(), vec2.begin(), [](int x) { return x * x; });
	print(vec2); // result: 1 4 9 16 25

	// 3.std::execution::parallel_unsequenced_policy
	std::vector<int> vec3(5);
	std::transform(std::execution::par_unseq, vec1.begin(), vec1.end(), vec3.begin(), [](int x) { return x * x; });
	print(vec3); // result: 1 4 9 16 25

	return 0;
}

      执行结果如下图所示:

      GitHub:https://github.com/fengbingchun/Messy_Test

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

07 数据结构之图

# Makefile CCgcc CFLAGS -g -Wall SRCStest.c graph.c link_queue.c OBJS$(SRCS:.c.o) #variable replace APPtestall:$(OBJS) #指定一个目标&#xff0c; 不然默认目标不会检查依赖文件的时间戳$(CC) $(SRCS) -o $(APP) .PH…

Docker安装Prometheus监控

环境初始化 关闭防火墙 setenforce 0 vim /etc/selinux/config ##################内部代码################### SELINUXdisabled #关闭防火墙 ############################################ 安装docker #卸载yum源之前的docker安装包 sudo yum remove docker docker-clie…

如果你准备进入安全行业,入门应该做的

教育阶段 网络安全是一门高级学科。网络安全人员通常来自三个领域&#xff1a;系统管理、网络、开发。 假设你没有任何这些方面的背景&#xff0c;并且你需要从零开始。如果你在学生阶段的年龄&#xff1f; 这时有三种方法可选&#xff1a;大学、职业学校、资质证书 建议读计…

意大利数据监管机构对Sora展开调查

意大利数据保护监管机构 Garante3月8日宣布&#xff0c;将对 OpenAI 新推出的视频人工智能模型 Sora 展开隐私调查。 监管机构虽然没有对 OpenAI 提出任何具体指控&#xff0c;但表示正在研究 Sora 对意大利&#xff08;包括欧盟&#xff09;个人数据使用可能产生的潜在影响&am…

OceanBase中binlog service 功能的试用

OBLogProxy简介 OBLogProxy即OceanBase的增量日志代理服务&#xff0c;它可与OceanBase建立连接并读取增量日志&#xff0c;从而为下游服务提供了变更数据捕获&#xff08;CDC&#xff09;的功能。 关于OBLogProxy的详尽介绍与具体的安装指引&#xff0c;您可以参考这篇官方OB…

【C++那些事儿】深入理解C++类与对象:从概念到实践(下)| 再谈构造函数(初始化列表)| explicit关键字 | static成员 | 友元

&#x1f4f7; 江池俊&#xff1a;个人主页 &#x1f525; 个人专栏&#xff1a;✅C那些事儿 ✅Linux技术宝典 &#x1f305; 此去关山万里&#xff0c;定不负云起之望 文章目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit 关键字 2. static成员2.1 概念…

unicloud delete 删除

delete 删除 unicloud 删除大概分为两种 一种是 通过指定文档ID删除 语法如下 collection.doc(_id).remove()还有一种是条件查找文档然后直接批量删除 语法如下 collection.where().remove()反正总归是先查找到指定数据,然后使用remove()函数删除 示例如下 collection.doc(…

软件应用实例,宠物医院处方笺模板实例,佳易王兽医电子处方开单管理系统软件操作教程

软件应用实例&#xff0c;宠物医院处方笺模板实例&#xff0c;佳易王兽医电子处方开单管理系统软件操作教程 一、前言 以下软件程序操作教程以佳易王兽医电子处方软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、兽医宠物店开电子处…

初识C++类和对象(1)

1.定义类 我们使用class进行表示类&#xff0c;class后面的是类名rect&#xff0c;在类里面我们可以定义成员变量&#xff0c;这个题目我们是要去求长方形的周长和面积&#xff0c;我们定义长方形的长&#xff0c;和长方形的宽度&#xff1b; 我们定义了2个函数计算长方形的周…

电视盒子什么品牌好?测评工作室揭晓电视盒子品牌排行榜

电视盒子是日常生活中最常见的&#xff0c;它有着不可取代的重要地位。每年我们会进行电视盒子的深度测评&#xff0c;最近我们的测评主题是电视盒子什么品牌好&#xff0c;购入了十几个电视盒子品牌旗下的产品&#xff0c;通过对比后总结了电视盒子品牌排行榜&#xff0c;想买…

金融需要多样性,量化需要C++!通过本文,你可以知道:1、为什么是C++

通过本文&#xff0c;你可以知道&#xff1a; 1、为什么是C 2、Python的用武之地 3、量化C岗位薪酬水平 C VS Python 量化交易系统开发语言主要用C&#xff0c;也有人用Python。 但是从经验看&#xff0c;用C开发的量化交易系统能够让在系统中程序运行的速度更快。 量化交易…

详细理解Transformer

上一篇文章中&#xff0c;我们解读了Transformer中的Self-Attention的实现细节&#xff0c;这篇文章中&#xff0c;就Transformer的整体做一个算法解读。 首先&#xff0c;我们还是把Transformer的架构图贴出来&#xff0c;作为本篇内容的抓手。 从图中我们可以看到&#xff0…

迷茫了!去大厂还是创业?

大家好&#xff0c;我是麦叔&#xff0c;最近我创建了一个 学习圈子 有球友在 星球 里提问。 大厂的layout岗位和小厂的硬件工程师岗位&#xff0c;该如何选择&#xff1f; 这个问题我曾经也纠结过&#xff0c;不过现在的我&#xff0c;I am awake&#xff01; 肯定是有大点大。…

2023 年安徽省职业院校技能大赛(高职组)

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企业根据自身业务需求&#…

2024长三角快递物流供应链与技术装备展览会(杭州站)

2024.7.8-10 杭州国际博览中心 科技创新&#xff0c;数字赋能 同期举办&#xff1a;数字物流技术展 新能源商用车及物流车展 电商物流包装展 冷链物流展 指导单位 国家邮政局发展研究中心浙江省邮政管理局中国快递协会 承办单位 上海信世展览服务有限公司 主办单位 浙江…

使用 pg_profile 在 Postgres 中生成性能分析报告

前言&#xff1a; postgres数据库中拥有大量的辅助插件用于帮助DBA更好的分析数据库性能或整个集群&#xff0c;包括索引、I/O、CPU和内存等&#xff0c;pg_profile是基于PostgreSQL标准统计信息视图的诊断工具&#xff0c;它类似于Oracle AWR架构&#xff0c;和Oracle一样&am…

MFC 添加MFC类方法

1、打开工程目录的"类视图" 2、工程名右键添加"MFC类" 3、填写"类名"并选择“基类”CDialog&#xff0c;对话框ID填写添加好的对话框ID

2024(1),Android高分面试指南

以前&#xff0c;见到过挺多这样的新闻&#xff0c;某些学霸&#xff0c;成绩稍微有点下滑之类的&#xff0c;就受不了&#xff0c;做出一些过激的行为。如自杀等。这是非常懦弱的表现。究其背后&#xff0c;这是因为他们把自己蹦的太紧了。就像气球&#xff0c;你憋着一直吹气…

【PyTorch][chapter 22][李宏毅深度学习]【无监督学习][ WGAN]【理论二】

前言&#xff1a; 本篇主要参考《Wasserstein GAN and the Kantorovich-Rubinstein Duality》 重点介绍一下 WGAN 的损失函数 是如何通过 Wasserstein Distance 变换过来的。 分为5步&#xff1a; 我们首先建立Wasserstein Distance 极小值形式&#xff0c; 经过对…

QGIS 开发之旅二《构建插件工程》

上一篇文章写了二次开发环境的构建&#xff0c;这一章我们从零开始构建插件工程&#xff0c;并理解下QIGIS 如何识别插件程序的。 1、创建QGIS 工程 新建项目&#xff0c;选择下面的空工程 工程创建成功后&#xff0c;是下面的样子&#xff0c;没有任何文件 2、配置QGIS工程 …