![](/img/trans.png)
[英]C++ compiler support for std::execution (parallel STL algorithms)
[英]c++ : no execution performance for stl parallel algorithm
我写了一个简单的程序来查看并行算法的执行性能。 这是代码:
#include <execution>
#include <vector>
#include <numeric>
#include <iostream>
#include <chrono>
int main()
{
std::vector<float> data(1000000, 0);
std::iota(std::begin(data), std::end(data), 0);
auto t1 = std::chrono::high_resolution_clock::now();
for (auto& item : data) {
item = item*item;
}
auto t2 = std::chrono::high_resolution_clock::now();
/* Getting number of milliseconds as a double. */
std::chrono::duration<double, std::milli> ms_double = t2 - t1;
std::cout << "non-optimized version : " << ms_double.count() << " milisecs" << std::endl;
std::iota(std::begin(data), std::end(data), 0);
t1 = std::chrono::high_resolution_clock::now();
std::for_each(std::execution::par, std::begin(data), std::end(data),
[](float& item) {
item = item*item;
});
t2 = std::chrono::high_resolution_clock::now();
ms_double = t2 - t1;
std::cout << "paralell version : " << ms_double.count() << " milisecs" << std::endl;
return 0;
}
但令我惊讶的是,无论向量中的数据量如何,我都没有看到任何改进。 STL 算法有什么问题。 编译器是 gcc-10
一些标准库还没有实现并行版本。 在 GCC ( libstdc++
) 的情况下,一些算法是不久前实现的,但它们依赖于英特尔的 TBB 库。
MSVC 标准库在这方面尤其领先,你会得到一个实际的并行版本,所以如果你在 Windows 上,你可以试试那个。
请参阅C++17 并行算法是否已经实现? 了解更多信息。
附言。 您的案例可以向量化,因此您可以使用std::execution::par_unseq
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.