技术开发 频道

在C++中使用Lambda函数提高代码性能

  【IT168 技术文档】使编译器以及操作系统从正在创建的应用中榨取更高性能的关键在于提供充足的有关代码意图的信息。在充分了解这个代码意图实现的功能等信息的情况下, 就有可能将代码在编译时和运行时的并行吞吐量最大化,令开发者可以将更多精力放在他们所关注的商业领域的问题,将重量级的多核多处理器的任务计划交托给编 译器,运行时库以及操作系统中的基础设施代码来处理。

  循环函数是很重要的一个环节,因为在所有可用的硬件资源中,被分离的循环中的各个部分在一般情况下能够提供更高的应用性能。考虑这样一个小情况:迭代选定组合中的全部元素以求得总和。最简单最直接的执行方法如下:

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库的参考文档中有关于所有指示的详细介绍。

0
相关文章