我觉得不得不问这个问题有点愚蠢,但我就是找不到一种简单的方法来做到这一点。
我有以下循环:
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::vector
的int
只是为了让我有一系列索引可以迭代。但这很荒谬。我可以使用
std::generate_n
使用一些虚拟输出迭代器丢弃分配给它的任何内容。因为我认为这在std
中不可用我将不得不自己编写完整的虚拟迭代器。无论如何,这当然是一个愚蠢的黑客攻击。获得正确的索引可能需要使用std::atomic<int>
进行手动跟踪。因为您不知道您当前的索引。我真的没有可以循环的容器。我的意思是,在这些函数的深处某处有容器,但重构所有内容以便我可以在这个循环中对一些容器使用迭代器是不可能的。
用 15 分钟谷歌搜索对此的不同描述并没有让我到任何地方。
有什么方法可以匹配最朴实最基本的for
用 <algorithm>
循环不涉及愚蠢废话的工具?
最佳答案
如果使用 boost ,您可以使用 boost::irange
(在 boost-range 中)生成这样的计数循环:
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/