c – 如何使用循环中的所有核心?

一个循环.
for (int i = 0; i < n; ++i) {
    //...
    v[i] = o.f(i);
    //...
}

每个v [i] = o.f(i)独立于所有其他v [i] = o.f(i).
n可以是任何值,也可以不是核心数的倍数.使用所有核心执行此操作的最简单方法是什么?

解决方法

<算法>中的算法的 ExecutionPolicy重载.为此目的而存在. std::transform函数应用于源范围的每个元素以分配给目标范围.

v.begin()是一个可接受的目的地,只要v的大小合适即可.你的代码片段在使用v [i]时会假设这一点,所以我也会这样做.

然后我们需要一个迭代器,它将值[0,n)作为我们的源,所以boost::counting_iterator<int>.

最后,我们需要一个将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不执行任何“矢量化 – 不安全操作”,则可以使用std::execution::par_unseq,它可以在同一个线程上交错调用(即展开循环并使用SIMD指令)

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...