c – 如何使用循环中的所有核心?
发布时间:2020-12-16 03:36:16 所属栏目:百科 来源:网络整理
导读:有一个循环. for (int i = 0; i n; ++i) { //... v[i] = o.f(i); //...} 每个v [i] = o.f(i)独立于所有其他v [i] = o.f(i). n可以是任何值,也可以不是核心数的倍数.使用所有核心执行此操作的最简单方法是什么? 解决方法 算法中的算法的 ExecutionPolicy 重
有一个循环.
for (int i = 0; i < n; ++i) { //... v[i] = o.f(i); //... } 每个v [i] = o.f(i)独立于所有其他v [i] = o.f(i). 解决方法
<算法>中的算法的
ExecutionPolicy 重载.为此目的而存在.
std::transform 将函数应用于源范围的每个元素以分配给目标范围.
v.begin()是一个可接受的目的地,只要v的大小合适即可.你的代码片段在使用v [i]时会假设这一点,所以我也会这样做. 然后我们需要一个迭代器,它将值[0,n)作为我们的源,所以 最后,我们需要一个将o.f应用于我们的值的Callable,所以让我们在lambda中捕获o. #include <algorithm> #include <execution> #include <boost/iterator/counting_iterator.hpp> // assert(v.size() >= n) std::transform(std::execution::par,boost::counting_iterator<int>(0),boost::counting_iterator<int>(n),v.begin(),[&o](int i){ return o.f(i); }); 如果o.f不执行任何“矢量化 – 不安全操作”,则可以使用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |