我试图在C ++中对大型对象向量进行并行操作。我之前用Java编写过并行程序,但我刚开始使用C ++。
当前代码在向量上使用迭代器。什么是最快的并行化方法?我目前的想法是......
使用.size()函数并通过向量使用forloop。但是,我担心.size()函数的运行时,是O(N)还是O(1)? forloops还会比使用迭代器慢吗?
以某种方式拆分向量,并行创建新向量的迭代器?如果是这样,那么用快速运行时分割矢量的好方法是什么?
或者有更快的方法吗?
答案 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添加到列表中。