STL并行max_element比顺序慢一点,如何写出更好的一个?

时间:2018-05-09 03:52:46

标签: c++ parallel-processing

我试图编写max_element的并行版本,但是比GCC max_element -fopenmp -D_GLIBCXX_PARALLEL工作时间多x4。

我读了不同STL max_element的实现。 GCCLLVMApacheThe STE||AR GroupElectronic 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;});
  }

一个很好的问题是:

为什么工作得慢?

0 个答案:

没有答案