C 中的并行循环

新手上路,请多包涵

我想知道是否有一种简单、直接的方式来让循环如 for 和基于范围的 for 循环在 C++ 中并行计算。你将如何实施这样的事情?从 Scala 我知道 mapfilterforeach 功能,也许也可以并行执行这些功能?有没有一种简单的方法可以在 C++ 中实现这一点?

我的主要平台是 Linux,但如果它可以跨平台工作就更好了。

原文由 Exagon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 948
2 个回答

使用 C++17 中的并行算法,我们现在可以使用:

 std::vector<std::string> foo;
std::for_each(
    std::execution::par,
    foo.begin(),
    foo.end(),
    [](auto&& item)
    {
        //do stuff with item
    });

并行计算循环。第一个参数指定 执行策略

原文由 Exagon 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 C++17 开始, std::for_each 具有允许 并行执行 的重载。然而,就我而言,我的算法需要特定数量的线程才能实现最佳执行,而 VS 2022 的 std::for_each 实现使用基于 std::thread::hardware_concurrency 的线程数。

对于那些希望能够控制并行工作者数量的人来说, 这个简单的实现 应该类似于 std::for_each 而不需要 C++17:

 template <class Iter, class Func>
void parallel_for_each(unsigned threadCount, Iter first, Iter last, Func func)
{
    Iter it = first;
    if (it == last)
        return;
    if (++it == last)
    {
        func(*first);
        return;
    }

    if (threadCount == 0)
        threadCount = std::max(2u, std::thread::hardware_concurrency());

    std::mutex mx;
    std::vector<std::thread> threads;
    threads.reserve(threadCount - 1);

    auto func2 = [&]() {
        for (;;)
        {
            Iter it;
            {
                std::lock_guard<std::mutex> lock(mx);
                it = first;
                if (it == last)
                    break;
                ++first;
            }
            func(*it);
        }
    };
    for (unsigned i = 0; i < threadCount - 1; ++i, ++it)
    {
        if (it == last)
            break;
        threads.emplace_back(std::thread(func2));
    }
    func2();
    for (auto& th : threads)
        th.join();
}

template <class Iter, class Func>
void parallel_for_each(Iter first, Iter last, Func func)
{
    parallel_for_each(std::thread::hardware_concurrency(), first, last, func);
}

原文由 Pavel P 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题