std::execution::unseq在C++20中,添加了另一个执行策略: 。这意味着,算法将在当前线程上执行,但不保证操作将按元素的顺序完成。
将其添加到语言中的理由是什么?它可以实现哪些优化?据我查看实现情况,这个标志几乎被完全视为seq,除非我错过了一些东西(可能是)。根据我的经验,编译器已经识别出可以向量化的循环(对于简单类型),并且由于“as-if”规则,向量化是可能的,无需任何特殊标志。那么,有什么std::execution::unseq变化呢?
\n\n那么, std::execution::unseq 改变了什么?
\n
标准说(最新草案):
\n\n\n[execpol.unseq]
\n类unsequenced_\xc2\xadpolicy 是一种执行策略类型,用作唯一类型来消除并行算法重载的歧义,并指示并行算法的执行可以被矢量化,例如,使用对多个数据项进行操作的指令在单个线程上执行。
\n
\n[算法.parallel.exec]
\n使用类型为execution\xe2\x80\x8b::\xe2\x80\x8bunsequenced_\xc2\xadpolicy 的执行策略对象调用的并行算法中元素访问函数的调用允许在调用执行线程中以无序方式执行,在调用执行线程中彼此之间没有顺序。
\n[注 4:这意味着多个函数对象调用可以在单个执行线程上交错,这会覆盖 [intro.execution] 中函数执行不会相互重叠的通常保证。\n\xe2\x80\x94尾注]
\n
\n\n编译器已经识别出可以向量化的循环
\n
有些编译器有时可能足够聪明,可以检测到矢量化是可能的,并猜测它是有益的。但这并不简单,而且并不总是有效。通过告诉编译器矢量化是可以的并且是可取的,就不会涉及猜测。
\n| 归档时间: |
|
| 查看次数: |
548 次 |
| 最近记录: |