如何使用C ++标准库并行处理Plain for循环

Max*_*hof 5 c++ parallel-processing for-loop

我不得不问这个问题,这有点愚蠢,但我只是找不到一种毫不费力的方法来做到这一点。

我有以下循环:

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

  myOtherFunc(i);
}
Run Code Online (Sandbox Code Playgroud)

与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){ /*...*/ });
Run Code Online (Sandbox Code Playgroud)

因为您必须提供迭代器(即i取消引用时会产生参数的东西)。

  • 我可以std::iota进入std::vectorint因此我要遍历一系列索引。但是那将是荒谬的。

  • 我可以使用std::generate_n一些虚拟输出迭代器,该迭代器丢弃分配的所有内容。由于我认为没有可用,因此std我必须自己编写完整的虚拟迭代器。无论如何,这当然是愚蠢的。拥有正确的索引可能需要使用a进行手动跟踪,std::atomic<int>因为您不了解当前的索引。

  • 我真的没有容器可以循环。我的意思是,在这些函数的深处都有容器,但是重组所有内容只是为了让我可以在此循环中对某些容器使用迭代器,这是不可能的。

  • 搜寻了15分钟的不同描述后,我却一无所获。

有什么方法可以将最简单和最基本的for循环与<algorithm>不涉及愚蠢的废话的工具相匹配?

dar*_*une 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);
  }
}
);
Run Code Online (Sandbox Code Playgroud)