c++ - 如何使用 C++ 标准库并行化普通 for 循环

标签 c++ for-loop parallel-processing

我觉得不得不问这个问题有点愚蠢,但我就是找不到一种简单的方法来做到这一点。

我有以下循环:

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 , 但我想不出一个很好的方法来改造这个 super 平原 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> 循环不涉及愚蠢废话的工具?

最佳答案

如果使用 ,您可以使用 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);
  }
}
);

关于c++ - 如何使用 C++ 标准库并行化普通 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55845567/

相关文章:

c++ - 在 OpenGL 对象包装器中自动绑定(bind)

vba - Excel VBA - 循环变量

javascript - for(x = ...; x <= ...; x++) 是否在 JavaScript 的每个循环中计算 ...?

R 包 mlr 耗尽多核内存

c++ - 如何实时监控不同的 OpenMP 线程?

C++ 函数指针类型错误

c++ - Win8 的拼写检查 API 将 null 作为输出参数发送

c - 使用 openmp 并行化矩阵以避免错误共享

c++ - 有没有办法把它变成一个循环以使其更具包容性?

r - 循环更改多个数据框