std::transform 或 std::generate 在没有 ExecutionPolicy 的情况下是否可以并

Can std::transform or std::generate without ExecutionPolicy be parallel?

本文关键字:std 情况下 是否 transform generate ExecutionPolicy      更新时间:2023-10-16

在C++17中引入了并行std算法(使用ExecutionPolicy参数重载(,其中定义了严格的执行顺序,交错和平行化规则,例如([algorithm.parallel.exec/3](:

并行

算法中元素访问函数的调用,执行策略对象为 类型执行::sequenced_policy都发生在执行的调用线程中。[ 注意:调用不是交错的;见 4.6。

(当前草案中也是如此(

问题是我找不到对这些算法的旧的非并行重载的任何此类要求。

问题:这是否意味着库实现者可以从引入执行术语线程的 C++11 开始,使用 SIMD/多线程/其他(?( 实现 std::transform 和 std::generate ?这有什么原因吗?

[res.on.data.races]/8 除非另有说明,否则C++标准库函数应仅在当前线程内执行所有操作,前提是这些操作对用户可见 (4.7( 的效果。

这排除了接触任何用户定义实体的任何类型的幕后多线程。

我想,原则上,像std::sortvector<int>上工作这样的事情可以证明不涉及用户定义的类,并将工作发送到多个线程。这是相当牵强的,很难想象在实践中有任何实现这样做。

相关文章: