当前位置: 首页 > news >正文

windows C++ 并行编程-转换使用取消的 OpenMP 循环以使用并发运行时

某些并行循环不需要执行所有迭代。 例如,搜索值的算法可以在找到值后终止。 OpenMP 不提供中断并行循环的机制。 但是,可以使用布尔值或标志来启用循环迭代,以指示已找到解决方案。 并发运行时提供允许一个任务取消其他尚未启动的任务的功能。

此示例演示如何将一个不需要运行所有迭代的 OpenMP parallelfor 循环转换为使用并发运行时取消机制。

示例

此示例同时使用 OpenMP 和并发运行时来实现 std::any_of 算法的并行版本。 此示例的 OpenMP 版本使用标志来协调所有满足条件的并行循环迭代。 使用并发运行时的版本使用 concurrency::structured_task_group::cancel 方法在满足条件时停止整个操作。

// concrt-omp-parallel-any-of.cpp
// compile with: /EHsc /openmp
#include <ppl.h>
#include <array>
#include <random>
#include <iostream>using namespace concurrency;
using namespace std;// Uses OpenMP to determine whether a condition exists in 
// the specified range of elements.
template <class InIt, class Predicate>
bool omp_parallel_any_of(InIt first, InIt last, const Predicate& pr)
{typedef typename std::iterator_traits<InIt>::value_type item_type;// A flag that indicates that the condition exists.bool found = false;#pragma omp parallel forfor (int i = 0; i < static_cast<int>(last-first); ++i){if (!found){item_type& cur = *(first + i);// If the element satisfies the condition, set the flag to // cancel the operation.if (pr(cur)) {found = true;}}}return found;
}// Uses the Concurrency Runtime to determine whether a condition exists in 
// the specified range of elements.
template <class InIt, class Predicate>
bool concrt_parallel_any_of(InIt first, InIt last, const Predicate& pr)
{typedef typename std::iterator_traits<InIt>::value_type item_type;structured_task_group tasks;// Create a predicate function that cancels the task group when// an element satisfies the condition.auto for_each_predicate = [&pr, &tasks](const item_type& cur) {if (pr(cur)) {tasks.cancel();}};// Create a task that calls the predicate function in parallel on each// element in the range.auto task = make_task([&]() {parallel_for_each(first, last, for_each_predicate);});// The condition is satisfied if the task group is in the cancelled state.return tasks.run_and_wait(task) == canceled;
}int wmain()
{// The length of the array.const size_t size = 100000;// Create an array and initialize it with random values.array<int, size> a;   generate(begin(a), end(a), mt19937(42));// Search for a value in the array by using OpenMP and the Concurrency Runtime.const int what = 9114046;auto predicate = [what](int n) -> bool { return (n == what);};wcout << L"Using OpenMP..." << endl;if (omp_parallel_any_of(begin(a), end(a), predicate)){wcout << what << L" is in the array." << endl;}else{wcout << what << L" is not in the array." << endl;}wcout << L"Using the Concurrency Runtime..." << endl;if (concrt_parallel_any_of(begin(a), end(a), predicate)){wcout << what << L" is in the array." << endl;}else{wcout << what << L" is not in the array." << endl;}
}

本示例生成以下输出。

Using OpenMP...
9114046 is in the array.
Using the Concurrency Runtime...
9114046 is in the array.

在使用 OpenMP 的版本中,将执行循环的所有迭代,即使设置了标志。 此外,如果任务具有任何子任务,则标志还必须可供这些子任务用来传达取消信息。 在并发运行时中,当任务组被取消时,运行时会取消整个工作树,包括子任务。 concurrency::parallel_for_each 算法使用任务来执行工作。 因此,当循环的一次迭代取消根任务时,也会取消整个计算树。 取消工作树后,运行时不会启动新任务。 但是,运行时允许已经开始的任务完成。 因此,对于 parallel_for_each 算法,活动循环迭代可以清理其资源。

在此示例的两个版本中,如果数组包含要搜索的值的多个副本,则多个循环迭代可以同时设置结果并取消整个操作。 如果问题要求在满足条件时只有一个任务执行工作,则可以使用同步基元,如关键部分。

