我想知道是否有一种简单、直接的方式来让循环如 for
和基于范围的 for
循环在 C++ 中并行计算。你将如何实施这样的事情?从 Scala 我知道 map
, filter
和 foreach
功能,也许也可以并行执行这些功能?有没有一种简单的方法可以在 C++ 中实现这一点?
我的主要平台是 Linux,但如果它可以跨平台工作就更好了。
原文由 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 许可协议
4 回答2.9k 阅读✓ 已解决
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
使用 C++17 中的并行算法,我们现在可以使用:
并行计算循环。第一个参数指定 执行策略