【发布时间】:2018-07-05 11:59:56
【问题描述】:
在为 std::for_each 等 STL 算法指定 std::execution::par 执行策略时,如何使用迭代器?
在下面的示例中,我希望对 Eigen3 矩阵的对角线求平方根,如下所示:
template<typename T>
using Matrix = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
template<typename T>
std::vector<T> getStdDev(const Matrix &x) const {
const size_t len = x.rows();
std::vector<T> stdDev(len);
// Generate indices.
size_t idx = 0;
std::vector<size_t> indices(len);
auto ind = [&idx]() {
return idx++;
};
std::generate(indices.begin(), indices.end(), ind);
// Take square root of diagonal elements.
auto sr = [&x](size_t i) {
stdDev[i] = std::sqrt(x(i, i));
};
std::for_each(std::execution::par, indices.begin(), indices.end(), sr);
return stdDev;
}
据我所知,上面的代码是线程安全的。但是,如果不首先生成所需的索引,如何以 线程安全 方式使用迭代器实现相同的效果,如上所述?假设要迭代的容器没有实现迭代器,或者没有线程安全的迭代器。
理想情况下,我希望通用地执行此操作(我知道 Eigen 具有迭代器,此处仅用于示例目的)。
此外,最好只使用 C++ 功能(没有库,但任何非草案标准)。
【问题讨论】:
-
啊,是的,那部分是用浏览器写的。当然,这应该是串行执行的。我要编辑。
标签: c++ parallel-processing stl iterator c++17