windows C++-并行编程-并行算法(四)- 并行排序

并行模式库 (PPL) 提供了对数据集合并行地执行工作的算法。这些算法类似于 C++ 标准库提供的算法。并行算法由并发运行时中的现有功能组成。

PPL 提供三种排序算法:concurrency::parallel_sort、concurrency::parallel_buffered_sort 和 concurrency::parallel_radixsort。 当您具有可受益于并行排序的数据集时,这些排序算法很有用。 具体而言,当您具有大型数据集时或使用需要消耗大量计算资源的比较操作对数据进行排序时,并行排序很有用。 每种算法都会就地对元素排序。

parallel_sort 和 parallel_buffered_sort 算法都是基于比较的算法。 即,它们按值来比较元素。 parallel_sort 算法没有其他内存要求,适用于通用排序。 parallel_buffered_sort 算法的性能好于 parallel_sort,但是它需要 O(N) 空间。

parallel_radixsort 算法是基于哈希的。 即,它使用整数键来对元素排序。 通过使用键,此算法可以直接计算元素的目标,而不是使用比较。 与 parallel_buffered_sort 类似,此算法需要 O(N) 空间。

下表总结了三种并行排序算法的重要属性。

下图用图形更形象地说明了三种并行排序算法的重要属性。

这些并行排序算法支持移动语义。 可以定义一个移动赋值运算符,以使交换操作的出现更有效。 有关移动语义和移动赋值运算符的详细信息,请参阅 Rvalue 引用声明符:&& 和移动构造函数和移动赋值运算符 (C++)。 如果您不提供移动赋值运算符或交换函数,排序算法将使用复制构造函数。

下面的基本示例演示如何使用 parallel_sort 对 vector 值的 int 进行排序。 默认情况下,parallel_sort 使用 std::less 来比较值。

// basic-parallel-sort.cpp
// compile with: /EHsc
#include <ppl.h>
#include <random>
#include <iostream>using namespace concurrency;
using namespace std;int wmain()
{// Create and sort a large vector of random values.vector<int> values(25000000);generate(begin(values), end(values), mt19937(42));parallel_sort(begin(values), end(values));// Print a few values.wcout << "V(0)        = " << values[0] << endl;wcout << "V(12500000) = " << values[12500000] << endl;wcout << "V(24999999) = " << values[24999999] << endl;
} 
/* Output:V(0)        = -2147483129V(12500000) = -427327V(24999999) = 2147483311
*/

 此示例演示如何为 parallel_radixsort 算法提供哈希函数。 此示例对三维点排序。 根据这些点与参考点的距离对它们进行排序。

// parallel-sort-points.cpp
// compile with: /EHsc
#include <ppl.h>
#include <random>
#include <iostream>using namespace concurrency;
using namespace std;// Defines a 3-D point.
struct Point
{int X;int Y;int Z;
};// Computes the Euclidean distance between two points.
size_t euclidean_distance(const Point& p1, const Point& p2)
{int dx = p1.X - p2.X;int dy = p1.Y - p2.Y;int dz = p1.Z - p2.Z;return static_cast<size_t>(sqrt((dx*dx) + (dy*dy) + (dz*dz)));
}int wmain()
{// The central point of reference.const Point center = { 3, 2, 7 };// Create a few random Point values.vector<Point> values(7);mt19937 random(42);generate(begin(values), end(values), [&random] {Point p = { random()%10, random()%10, random()%10 };return p;});// Print the values before sorting them.wcout << "Before sorting:" << endl;for_each(begin(values), end(values), [center](const Point& p) {wcout << L'(' << p.X << L"," << p.Y << L"," << p.Z << L") D = " << euclidean_distance(p, center) << endl;});wcout << endl;// Sort the values based on their distances from the reference point.parallel_radixsort(begin(values), end(values), [center](const Point& p) -> size_t {return euclidean_distance(p, center);});// Print the values after sorting them.wcout << "After sorting:" << endl;for_each(begin(values), end(values), [center](const Point& p) {wcout << L'(' << p.X << L"," << p.Y << L"," << p.Z << L") D = " << euclidean_distance(p, center) << endl;});wcout << endl;
} 
/* Output:Before sorting:(2,7,6) D = 5(4,6,5) D = 4(0,4,0) D = 7(3,8,4) D = 6(0,4,1) D = 7(2,5,5) D = 3(7,6,9) D = 6After sorting:(2,5,5) D = 3(4,6,5) D = 4(2,7,6) D = 5(3,8,4) D = 6(7,6,9) D = 6(0,4,0) D = 7(0,4,1) D = 7
*/

