在C++20中,添加了另一个执行策略:std::execution::unseq。这意味着,算法将在当前线程上执行,但不能保证操作将按元素的顺序完成。
将其添加到语言中的理由是什么?它实现了哪些优化?就我在整个实现中所看到的,这个标志几乎被视为seq,除非我遗漏了一些东西(很可能)。在我的经验中,编译器已经识别出他们可以矢量化的循环(对于简单类型),并且由于"as-if“规则,矢量化是可能的,而不需要任何特殊的标志。那么,std::execution::unseq改变了什么呢?
发布于 2021-07-07 17:49:47
那么,std::
::unseq有什么变化呢?
标准说(最新草案):
execpol.unseq
类unsequenced_policy是用作唯一类型的执行策略类型,以消除并行算法过载的歧义,并指示并行算法的执行可以是矢量化的,例如,使用对多个数据项进行操作的指令在单个线程上执行。
algorithms.parallel.exec
允许用类型为execution::unsequenced_policy的执行策略对象调用的并行算法中的元素访问函数的调用在执行的调用线程中以无序的方式执行,在执行的调用线程中彼此是无序的。
[注4:这意味着多个函数对象调用可以在单个执行线程上交错,这覆盖了intro.execution对函数执行不相互重叠的通常保证。-结束语]
编译器已经识别出它们可以矢量化的循环
一些编译器有时可能足够聪明,能够检测到向量化是可能的,并猜测它是有益的。但这并不简单,也不会总是奏效。通过告诉编译器向量化是可以的和可取的,就不会涉及猜测了。
发布于 2021-08-31 11:26:43
除了eerorika回答之外
标准说
在使用execution::unsequenced_policy策略执行并行算法期间,如果元素访问函数的调用通过未捕获的异常退出,则应调用
()。
这可能会使编译器有机会更积极地优化您的代码
https://stackoverflow.com/questions/68283505
复制相似问题