STL параллельно max_element медленнее, чем последовательно, как написать лучше? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь написать параллельную версию 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;});
  }

Хороший вопрос:

Почему работает медленнее?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...