我试图编写max_element的并行版本,但是比GCC max_element -fopenmp -D_GLIBCXX_PARALLEL工作时间多x4。
我读了不同STL max_element的实现。 GCC,LLVM,Apache,The STE||AR Group,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;});
}
一个很好的问题是:
为什么工作得慢?