首页 > 解决方案 > 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;});
  }

一个很好的问题是:

为什么工作更慢?

标签: c++parallel-processing

解决方案


推荐阅读