在C ++中使用向量并行化操作的最快方法?

时间:2014-04-03 19:18:46

标签: c++ vector parallel-processing

我试图在C ++中对大型对象向量进行并行操作。我之前用Java编写过并行程序,但我刚开始使用C ++。

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

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

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

  3. 或者有更快的方法吗?

4 个答案:

答案 0 :(得分:2)

  

但是,我担心.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);

答案 1 :(得分:0)

如果矢量没有被迭代器修改,我将矢量划分为N个部分,并将每个线程赋予其一个矢量,之后,如果需要,一个线程总结所有其他线程的结果。

答案 2 :(得分:0)

调查boost线程。我发现它们非常直观

答案 3 :(得分:0)

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