c++ - c ++:stl并行算法没有执行性能
问题描述
我写了一个简单的程序来查看并行算法的执行性能。这是代码:
#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++
) 的情况下,一些算法是前一段时间实现的,但它们依赖于 Intel 的 TBB 库。
MSVC 标准库在这方面尤其领先,您将获得一个实际的并行版本,因此如果您在 Windows 上可以尝试该版本。
请参阅是否已实现 C++17 并行算法?了解更多信息。
附言。您的案例可以矢量化,因此您可以使用std::execution::par_unseq
.
推荐阅读
- python - 下载多个 PDF 时出现问题
- node.js - 带有 passport.js 的域和子域的 Cookie
- kernel - 如何在 Yocto 的内核中添加更改的 dts 文件?
- scala - Akka Streams 递归流调用
- intellij-idea - 为什么我的 Intellij Ultimate 检测不到 virtualenv?
- php - XML更新后PHP中的MYSQL事件
- java - 如何从另一个类中的另一个按钮调用一个按钮?
- javascript - 如何在此 Jest 测试中触发窗口加载事件?
- julia - 如何在不使用任何宏的情况下停止 Julia 中的循环并同时打印 ErrorMsg?
- javascript - 将 exceljs 工作簿发送到后端