我觉得有点愚蠢不得不问这个问题,但我找不到一个非常错综复杂的方法来做这件事。
我有以下循环:
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::vector
的int
,所以我有一系列指数可以迭代。那会是荒谬的。std::generate_n
和一些虚拟输出迭代器来丢弃它分配的任何内容。因为我认为std
中没有这个,所以我必须自己编写完整的虚拟迭代器。无论如何,这当然是一个愚蠢的黑客行为。获得正确的索引可能需要使用std::atomic<int>
进行手动跟踪,因为您无法了解当前的索引。有没有办法匹配最简单和基本的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);
}
}
);