编译代码

复制示例代码,并将它粘贴到 Visual Studio 项目中,或粘贴到名为 concrt-omp-parallel-any-of.cpp 的文件中,再在 Visual Studio 命令提示符窗口中运行以下命令。

cl.exe /EHsc /openmp concrt-omp-parallel-any-of.cpp

相关文章:

windows C++ 并行编程-转换使用取消的 OpenMP 循环以使用并发运行时

某些并行循环不需要执行所有迭代。 例如&#xff0c;搜索值的算法可以在找到值后终止。 OpenMP 不提供中断并行循环的机制。 但是&#xff0c;可以使用布尔值或标志来启用循环迭代&#xff0c;以指示已找到解决方案。 并发运行时提供允许一个任务取消其他尚未启动的任务的功能。…...

经验笔记:跨站脚本攻击(Cross-Site Scripting,简称XSS)

跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;简称XSS&#xff09;经验笔记 跨站脚本攻击&#xff08;XSS&#xff1a;Cross-Site Scripting&#xff09;是一种常见的Web应用程序安全漏洞&#xff0c;它允许攻击者将恶意脚本注入到看起来来自可信网站的网页上。当…...

演示:基于WPF的DrawingVisual和谷歌地图瓦片开发的地图(完全独立不依赖第三方库)

一、目的&#xff1a;基于WPF的DrawingVisual和谷歌地图瓦片开发的地图 二、预览 三、环境 VS2022&#xff0c;Net7,DrawingVisual&#xff0c;谷歌地图瓦片 四、主要功能 地图缩放&#xff0c;平移&#xff0c;定位 真实经纬度 显示瓦片信息 显示真实经纬度和经纬线 省市县…...

【C++】static作用总结

文章目录 1. 在函数内&#xff08;局部静态变量&#xff09;2. 在类中的静态成员变量3. 在类中的静态成员函数4. 在文件/模块中的静态变量或函数总结 1. 在函数内&#xff08;局部静态变量&#xff09; 当 static 用于函数内的局部变量时&#xff0c;该变量的生命周期变为整个…...

视频提取字幕的软件有哪些?高效转录用这些

探索视频的奥秘&#xff0c;从字幕开始&#xff01;你是否曾被繁复的字幕处理困扰&#xff0c;渴望有一款简单好用的在线免费软件来轻松解锁字幕提取&#xff1f; 告别手动输入的烦恼&#xff0c;我们为你精选了6款视频字幕提取在线免费软件&#xff0c;它们不仅能一键转录&am…...

(4)SVG-path中的椭圆弧A(绝对)或a(相对)

1、概念 表示经过起始点(即上一条命令的结束点)&#xff0c;到结束点之间画一段椭圆弧 2、7个参数 rx&#xff0c;ry&#xff0c;x-axis-rotation&#xff0c;large-arc-flag&#xff0c;sweep-flag&#xff0c;x&#xff0c;y &#xff08;1&#xff09;和&#xff08;2&a…...

docker国内镜像源报错解决方案

Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details. 遇到 Job for docker.service failed because the control process exited with error …...

《C++进阶之路:探寻预处理宏的替代方案》

在 C编程的历程中&#xff0c;预处理宏曾经扮演了重要的角色。然而&#xff0c;随着 C语言的不断发展和编程理念的进步&#xff0c;预处理宏的一些弊端也逐渐显现出来。那么&#xff0c;C中的预处理宏的替代方案有哪些呢&#xff1f;本文将深入探讨这个问题&#xff0c;为你揭示…...

【综合案例】使用鸿蒙编写掘金评论列表案例

效果展示 功能描述 整个页面分为三大模块&#xff1a;顶部 主体【评论列表】 底部。 点击顶部的最新和最热按钮可以进行切换&#xff0c;点击最新按钮的时候主体部分的评论列表是按照时间由近至远进行排列展示&#xff0c;点击最热按钮的时候主体部分的评论列表是按照点赞数…...

【springboot】使用缓存

