速度/效率:我应该并行化这个std :: map Insert吗?

时间:2014-02-25 17:38:52

标签: c++

我有一张地图和地图矢量:

std::map <key, obj> baseValues;
std::vector< std::map<key, obj> > mapContainer;

我想将baseValues合并到mapContainer的每个元素中,如下所示:

for(std::map <key, obj>& aMap: mapContainer)
            aMap.insert(baseValues.begin(), baseValues.end());

我的问题是:我应该并行化这个插入,还是让这个并行只会产生更多的开销并使事情变得更糟?

2 个答案:

答案 0 :(得分:2)

不要这样做!您的代码很可能 CPU绑定,因为循环内几乎没有计算。如果它花了太长时间(我怀疑),那是因为你正在分配和初始化大量内存。这些分配不会随着并行性而消失,因此你的并行代码肯定会运行得更慢。

更新:CPU / IO绑定

来自维基百科:

  

在计算机科学中,当计算机完成任务的时间主要取决于中央处理器的速度时,计算机受CPU限制(或计算限制):处理器利用率很高,可能在100%的使用时间内持续很长时间或分钟。

     

在计算机科学中,I / O界限是指完成计算所花费的时间主要取决于等待输入/输出操作完成所花费的时间的条件。这与CPU绑定的任务相反。

     

I / O绑定状态被认为是不合需要的,因为这意味着CPU必须在等待从主存储器或辅助存储器加载或卸载数据时停止其操作。

所以是的,CPU正在“进行”插入,但“执行”插入只需要很少的实际计算(1%),并且非常需要等待RAM赶上(99%)。插入需要存储在某个地方,对吗?

因此,在你的问题上投入更多的CPU根本没有用,因为瓶颈就是你的RAM。

答案 1 :(得分:1)

最终答案取决于objVect中元素的数量:如果它很小,则由于创建线程而产生的开销可能高于迭代的顺序执行。一种好的技术是创建一个线程池,以及一个队列,您的线程可以在其中查找要完成的作业。我的建议的最终结果是在执行开始时只创建有限数量的线程,然后在迭代期间重用它们