concurrency runtime学习笔记之二:并行
并行依赖的是底层多线程处理机制,线程的创建和销毁,还有线程间的同步问题常常令人望而生畏。concrrency runtime提供的并行库Parallell Patterns Library (PPL)提高了线程处理机制的抽象级别,让C++多线程并行变得异常的简单。
先看一下构架:
应该很清楚了,PPL处于应用程序和线程处理机制之间。
再来看一个常规的例子,计算斐波那契数列:
#include <windows.h> #include <ppl.h> #include <array>using namespace std; using namespace Concurrency;// Computes the nth Fibonacci number. int fibonacci(int n) {if(n < 2)return n;return fibonacci(n-1) + fibonacci(n-2); }// Calls the provided work function and returns the number of milliseconds // that it takes to call that function. template <class Function> __int64 time_call(Function&& f) {__int64 begin = GetTickCount();f();return GetTickCount() - begin; }int _tmain(int argc, _TCHAR* argv[]) {__int64 elapsed;// An array of Fibonacci numbers to compute.array<int, 4> a = { 24, 26, 41, 42 };// Use the for_each algorithm to compute the results serially.elapsed = time_call([&] {size_t sum = 0;for_each (a.begin(), a.end(), [&](int n){sum += fibonacci(n);});wcout << sum << endl;}); wcout << L"serial time: " << elapsed << L" ms" << endl;return 0; }
如果调用并行算法,就把for_each换成parallel_for_each,不过要注意在一个并行循环体内,对共享资源的操作只允许读不允许写,所以要实现累加的话需要用到互斥对象 Concurrency::critical_section :
elapsed = time_call([&] {critical_section cs;size_t sum = 0;parallel_for_each (a.begin(), a.end(), [&](int n){cs.lock();sum += fibonacci(n);cs.unlock();});wcout << sum << endl;});wcout << L"parallel time: " << elapsed << L" ms" << endl;
更好的办法是用Concurrency::combinable 来协调线程间的冲突:
elapsed = time_call([&] {combinable<size_t> sum;parallel_for_each (a.begin(), a.end(), [&](int n){sum.local() += fibonacci(n);});size_t fibsum = sum.combine(std::plus<int>());wcout << fibsum << endl;}); wcout << L"parallel time: " << elapsed << L" ms" << endl;
取消并行循环要将并行算法包含在一个任务组中,并用Concurrency::task_group::cancel或Concurrency::structured_task_group::cancel取消这个任务组,因为从构架上来说,并行库是在task scheduler模块之下的,所以取消机制是自上而下的,也就是说取消的是整个任务组,看程序:
structured_task_group tasks;tasks.run_and_wait([&]{parallel_for_each(a.begin(), a.end(), [&](int n) {if (n == 41){ tasks.cancel();}});});
以上是parallel_for_each算法的大致应用,parallel_for算法用法大同小异,parallel_invoke用的较少。尽管concurrency runtime封装并优化了多线程调用,但是线程调用的开销仍是存在的,运用时要考虑下是否值得。一般来说,计算密集型的应用比较合适,比方说图象处理算法,而对于小型轻量循环体就弊大于利了。
--------------------------------------------------------------------
附一道面试题:一个人走楼梯,可以一次走1层,也可以走2层,也可以走3层,问n层楼梯有多少种走法。
解:
1----> 1
1阶楼梯的爬法总共为: 1
2----> 1 1
2----> 2
2阶楼梯的爬法总共为: 2
3----> 1 1 1
3----> 1 2
3----> 2 1
3----> 3
3阶楼梯的爬法总共为: 4
4----> 1 1 1 1
4----> 1 1 2
4----> 1 2 1
4----> 1 3
4----> 2 1 1
4----> 2 2
4----> 3 1
4阶楼梯的爬法总共为: 7
5----> 1 1 1 1 1
5----> 1 1 1 2
5----> 1 1 2 1
5----> 1 1 3
5----> 1 2 1 1
5----> 1 2 2
5----> 1 3 1
5----> 2 1 1 1
5----> 2 1 2
5----> 2 2 1
5----> 2 3
5----> 3 1 1
5----> 3 2
5阶楼梯的爬法总共为: 13
看下规律,大概就是个fibonacci数列,f(n) = f(n-1) + f(n-2) + f(n-3) ,其中f(1)=1,f(2)=2,f(3)=4
转载于:https://www.cnblogs.com/xfu123/archive/2012/04/21/2460820.html
concurrency runtime学习笔记之二:并行相关推荐
- Deep Learning(深度学习)学习笔记整理(二)
本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流 [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之: ...
- Flowable学习笔记(二、BPMN 2.0-基础 )
转载自 Flowable学习笔记(二.BPMN 2.0-基础 ) 1.BPMN简介 业务流程模型和标记法(BPMN, Business Process Model and Notation)是一套图 ...
- Core Data 学习笔记(二)被管理对象模型
为什么80%的码农都做不了架构师?>>> 目录 Core Data 学习笔记(一)框架简介 Core Data 学习笔记(二)被管理对象模型 Core Data 学习笔记(三) ...
- PyTorch学习笔记(二):PyTorch简介与基础知识
往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一):PyTorch环境安 ...
- P4学习笔记(二)一个简单P4交换机实现
P4学习笔记(一)初始P4 P4学习笔记(二)一个简单P4交换机实现 文章目录 1. 架构模型 2.预定义模块详细描述 2.1 Arbiter 模块 2.2 Parser runtime 模块 2.3 ...
- JUC学习笔记(二)
JUC学习笔记(二) volatile关键字 JMM(Java Memory Model | Java内存模型) JMM同步规定 原理 工作流程 内存模型图 volatile特点 可见性 禁止指令重排 ...
- Slurm学习笔记(二)
Slurm学习笔记(二) 上文:https://eternal-sun.blog.csdn.net/article/details/112208409 一.查看队列详细信息 scontrol show ...
- VHDL硬件描述语言学习笔记(二)
本文主要参考b站视频:[考研]EDA技术(vhdl技术),建议有时间的跟着听一下,从第8节开始,一直到31节都是讲VHDL,讲的很全面,赶时间的可以直接看我这个笔记. 文章目录 1.3 VHDL语言要 ...
- 【《深度学习入门》—— 学习笔记(二)】
<深度学习入门>-- 学习笔记(二)_5-8章 第五章 误差反向传播法 方法一:基于数学式 - 严密简洁 方法二:基于计算图(computational graph) - 直观 5.1 计 ...
最新文章
- Oracle Sales Cloud 实施(二)
- 【超链接】ToMyStudy
- python练习笔记——面试题 F(n) = F(n-1)+F(n-2)
- WAIC2020开幕在即,第四范式亮点抢先看
- 打开服务器数据库文件,如何打开服务器中的数据库文件
- IDEA或Webstorm设置Terminal终端字体大小
- WCF中配置文件解析
- SDL 从内存流中加载图像并显示
- shell基础之for循环语句
- 23种设计模式JAVA案例
- Android Room 数据访问对象(DAO)详解
- 合天网安就业班_【合天网安实验室】SQL注入入门一
- 【第十八题】填坑I(北理工/北京理工大学/程序设计方法与实践/小学期 )
- javaWeb实现裁剪图片上传整套方案
- 计算机操作系统之设备管理思维导图
- 今日头条赚钱是真的吗,今日头条赚钱规则是什么
- 程序员外包到底怎么了?
- soul网关系列(六):客户端注册soul流程分析
- 计算机网络ospf流程图,计算机网络7-OSPF祥解.ppt
- SAP:采购申请ME51N/ME52N/ME54N/ME57屏幕增强