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.xdnf.cn/news/145245.html

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

相关文章

志邦家居CIO吴俊涛谈转型:天润融通如何赋能家居行业未来

根据国家统计局、住建部等各部门综合数据显示&#xff0c;2024年国内泛家居全渠道销售额在预计将超过4.7万亿元&#xff0c;并且在存量房需求释放与智能家居品类创新的推动下&#xff0c;预计2027年将突破5.3万亿元&#xff0c;展现出强劲的增长弹性。 然而&#xff0c;家居行…

【Mysql】为modified_time和created_time设置默认值

建立表SQL&#xff1a; CREATE TABLE your_table_name (id int(11) NOT NULL AUTO_INCREMENT,/* 其他字段 */created_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建日期,modified_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 修改…

如果 Linux 这么好,为什么没有更多的人使用它呢?

原文&#xff1a;DHH - 2024.09.02 几周前&#xff0c;我在推特上看到一个问题&#xff1a;“如果 Linux 这么好&#xff0c;为什么没有更多的人使用它呢&#xff1f;” 这是一个很合理的问题&#xff01;在你仔细考虑之前&#xff0c;直觉上这是正确的。Linux 甚至是免费的&a…

neo4j关系的创建删除 图的删除

关系的创建和删除 关系创建 CREATE (:Person {name:"jack"})-[:LOVE]->(:Person {name:"Rose"})已有这个关系时&#xff0c;merge不起效果 MERGE (:Person {name:"Jack" })-[:LOVE]->(:Person {name:"Rose"})关系兼顾节点和关…

10_Python流程控制_循环

循环 循环是控制程序重复执行特定代码块的关键结构。Python提供了几种不同的循环结构&#xff0c;以满足不同的编程需求。 While循环 while 循环会重复执行一个代码块&#xff0c;只要指定的条件为真。 适用情况&#xff1a;不清楚具体的循环次数&#xff0c;或者当条件一直…

“科学突破奖”获得者连续两篇Nature,成功绘制人类主要激酶底物特异性图谱

激酶研究进展 近期Nature期刊发表关于酪氨酸激酶的研究文章。这是威尔康奈尔医学癌症中心Jared L. Johnson和Lewis C. Cantley团队自2023年成功绘制丝/苏氨酸激酶底物特异性图谱后&#xff0c;时隔一年后再次成功绘制酪氨酸激酶底物特异性图谱&#xff0c;为理解激酶在信号传导…

MyBatis 分批次执行(新增,修改,删除)

import com.google.common.collect.Lists;import java.util.Iterator; import java.util.List; import java.util.function.Consumer;/*** Description mybatis分批插入数据使用* Author WangKun* Date 2024/9/19 11:20* Version*/ public class MyBatisSqlUtils {/*** param d…

Linux进阶命令-scp

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 经过上一章Linux日志的讲解&#xff0c;我们对Linux系统自带的日志服务已经有了一些了解。我们接下来将讲解一些进阶命令&am…

快速编写一款python漏洞批量检测工具

一、前言 以下列检测脚本示列&#xff1a; import requestsimport urllib3import re,string,randomfrom urllib.parse import urljoinimport argparseimport timeimport sslssl._create_default_https_context ssl._create_unverified_contexturllib3.disable_warnings(urllib…

如何给zip文件设置自动加密,保护压缩包不被随意打开

ZIP是日常生活和工作中经常用到的压缩文件格式&#xff0c;对于重要的文件&#xff0c;我们往往还会设置打开密码&#xff0c;保护压缩包不被随意打开。 如果每次压缩文件都要设置一次密码&#xff0c;操作久了还是有点麻烦&#xff0c;那有没有一种方法&#xff0c;只要压缩文…

usemeno和usecallback区别及使用场景

1. useMemo 用途: useMemo 用于缓存计算结果。它接受一个函数和依赖项数组&#xff0c;只有当依赖项发生变化时&#xff0c;才会重新计算该函数的返回值。否则&#xff0c;它会返回缓存的值。 返回值: useMemo 返回的是函数执行后的结果。 使用场景: 当一个计算量大的函数在每…

openCV3.0 C++ 学习笔记补充(自用 代码+注释)---持续更新 三(61-)

环境&#xff1a;OpenCV3.2.0 VS2017 61、轮廓集合重排序(按轮廓面积从小到大) //对轮廓集合面积从大到小排序 bool compareValue_bs(const std::vector<cv::Point> & c1, const std::vector<cv::Point> & c2) {int area1 cv::contourArea(c1);int area…

【Python进阶】requests库有哪些常用的参数和方法?一篇文章带你详细了解!!!附带源码

常用的requests库参数和方法 常用方法 requests库中定义了多个常用的请求方法&#xff0c;其中requests.get()和requests.post()是最常用的方法。这些方法对应于HTTP协议中的GET和POST方法。 requests.get(url, paramsNone, **kwargs): 用于发送GET请求。requests.post(url…

116页可编辑PPT全面了解数据治理体系、平台,数据质量数据标准

概览 《行业大数据治理平台》是一个全面深入探讨大数据治理的PPT文档&#xff0c;共116页&#xff0c;涵盖了建设背景、解决方案、核心功能以及实际应用案例等多个方面。 核心议题 数据作为资产的重要性和全生命周期管理。信息系统建设方案的演变及其面临的问题。数据资产运营…

鸿蒙Harmony-Next 徒手撸一个日历控件

本文将介绍如何使用鸿蒙Harmony-Next框架实现一个自定义的日历控件。我们将创建一个名为CalendarView的组件&#xff08;注意,这里不能叫 Calendar因为系统的日历叫这个&#xff09;,它具有以下功能: 显示当前月份的日历支持选择日期显示农历日期可以切换上一月和下一月 组件…

[译] Go语言的源起,发展和未来

本篇内容是根据2019年9月份Creating the Go programming language音频录制内容的整理与翻译, 两位主持人与Go 的创始人 Rob Pike 和 Robert Griesemer谈论了 Go 的起源、发展、影响和未来。这是一个史诗般的剧集&#xff0c;深入探讨了 Go 的历史和详细信息&#xff0c;以及他们…

web基础—dvwa靶场(十一)CSP Bypass

CSP Bypass(CSP 绕过) 内容安全策略&#xff08;CSP&#xff09;用于定义脚本和其他资源可以从何处加载或执行&#xff0c;本模块将指导您根据开发人员犯下的常见错误来绕过该策略。 这些漏洞都不是 CSP 中的实际漏洞&#xff0c;它们都是实现 CSP 的方式中的漏洞。 绕过内容安…

JAVA——IO_缓冲流

目录 一、字节缓冲流 二、字符缓冲流 字符缓冲输入流( BufferedReader ) 字符缓冲输出流&#xff08; BufferedWriter ) 缓冲流作用&#xff1a;对原始流进行包装&#xff0c;以提高原始流读写数据的性能 一、字节缓冲流 1. 作用&#xff1a;提高字节流读写数据的性能 2…

使用scp命令从本地往服务器传输文件失败

解决办法&#xff1a; 找到这个文件&#xff0c;打开&#xff0c;将里面的服务器ip对应的一行数据删掉即可。

【Python报错已解决】To update, run: python.exe -m pip install --upgrade pip

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…