【问题标题】:Parallel std::copy complexity并行 std::copy 复杂度
【发布时间】:2020-07-05 00:03:32
【问题描述】:

这是来自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,对吧?那么我们如何复制那种对象呢?谁能提供一个我们因此而受到性能损失的例子。

【问题讨论】:

    标签: c++ c++17 c++-standard-library


    【解决方案1】:

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

    不,这里有一个反例,如果复制成本很高,可能会由于无法移动而导致性能损失:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-05
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 2013-05-07
      • 1970-01-01
      • 2023-03-26
      • 2018-08-19
      相关资源
      最近更新 更多