为了便于演示,本示例使用相对较小的数据集。 您可以增大向量的初始范围,体验较大数据集中性能的提升。

此示例使用 lambda 表达式作为哈希函数。 还可以使用 std::hash 类的一个内置实现,或者定义自己的专用化。 如本示例所示,您还可以使用自定义哈希函数对象:

// Functor class for computing the distance between points.
class hash_distance
{
public:hash_distance(const Point& reference): m_reference(reference){}size_t operator()(const Point& pt) const {return euclidean_distance(pt, m_reference);}private:Point m_reference;
};// Use hash_distance to compute the distance between points.
parallel_radixsort(begin(values), end(values), hash_distance(center));

哈希函数必须返回整型类型(std::is_integral::value 必须为 true)。 此整型必须可转换为类型 size_t。

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

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

相关文章

VS Code 配置 Rust-Analyzer 报错

报错信息&#xff1a; Bootstrap Error" rust-analyzer requires glibc > 2.28 in latest build. 参考了好多地方&#xff0c; https://github.com/rust-lang/rust-analyzer/issues/11558 https://blog.csdn.net/aLingYun/article/details/120923694 https://rust-anal…

Fair Graph RepresentationLearning via Diverse Mixture-of-Experts

发表于&#xff1a;WWW23 推荐指数&#xff1a; #paper/⭐⭐ 问题背景&#xff1a; 背景 现实世界的数据很多样&#xff0c;阻止GNN学习公平的表示。当去偏见化后&#xff0c;他们面临着可学知识不足且属性有限的重大问题 解决方法&#xff1a; 应对公平训练导致可学习知识…

TC3xx系列芯片--PortDio模块介绍

1、模块介绍 Port(端口)是芯片与板上其他外设或逻辑电路交互的重要引脚&#xff0c;用于芯片发出控制信号或接收外部信号。通过GPIO模式或各类通讯模式&#xff0c;对板载设备进行控制。 Aurix TC3xx系列芯片具有丰富的Port连接&#xff0c;而且每个Pin脚具有多种功能复用&am…

搜索软件 Everything 的安装与使用教程

一、Everything简介 适用于 Windows 的免费搜索工具 Everything 是 Windows 的即时搜索引擎。发现、整理并轻松访问文件和文件夹&#xff0c;一切尽在指尖&#xff01; PS&#xff1a;Everything无法对文件内容进行搜索&#xff0c;只能根据文件名和路径进行搜索 二、Everyt…

面向对象程序设计之模板进阶(C++)

在之前我出过一篇博客介绍了模版的初阶:面向对象程序设计(C)模版初阶&#xff0c;接下来我们将进行模版的进阶学习&#xff0c;介绍关于更多模版的知识 1.非类型模版参数 模板参数分类类型形参与非类型形参 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或…

电力系统调度控制台的功能有哪些

在复杂多变的现代电力系统中&#xff0c;调度控制台作为其核心管理与控制的中枢&#xff0c;扮演着不可或缺的角色。它不仅是确保电网安全稳定运行的关键&#xff0c;也是实现电力资源高效配置的重要工具。那么&#xff0c;电力系统调度控制台究竟具备哪些关键功能呢? 首先&am…

Easyexcel导入数据,没有指定文件路径临时文件在什么位置?

1、SpringBoot接口导入Excel&#xff0c;MultipartFile转File public static File convertToFile(MultipartFile multipartFile) throws IOException {// 将 MultipartFile 转换为 byte[]byte[] bytes multipartFile.getBytes();// 创建一个临时文件File tempFile File.creat…

大模型时代的企业转型:RAG技术的进化与挑战

从2023年起开始火爆的大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;&#xff0c;如GPT/Gemini/通义千问/GLM/文心一言/豆包等&#xff0c;经过了一年多的比拼和进化&#xff0c;已经几乎涵盖了所有通用性、常识性的知识和理解力&#xff1b; 与之同…

基于Java+Mysql实现(web)大型企业管理系统

技术报告 第一章 系统概述 包括用户管理、权限管理、软件项目管理、软件模块管理、测试用例管理、测试任务分配、bug管理等功能。实现公司不同部门间团队协作&#xff0c;管理人员也能够更加有效的把控系统开发的进度。 本实验综合应用JavaWeb编程中的Servlet&#xff0c;JS…

iPhone 16分辨率,屏幕尺寸,PPI 详细数据对比 iPhone 16 Plus、iPhone 16 Pro、iPhone 16 Pro Max

史上最全iPhone 机型分辨率&#xff0c;屏幕尺寸&#xff0c;PPI详细数据&#xff01;已更新到iPhone 16系列&#xff01; 点击放大查看高清图 &#xff01;

电商api接口:让数据成为生产力的第一利器

随着电子商务的蓬勃发展&#xff0c;数据已成为推动业务增长和优化用户体验的关键因素。为了满足商家和开发者对多元化电商服务的需求&#xff0c;聚合电商 API 接口平台应运而生。这类平台通过整合多个电商平台的 API 接口&#xff0c;为商家和开发者提供一站式的数据服务&…

Apisix离线安装

上传离线包 #ll apisix-3.2.2-0.el7.x86_64.rpm apisix-base-1.21.4.1.8-0.el7.x86_64.rpm apisix-dashboard-3.0.1-0.el7.x86_64.rpm cyrus-sasl-2.1.26-24.el7_9.x86_64.rpm cyrus-sasl-devel-2.1.26-24.el7_9.x86_64.rpm cyrus-sasl-gssapi-2.1.26-24.el7_9.x86_64.rpm cyr…

HTB-Unified(log4j2漏洞、MongoDb替换管理员密码)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解Unified靶机 渗透过程 信息搜集 服务器开放了SSH服务&#xff0c;HTTP服务 访问网站 验证log4j2漏洞 8443端口&#xff1a;UniFi 网络 &#xff0c;访问查询 是否有Nday漏洞利用 可以观察到UniFi的版…

【网络安全的神秘世界】渗透测试基础

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 渗透测试基础 基于功能去进行漏洞挖掘 1、编辑器漏洞 1.1 编辑器漏洞介绍 一般企业搭建网站可能采用了通用模板&#xff…

【计算机网络】电路交换、电报交换、分组交换

【计算机网络】电路交换、电报交换、分组交换 目录 【计算机网络】电路交换、电报交换、分组交换1. 电路交换2. 电报交换3. 分组交换4. 基于分组交换~“虚电路交换”技术 1. 电路交换 电路交换&#xff08;Circuit Switching&#xff09;:通过物理线路的连接&#xff0c;动态地…

linux_L2_linux删除文件

linux 删除文件 在Linux下删除文件有多种实现方法&#xff0c;以下是其中几种常见的方法&#xff1a; 方法一&#xff1a;使用rm命令删除单个文件 rm 文件路径例如&#xff0c;删除当前目录下的文件file.txt&#xff1a; rm file.txtQuestion :当你在Linux系统中使用rm命令删…

Git学习尚硅谷(005 idea集成git)

尚硅谷Git入门到精通全套教程&#xff08;涵盖GitHub\Gitee码云\GitLab&#xff09; 总时长 4:52:00 共45P 此文章包含第27p-第p32的内容 文章目录 忽略特定文件在家目录里创建这个文件在.gitconfig文件里配置这个文件 配置IDEA定位到git程序进行添加文件初始化本地库添加单个…

Mini-Omni 语言模型在流式传输中边思考边听说应用

引入简介 Mini-Omni 是一个开源的多模态大语言模型,能够在思考的同时进行听觉和语言交流。它具有实时端到端语音输入和流媒体音频输出的对话能力。 语言模型的最新进展取得了显著突破。GPT-4o 作为一个新的里程碑,实现了与人类的实时对话,展示了接近人类的自然流畅度。为了…

下一代 AI 教育:知识图谱RAG + 多智能体,听老师的话没前途,让老师听你的才是正道

下一代 AI 教育&#xff1a;知识图谱RAG 多智能体&#xff0c;听老师的话没前途&#xff0c;让老师听你的才是正道 下一代 AI 教育&#xff1a;基于最本质的用脑方式学习 理解 记忆&#xff1f;学习的 3 个层次文科&#xff1a;关联理解 关联分析 关联记忆秒背古诗古文商业…

前端用html写excel文件直接打开

源码 <html xmlns:o"urn:schemas-microsoft-com:office:office" xmlns:x"urn:schemas-microsoft-com:office:excel" xmlns"http://www.w3.org/TR/REC-html40"> <head><meta charset"UTF-8"><!--[if gte mso 9]&…