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

windows C++ 并行编程-使用 Lambda 表达式

要在加速器上运行的 C++ AMP 代码在调用 parallel_for_each 方法时指定为自变量。 可以提供 lambda 表达式或函数对象 (functor) 作为该参数。 此外,lambda 表达式或函数对象还可以调用受 C++ AMP 限制的函数。 下面使用数组加法算法演示 lambda、函数对象和受限函数。 以下示例演示不带 C++ AMP 代码的算法。 将创建两个长度相等的 1 维数组。 相应的整数元素将添加到第三个 1 维数组中并存储。 不使用 C++ AMP。

void CpuMethod() {int aCPP[] = {1, 2, 3, 4, 5};int bCPP[] = {6, 7, 8, 9, 10};int sumCPP[5];for (int idx = 0; idx <5; idx++){sumCPP[idx] = aCPP[idx] + bCPP[idx];}for (int idx = 0; idx <5; idx++){std::cout <<sumCPP[idx] <<"\n";}
}
Lambda 表达式

使用 lambda 表达式是使用 C++ AMP 重写代码的最直接方法。

void AddArraysWithLambda() {int aCPP[] = {1, 2, 3, 4, 5};int bCPP[] = {6, 7, 8, 9, 10};int sumCPP[5];array_view<const int, 1> a(5, aCPP);array_view<const int, 1> b(5, bCPP);array_view<int, 1> sum(5, sumCPP);sum.discard_data();parallel_for_each(sum.extent,[=](index<1> idx) restrict(amp){sum[idx] = a[idx] + b[idx];});for (int i = 0; i <5; i++) {std::cout <<sum[i] <<"\n";}
}

ambda 表达式必须包含一个索引参数和 restrict(amp)。 在此示例中,array_viewsum 对象排名为 1。 因此,lambda 语句的参数是排名为 1 的索引对象。 在运行时,lambda 表达式针对 array_view 对象中的每个元素执行一次。 

Function 对象

可以将加速器代码分解为函数对象。

class AdditionFunctionObject
{
public:AdditionFunctionObject(const array_view<int, 1>& a,const array_view<int, 1>& b,const array_view<int, 1>& sum): a(a), b(b), sum(sum){}void operator()(index<1> idx) restrict(amp){sum[idx] = a[idx] + b[idx];}private:array_view<int, 1> a;array_view<int, 1> b;array_view<int, 1> sum;
};void AddArraysWithFunctionObject() {int aCPP[] = {1, 2, 3, 4, 5};int bCPP[] = {6, 7, 8, 9, 10};int sumCPP[5];array_view<const int, 1> a(5, aCPP);array_view<const int, 1> b(5, bCPP);array_view<int, 1> sum(5, sumCPP);sum.discard_data();parallel_for_each(sum.extent,AdditionFunctionObject(a, b, sum));for (int i = 0; i <5; i++) {std::cout <<sum[i] <<"\n";}
}

函数对象必须包含构造函数以及函数调用运算符的重载。 函数调用运算符必须包含一个索引参数。 函数对象的实例作为第二个参数传递给 parallel_for_each 方法。 在此示例中,将三个 array_view 对象传递给函数对象构造函数。 array_view对象sum排名为 1。 因此,函数调用运算符的参数是排名 1 的索引对象。 在运行时,lambda 表达式针对 array_view 对象中的每个元素执行一次。

受 AMP 限制的函数

可以通过创建受限函数并从 lambda 表达式或函数对象调用它来进一步分解加速器代码。 下面的代码示例演示如何从 lambda 表达式调用受限函数。 

void AddElementsWithRestrictedFunction(index<1> idx, array_view<int, 1> sum, array_view<int, 1> a, array_view<int, 1> b) restrict(amp)
{sum[idx] = a[idx] + b[idx];
}void AddArraysWithFunction() {int aCPP[] = {1, 2, 3, 4, 5};int bCPP[] = {6, 7, 8, 9, 10};int sumCPP[5];array_view<int, 1> a(5, aCPP);array_view<int, 1> b(5, bCPP);array_view<int, 1> sum(5, sumCPP);sum.discard_data();parallel_for_each(sum.extent,[=](index<1> idx) restrict(amp){AddElementsWithRestrictedFunction(idx, sum, a, b);});for (int i = 0; i <5; i++) {std::cout <<sum[i] <<"\n";}
}

受限函数必须包含 restrict(amp) 并符合限制 (C++ AMP) 中所述的限制。 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MYSQL数据库(四)
  • JavaScript学习文档(11):Window对象、本地存储、数组中一些方法、学生就业统计表案例
  • 15行为型设计模式——责任链模式
  • Java基础入门【第六章 static、继承、重写、多态】(二)
  • 数据合规性分析:守护信息安全的关键防线
  • MySQL的安装配置以及可视化工具的安装
  • 【拉取Git项目到本地,知识小记,后续再改】
  • 春秋云镜initial
  • 宏集MIRO-L230工业路由器: 一站式全球联网解决方案
  • C++ 图形框架 Duilib
  • UE5学习笔记18-使用FABRIK确定骨骼的左手位置
  • 安装vue-cli2.0并创建项目
  • 实习项目|苍穹外卖|day2
  • jenkins安装k8s插件发布服务
  • rsync搭建全网备份
  • [笔记] php常见简单功能及函数
  • 【React系列】如何构建React应用程序
  • crontab执行失败的多种原因
  • Intervention/image 图片处理扩展包的安装和使用
  • Java多态
  • JS字符串转数字方法总结
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • node-glob通配符
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Python利用正则抓取网页内容保存到本地
  • Rancher如何对接Ceph-RBD块存储
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Vue 动态创建 component
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从伪并行的 Python 多线程说起
  • 服务器从安装到部署全过程(二)
  • 微信小程序--------语音识别(前端自己也能玩)
  • 移动端 h5开发相关内容总结(三)
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​字​节​一​面​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #android不同版本废弃api,新api。
  • #QT(智能家居界面-界面切换)
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .dwp和.webpart的区别
  • .Net Core和.Net Standard直观理解
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .Net Redis的秒杀Dome和异步执行
  • .net6使用Sejil可视化日志
  • .net解析传过来的xml_DOM4J解析XML文件
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)