c++ - STL parallel max_element 比sequential 慢,怎么写一个更好?
问题描述
我正在尝试编写 max_element 的并行版本,但工作时间比 GCC max_element -fopenmp -D_GLIBCXX_PARALLEL 多 4 倍。
我阅读了不同 STL max_element 的实现。 GCC , LLVM , Apache , STE||AR 集团, Electronic Arts , ...
我想编写一个工作方式不同的函数。有什么问题?我正在测试它,并行版本的工作时间比顺序版本长。(测试 100 万个 uniform_int_distribution uint8_t)
迭代版本
所以我想做这样的事情。
template<class RAIt>
RAIt max_element(RAIt first, RAIt last) {
size_t threads = omp_get_num_threads();
size_t bucket_size = (last - first) / threads;
std::vector<RAIt> local_max( threads );
#pragma omp parallel for
for (size_t i = 0; i < threads - 1; ++i)
local_max[i] = std::max_element(first + bucket_size * i, first + bucket_size * (i + 1));
local_max.back() = std::max_element(first + bucket_size * (threads - 1), last);
return *std::max_element(local_max.begin(), local_max.end(),
[](RAIt left, RAIt right){ return *left < *right;});
}
一个很好的问题是:
为什么工作更慢?
解决方案
推荐阅读
- postgresql - Hasura 使用 SSL 证书进行 Postgres 连接
- python - python 3.6 aiohttp 很慢
- windows - 如何向上导航未知数量的文件夹,直到找到已知名称
- webpack - WebpackOptionsValidationError 无效配置 webpack(config)
- mysql - 如何在 iframe 中加载 blob
- r - 查找两个数值向量之间相同位置的所有差异的索引
- xcode - 如何为 MacOS 创建全局覆盖?
- c# - 如何修复代码以从 C# Web API 中的 SqlDataReader 返回完整列表而不是一行
- javascript - 警告:标签上的 prop `logout` 值无效
- npm - 您如何将来自节点模块的资产与您的 gulp 构建捆绑在一起?