如何使用C ++标准库并行化for循环

问题描述 投票:3回答:1

我觉得有点愚蠢不得不问这个问题,但我找不到一个非常错综复杂的方法来做这件事。

我有以下循环:

for (int i = 0; i < count; ++i) {
  if (myFunc(i))
    continue;

  myOtherFunc(i);
}

使用OpenMP并行化这一点很简单:只需在循环之前添加#pragma omp parallel for即可。

我想比较OMP(及其不同的时间表)与MSVC的并行<algorithms>实现(即使用C ++ 17执行策略)的性能。直截了当的想法是使用std::for_each,但我无法找到一个很好的方法将这个超级简单的for循环转换为任何适当的<algorithm>事物,我可以抛出执行策略。

值得注意的是,你不能这样做

std::for_each(std::execution::par, 0, count, [](int i){ /*...*/ });

因为你必须提供迭代器(即在解除引用时产生i参数的东西)。

  • 我可以将std::iota变成std::vectorint,所以我有一系列指数可以迭代。那会是荒谬的。
  • 我可以使用std::generate_n和一些虚拟输出迭代器来丢弃它分配的任何内容。因为我认为std中没有这个,所以我必须自己编写完整的虚拟迭代器。无论如何,这当然是一个愚蠢的黑客行为。获得正确的索引可能需要使用std::atomic<int>进行手动跟踪,因为您无法了解当前的索引。
  • 我真的没有容器可以循环。我的意思是,在这些函数深处的某个地方有容器,但重构一切只是为了我可以在这个循环中使用迭代器而不是某些容器是不可能的。
  • 15分钟的谷歌搜索不同的描述,这并没有让我任何地方。

有没有办法匹配最简单和基本的for循环与<algorithm>工具,不涉及愚蠢的废话?

c++ for-loop parallel-processing
1个回答
5
投票

如果使用,你可以使用boost::irange(在中)产生这样的计数循环:

auto ints = boost::irange(0, count);
std::for_each_n(POLICY, ints.begin(), boost::size(ints), [](int i)
{
  if (!myFunc(i)) {
    myOtherFunc(i);
  }
}
);
© www.soinside.com 2019 - 2024. All rights reserved.