C++<numeric>中6类输出型算法及并行版的输入输出范围是否可重叠?
C++ 中扫描类算法的输入输出范围重叠规则
非并行版本(无执行策略参数)
partial_sum:明确支持原地计算,输出起始迭代器可以和输入起始完全重合。因为它按从左到右的顺序逐步计算,每个新值只依赖之前的结果,不会覆盖还没读取的输入元素。adjacent_difference:同样允许原地操作,计算第i个结果只需要输入的第i和i-1个元素,顺序处理时不会破坏未读取的输入数据。inclusive_scan/exclusive_scan:非并行模式下默认顺序执行,支持输入输出范围重叠(包括原地计算),逻辑和partial_sum一致,逐步计算不会提前覆盖未读取的输入。transform_inclusive_scan/transform_exclusive_scan:非并行版本也支持原地计算,只要变换操作无副作用且顺序执行时不会干扰输入读取,输入输出范围可以重叠。
并行版本(带execution_policy重载)
所有上述算法的并行版本严格要求输入范围和输出范围不相交。原因很简单:并行执行时,多个线程会同时处理不同位置的元素,如果范围重叠,某个线程可能还没读取输入元素,就被另一个线程写入了该位置的输出值,直接导致数据竞争和未定义行为。C++标准里并行算法的通用规则也明确,除非算法特别说明允许,否则输入输出范围不能重叠,而这些算法的并行版本没有例外条款。
内容的提问来源于stack exchange,提问作者o_oTurtle
相关产品推荐
相关产品推荐

