【问题标题】:Fastest Way to Parallelize Operation over a Vector in C++?在 C++ 中对向量进行并行化操作的最快方法?
【发布时间】:2014-04-03 19:18:45
【问题描述】:

我正在尝试在 C++ 中对大量对象进行并行化操作。我以前用 Java 写过并行程序,但我刚刚开始使用 C++。

当前代码在向量上使用迭代器。并行化的最快方法是什么?我现在的想法是……

  1. 使用 .size() 函数并在向量中使用 forloop。但是,我担心 .size() 函数的运行时间,是 O(N) 还是 O(1)? forloops也会比使用迭代器慢吗?

  2. 以某种方式拆分向量,并为新向量并行创建迭代器?如果是这样,什么是快速运行时拆分向量的好方法?

或者有更快的方法吗?

【问题讨论】:

  • 大小是常数时间。就时间复杂度而言,使用 for 循环应该与使用迭代器没有什么不同。但使用迭代器或 for-each 循环优于传统的 for 循环。我不确定你想用分裂做什么。你在问我们如何在 C++ 中分割向量吗?或者它只是线程的编程拆分?向量支持随机访问迭代器。因此,您可以在不同的点设置迭代器并将它们分发给不同的线程进行并行处理。不过要小心任何可能使迭代器无效的事情。

标签: c++ vector parallel-processing


【解决方案1】:

但是,我担心 .size() 函数的运行时间,是吗? O(N) 还是 O(1)?

vector<...>::size() 是 O(1)。

forloops 也会比使用迭代器慢吗?

在大多数情况下,我对此表示怀疑。在某些情况下,可以根据迭代器的值类型优化采用迭代器的算法。对其进行基准测试。

以某种方式拆分向量,并为新向量创建迭代器 在平行下?如果是这样,什么是拆分的好方法 具有快速运行时间的向量?

向量迭代器是随机访问的。只需找到从开始到结束的距离 (O(1)) 并将其分成两半,这是一个非常便宜的操作。

auto begin = v.begin();
auto end = v.end();
auto mid = begin + (end - begin)/2;
algorithm(begin, mid);
algorithm(mid, end);

【讨论】:

【解决方案2】:

如果向量没有被迭代器修改,我会将向量分成 N 个部分,并给每个线程它的向量片段,然后,如果需要,一个线程总结所有其他线程的结果。

【讨论】:

    【解决方案3】:

    查看增强线程。我发现它们非常直观

    【讨论】:

      【解决方案4】:

      我相信这个答案是相关的:https://stackoverflow.com/a/2547725/1524700 根据您的平台,我还会将Intel Threading Building Blocks 添加到列表中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-05
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多