没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2009-05-18 10:20:21.000|阅读 700 次
概述:使编译器以及操纵系统从正在创建的应用中榨取更高机能的枢纽在于提供充足的有关代码意图的信息。在充分了解这个代码意图实现的功能等信息的情况下, 就有可能将代码在编译时和运行时的并行吞吐量最大化,令开发者可以将更多精力放在他们所关注的贸易领域的题目,将重量级的多核多处理器的任务计划交托给编 译器,运行时库以及操纵系统中的基础举措措施代码来处理。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
使编译器以及操纵系统从正在创建的应用中榨取更高机能的枢纽在于提供充足的有关代码意图的信息。在充分了解这个代码意图实现的功能等信息的情况下, 就有可能将代码在编译时和运行时的并行吞吐量最大化,令开发者可以将更多精力放在他们所关注的贸易领域的题目,将重量级的多核多处理器的任务计划交托给编 译器,运行时库以及操纵系统中的基础举措措施代码来处理。
轮回函数是很重要的一个环节,由于在所有可用的硬件资源中,被分离的轮回中的各个部门在一般情况下能够提供更高的应用机能。考虑这样一个小情况:迭代选定组合中的全部元素以求得总和。最简朴最直接的执行方法如下:
std::vector<int> v;
v.push_back(1);
v.push_back(5);
int total = 0;
for (int ix = 0; ix < v.size(); ++ix){
total += v[ix];
}
以上的例子十分便于人工读写。对于认识C语言家族语法的开发者而言,这个轮回的意图也十分轻易理解。然而对于编译器以及运行时库的组合而言,要在多个线程之间计划好这个轮回,它还需要类似于OpenMP编译指示一类的指示来告诉它哪里有优化的空间:
std::vector<int> v;
v.push_back(1);
v.push_back(5);
int total = 0;
#pragma omp for
for (int ix = 0; ix < v.size(); ++ix){
#pragma omp atomic
total += v[ix];
}
第一个OpenMP指示提出了多线程运行for轮回的要求,而第二个omp atomic指示则被用来防止多线程同时向总数变量上写入。对于OpenMP,在MSDN库的参考文档中有关于所有指示的具体先容。
假如使用了声明式轮回技巧,那么将并行方法应用在矢量乞降上则更加干净简朴。STL for_each函数是一个理想的替换品,以上的例子则被改写如下:
class Adder{
private:
int _total;
public:
Adder() : _total(0) {}
void operator ( ) ( int& i )
{
_total += i;
}
operator int ( )
{
return _total;
}
};
void VectorAdd()
{
std::vector<int> v;
v.push_back(1);
v.push_back(5);
int total = std::for_each(v.begin(), v.end(), Adder());
}
这里,详细的for轮回被舍弃,求矢量和的代码变得干净了一些;但是因为需要使用一系列运行符来定义一个类,这使得这个解决方案被大大的复杂化了。 除非代码库中还有大量类似的乞降声明,否则一个开发者是不会仅仅为了STL for_each的那点好处而多花费功夫去定义一个新类的。
仔细检查这个Adder类,可以很显著的看出其大部门内容都仅仅是用来知足将实例用作函数对象的调用前提的。这个类中独一起到计算作用的仅仅是那一 行_total += i。考虑到这一点,C++ 0x提供了一个被大大简化了的、以lambda函数方式来实现的语法技巧。Lambda函数移除了对这些搭架子代码的需求,并答应在另外的一个声明中定义 一个谓词函数。由此,VectorAdd函数可以被改写如下:
std::vector<int> v;
v.push_back(1);
v.push_back(5);
int total = 0;
std::for_each(v.begin(), v.end(),
[&total](int x) {total += x;}
);
Lambda函数的语法相称直截了当。方括号中的第一个lambda元素告诉编译器,本地变量total通过引用被捕获(这样的情况下最好用引用捕 捉,由于你需要矢量和的结果在for_each之后仍旧有效),而lambda的第二部门则是参数列表。Lambda的最后一部门是函数的主体,这个例子 中就是将参数x的值加到变量total中去。
假如在lambda函数中没有需要捕获的变量,或者只需要捕获变量的一个副本,那么函数开始的方括号可以留空:
std::for_each(v.begin(), v.end(), [](int x) {
std::cout << x << std::endl;
});
混合的捕获方法也可以使用:
int total = 0;
bool displayInput = true;
std::for_each(v.begin(), v.end(), [&total, displayInput](int x) {
total += x;
if (displayInput){
std::cout << x << std::endl;
}
});
这里,变量displayInput通过副本被捕获。Visual C++编译器在编译时会报错C3491:'displayInput':一个在lambda函数内数值被改变的变量无法在一个非可变lambda中通过数值被捕获。
Lambda函数中还有一个值得留意的地方,就是它的返回值类型。编译器一般会尽可能的(也是被要求的)推断lambda表达式的返回值类型,不外 对于复杂的多行表达式而言,有可能会需要切当的声明返回值类型。返回值类型声明通过在lambda函数参数和函数主体之间添加-﹥运行符以及需要被声明的 返回值类型来实现:
std::for_each(v.begin(), v.end(),
[&](int x)->void {total += x;});
}
C++中有了lambda函数,这令声明式编程以及使用STL运算法则变得更加简洁。Lambda函数答应在函数主体内的可执行代码字行间进行定义。在为 编译器提供强盛的优化提示之外,Lambda函数所推崇的代码模式可以令人更加简朴的理解哪段代码是要实现怎样的功能。Visual C++ 2010将带来在并行处理上的明显功能晋升,而lambda函数将是详细实现这些晋升的重要手段之一。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:博客园面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号