我想用来std::for_each并行迭代范围内的向量索引,计算Weierstrass 函数[a, b)的值并将其写入:std::vector
std::vector<std::array<float, 2>> values(1000);
auto range = /** equivalent of Pyhthon range(0, values.size()) **/;
std::for_each(std::execution::par, range.begin(), range.end(), [&](auto &&i) {
values[i][0] = static_cast<float>(i) / resolution;
values[i][1] = weierstrass(a, b, static_cast<float>(i) / resolution);
});
// a, b, and resolution are some constants defined before
// weierstrass() is the Weierstrass function
Run Code Online (Sandbox Code Playgroud)
我在互联网上找到了一些解决方案,但所有这些解决方案都需要包含一些第三方库或创建我自己的范围类。有没有标准的解决方案?
由于在c ++ 17中没有基于索引的算法并行,我想知道是否可以结合使用来模拟。那是:ranges::view::iotastd::for_each
using namespace std;
constexpr int N= 10'000'000;
ranges::iota_view indices(0,N);
vector<int> v(N);
for_each(execution::par_unseq,indices.begin(),indices.end(),[&](int i) { v[i]= i; });
Run Code Online (Sandbox Code Playgroud)
iota_view似乎提供了对适当类型的随机访问([range.iota.iterator]):
iota_view<I, Bound>::iterator::iterator_category定义如下:(1.1) -如果
I模型Advanceable,然后iterator_category是random_access_iterator_tag。(1.2) -否则,如果
I模型Decrementable,然后iterator_category是bidirectional_iterator_tag。(1.3) -否则,如果
I模型Incrementable,然后iterator_category是forward_iterator_tag。(1.4)-否则
iterator_category为input_iterator_tag。
上面的代码正确吗?使用iota_view这种方式是否会降低性能?
编辑:我已经使用range-v3,cmcstl2和Intel的PSTL进行了一些测试。
使用range-v3,以上示例无法使用GCC …