并行标准::复制复杂性

Parallel std::copy complexity

本文关键字:复杂性 复制 并行 标准      更新时间:2023-10-16

这是cppreference.comstd::copy(https://en.cppreference.com/w/cpp/algorithm/copy(的引用。

Complexity
1-2) Exactly (last - first) assignments
3-4) Exactly (last - first) applications of the predicate, between ​0​ and (last - first) assignments (assignment for every element for which predicate is equal to true, dependent on predicate and input data)
For the overloads with an ExecutionPolicy, there may be a performance cost if ForwardIt1's value type is not MoveConstructible.

很明显,std::copy的并行版本应该做额外的工作来组织并行性,并且其复杂性可能会增加。我想了解它可以高多少以及何时可能发生。

如果值类型不MoveConstructible也意味着它不是CopyConstuctible,对吧?那么我们如何复制这种对象呢?有人可以提供一个例子,我们因此而受到性能损失。

如果值类型不是 MoveConstructible,这也意味着它不是 CopyConstuctible,对吧?

不,这里有一个反例,如果复制成本高昂,可能会因无法移动而造成一些性能损失:

struct S
{
S();
S(const S&);
S& operator=(const S&);
S(S&&) = delete;
S& operator=(S&&) = delete;
};

请注意,OutputIt 是一个单向迭代器,而不是随机访问。 要使并行复制实现性能优势,复制必须以非顺序方式进行,但结果必须按顺序存储到 OutputIt 中。 这就是为什么对象应该是可移动的,以便从多个线程创建它们并按顺序将它们写入 OutputIt,而不管赋值的顺序如何。

事实上,对象是可移动的是不够的,它们必须是廉价的可移动的,以避免额外的运行时成本。