Я пытаюсь написать параллельную версию max_element, но работает в 4 раза больше, чем GCC max_element -fopenmp -D_GLIBCXX_PARALLEL.
Прочитал реализацию разных STL max_element.
GCC , LLVM , Apache , STE || AR Group , Electronic Arts , ...
Я хочу написать функцию, которая работает по-другому.
В чем проблема? Я тестирую его, и параллельная версия работает быстрее, чем последовательная. (тестирование 1 млн .iform_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;});
}
Хороший вопрос:
Почему работает медленнее?