【c++】简单了解并行计算库PPL
来源:互联网 发布:maven java home 编辑:程序博客网 时间:2024/05/16 07:01
先来一波基础概念:
在操作系统中是指,一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的。
使用并行模式库 (PPL) 帮助我们实现并行。
PPL 提供以下功能:
任务并行:基于 Windows 线程池来并行执行多个工作项(任务)的机制
并行算法:基于并发运行时对数据集合进行处理的泛型算法
并行容器和对象:对元素提供安全并发访问的泛型容器类型
首先看一个小例子,源代码来自MSDN,点击这里看原文。
实现的是串行和并行模式下斐波那契数列的计算,不过写的比较复杂,我稍微改动了下。
例子1
#include <windows.h>#include <ppl.h>#include <array>#include <vector>#include <algorithm>#include <iostream>using namespace concurrency;using namespace std;vector<double> number;template <class Function>DWORD time_call(Function&& function){ DWORD start = GetTickCount(); function(); DWORD end = GetTickCount(); return end - start;}// 斐波那契数列double fibonacci(double number){ if (number <= 1) { return number; } return fibonacci(number-1)+ fibonacci(number - 2);}int main(){ array<double, 4> arr{24, 26, 41, 42}; DWORD time = time_call([&] { for_each(begin(arr), end(arr), [](double &n) { number.push_back(fibonacci(n)); }); }); cout << "串行,运行时间为:"<< time << "ms" << endl; time = time_call([&] { parallel_for_each(begin(arr), end(arr), [](double &n) { number.push_back(fibonacci(n)); }); }); cout << "并行,运行时间为:" << time << "ms" << endl; system("pause"); return 0;}
运行结果:
在让我们通过VS2015的诊断空间看看。
这是串行运行时:
这是并行运行时:
等数据足够多且大的时候,并行的效率将会远远高于串行。
以上的例子使用的是
parallel_for:并行方式遍历一个区间。
例子2
parallel_for_each 算法以并行方式对迭代容器执行任务,和parallel_for类似。
int index = 0; vector<int> number{1,2,3,4,5,6,7,8,9,10,11,12,13,14}; parallel_for_each(begin(number), end(number), [&index](int num) { index++; cout << "第" << index << "个数据为" << num << endl; });
至于为什么会出现这种输出结果,很好理解,几个任务同时访问index的内存并对数值进行+1的操作,在其中一个任务开始输出的时候,index已经不知道被访多少次了。
例子3
通过并行,是可以用钱换时间的。。
parallel_invoke 算法采用一系列工作函数(lambda 函数、函数对象或函数指针)作为其参数。 可对 parallel_invoke 算法进行重载以采用 2 到 10 个参数。 传递给 parallel_invoke 的每个函数都必须采用零个参数。
依然是来自于msdn的例子,原文点击这里
代码太长了,我就不粘过来了,大家可以自己点击进去看。
运行的程序是通过串行和并行执行双调排序算法。
运行结果:
诊断工具结果:
其他内容,大家可以看msdn中的并行算法,讲的很详细也很清楚。
- 【c++】简单了解并行计算库PPL
- 并行计算(PPL)
- C++AMP: 遇见C++ PPL:C++ 的并行和异步
- PPL 和AMP并行编程
- 并行编程 PPL或OpenMP
- PPL 和AMP并行编程
- PPL 和AMP并行编程
- 并行计算__简单并行计算实例
- c/c++并行计算
- .Net中并行计算的了解
- (一)初步了解并行计算、OpenMP
- 并行计算--C#--求π并行实现
- 并行计算MPI [ 简单例子 ]
- 遇见C++ PPL:C++ 的并行和异步
- 遇见C++ PPL:C++ 的并行和异步
- C++中密集运算的并行化(OpenMP,PPL)
- python并行计算的简单实现--pp
- 使用wait、notify简单实现并行计算
- 中文分词算法总结
- 如何理解C# 加载DLL的顺序
- Linux 上安装JDK(RPM版)
- Genymotion的使用
- Java 正则校验金额,且小数点只能是2位
- 【c++】简单了解并行计算库PPL
- Windows下Nexus 5的Android 5.0以上版本官方ROM的刷机教程
- 利用dnsmap功能解决DNS的缺陷
- android中隐藏软键盘唯一有效的方法
- 库函数优先级队列(priority_queue)
- 欢迎转载我的博客
- Rabbitmq HAproxy 集群设置
- .apply()用法和call()的区别
- FLV格式