目录 1. 添加依赖 2. 配置缓存 3. 使用EnableCaching注解开启缓存 4. 使用注解 1. 配置缓存名称 2. 配置缓存的键 3. 移除缓存 5. 运行结果 1. 添加依赖 <!-- springboot缓存--><dependency><groupId>org.springframework.boot</groupId>…...

<Linux> 基础IO

目录 一、C语言文件IO 1. 基础认知 2. stdin、stdout、stderr 3. 文件接口汇总 4. 文件写入 5. 文件读取 6. 标志位传递 7. 总结 二、系统文件IO 1. 文件系统调用open 1.1 pathname &#xff1a; 1.2 flags &#xff1a; 1.3 mode&#xff1a; 1.4 open函数返回值&#xff1a;…...

OpenFeign的使用(一)

OpenFeign的定义 OpenFeign是一个声明式的Web服务客户端&#xff0c;它简化了编写Web服务客户端的过程&#xff0c;使得微服务间的通信更加简单和灵活。它主要作用于帮助开发者方便地调用远程服务&#xff0c;让远程调用像本地方法调用一样简单。 事实上&#xff0c;远程调用的…...

【Python报错已解决】`AttributeError: move_to requires a WebElement`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述&#xff1a;1.1 报错示例&#xff1a;1.2 报错分析&#xff1a;1.3 解决思路&#xff…...

数据结构(邓俊辉)学习笔记】排序 2——快速排序:性能分析

文章目录 1. 不稳定 就地2. 最好情况 最坏情况3.平均情况 1. 不稳定 就地 以下针对刚才所给出的快速排序算法的第一个版本&#xff0c;就其性能做一分析。 首先很遗憾地发现&#xff0c;这个算法是不稳定的。快速排序算法的不稳定性通过我们刚才所举的那个实例可以清楚地看…...

在postman中使用javascript脚本生成sign签名

大多数线上api接口服务都需要提供签名才可以正常访问。虽然带来了安全&#xff0c;单有时为了快速验证接口的某个功能&#xff0c;就不得不编写代码&#xff0c;计算签名然后再请求。那么&#xff0c;使用postman提供的script功能&#xff0c;是否能实现签名计算功能吗&#xf…...

设计模式—2—单例模式

文章目录 一、单例模式概述二、单例模式特点三、示例3.1、基本实现&#xff08;懒汉式-线程不安全&#xff09;3.2、基本实现&#xff08;懒汉式-线程安全&#xff09;3.3、基本实现&#xff08;饿汉式&#xff09; 四、总结 一、单例模式概述 单例模式&#xff08;Singleton …...

服务器数据恢复—磁盘坏扇区导致raid6阵列崩溃的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台存储中有一组由12块SAS硬盘组建的raid6磁盘阵列&#xff0c;划分了1个卷&#xff0c;由数台Vmware ESXI主机共享存储。卷中存放了大量的Windows系统虚拟机。这些虚拟机系统盘大小一致&#xff0c;数据盘大小不确定&#xff0c;数据盘都…...

原码、反码、补码

目录 背景: 1.原码 举例: 2.反码&#xff1a; 举例 : 3.补码&#xff1a; 举例&#xff1a; 背景: 在计算机科学中&#xff0c;原码、反码和补码是三种用于表示有符号整数&#xff08;即包含正负数&#xff09; 的二进制编码方式。它们各自有其独特的定义和用途&#x…...

排序算法之计数排序详细解读(附带Java代码解读)

计数排序&#xff08;Counting Sort&#xff09;是一种非比较型的排序算法&#xff0c;它通过统计每个元素的出现频率&#xff0c;然后计算元素的位置信息&#xff0c;最后将元素放到正确的位置&#xff0c;从而实现排序。计数排序特别适用于元素范围有限的情况&#xff0c;比如…...

Linux:如何使用 Crontab

今天想了解一下Linux Crontab。嗯&#xff0c;在Windows上&#xff0c;可以看做和定时任务差不多。 “要在特定时间进行特定工作。” 如果是这样&#xff0c;可以使用crontab&#xff0c;轻松使用Linux。 1. 基本 (crontab basic) 先看一下基本的crontab使用方法吧。在Linu…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...