我有一张地图和地图矢量:
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());
我的问题是:我应该并行化这个插入,还是让这个并行只会产生更多的开销并使事情变得更糟?
答案 0 :(得分:2)
不要这样做!您的代码很可能不 CPU绑定,因为循环内几乎没有计算。如果它花了太长时间(我怀疑),那是因为你正在分配和初始化大量内存。这些分配不会随着并行性而消失,因此你的并行代码肯定会运行得更慢。
来自维基百科:
在计算机科学中,当计算机完成任务的时间主要取决于中央处理器的速度时,计算机受CPU限制(或计算限制):处理器利用率很高,可能在100%的使用时间内持续很长时间或分钟。
在计算机科学中,I / O界限是指完成计算所花费的时间主要取决于等待输入/输出操作完成所花费的时间的条件。这与CPU绑定的任务相反。
I / O绑定状态被认为是不合需要的,因为这意味着CPU必须在等待从主存储器或辅助存储器加载或卸载数据时停止其操作。
所以是的,CPU正在“进行”插入,但“执行”插入只需要很少的实际计算(1%),并且非常需要等待RAM赶上(99%)。插入需要存储在某个地方,对吗?
因此,在你的问题上投入更多的CPU根本没有用,因为瓶颈就是你的RAM。
答案 1 :(得分:1)
最终答案取决于objVect中元素的数量:如果它很小,则由于创建线程而产生的开销可能高于迭代的顺序执行。一种好的技术是创建一个线程池,以及一个队列,您的线程可以在其中查找要完成的作业。我的建议的最终结果是在执行开始时只创建有限数量的线程,然后在迭代期间重用它们