C++ 速度/效率:我应该并行化这个std::map插入吗?
我有一张地图和地图向量:C++ 速度/效率:我应该并行化这个std::map插入吗?,c++,C++,我有一张地图和地图向量: std::map <key, obj> baseValues; std::vector< std::map<key, obj> > mapContainer; std::映射基值; std::vectormapContainer; 我想将baseValues合并到mapContainer的每个元素中,例如: for(std::map <key, obj>& aMap: mapContainer)
std::map <key, obj> baseValues;
std::vector< std::map<key, obj> > mapContainer;
std::映射基值;
std::vectormapContainer;
我想将baseValues合并到mapContainer的每个元素中,例如:
for(std::map <key, obj>& aMap: mapContainer)
aMap.insert(baseValues.begin(), baseValues.end());
for(std::map&aMap:mapContainer)
插入(baseValues.begin(),baseValues.end());
我的问题是:我应该将这个插入并行化,还是使这个并行化只会产生更多的开销并使事情变得更糟?最终的答案取决于objVect中的元素数量:如果它很小,则由于创建线程而产生的开销可能高于迭代的顺序执行。一种好的技术是创建一个线程池和一个队列,线程可以在其中查找要完成的作业。我建议的最终效果是在执行开始时只创建有限数量的线程,然后在迭代过程中重用它们最终答案取决于objVect中的元素数量:如果它很小,则由于创建线程而产生的开销可能高于迭代的顺序执行。一种好的技术是创建一个线程池和一个队列,线程可以在其中查找要完成的作业。我建议的最终效果是在执行开始时只创建有限数量的线程,然后在迭代过程中重用它们最终答案取决于objVect中的元素数量:如果它很小,则由于创建线程而产生的开销可能高于迭代的顺序执行。一种好的技术是创建一个线程池和一个队列,线程可以在其中查找要完成的作业。我建议的最终效果是在执行开始时只创建有限数量的线程,然后在迭代过程中重用它们最终答案取决于objVect中的元素数量:如果它很小,则由于创建线程而产生的开销可能高于迭代的顺序执行。一种好的技术是创建一个线程池和一个队列,线程可以在其中查找要完成的作业。我建议的最终效果是在执行开始时只创建有限数量的线程,然后在迭代过程中重用它们不要这样做!您的代码很可能不受CPU限制,因为循环中几乎没有计算。如果时间太长(我怀疑),那是因为您正在分配和初始化大量内存。这些分配不会随着并行性而消失,因此您的并行代码肯定会运行得更慢 更新:CPU/IO绑定 来自维基百科: 在计算机科学中,当一台计算机完成一项任务的时间主要由中央处理器的速度决定时,它就受到CPU的限制(或计算的限制):处理器的利用率很高,可能在数秒或数分钟内达到100%的利用率 在计算机科学中,I/O界限是指完成计算所需的时间主要由等待输入/输出操作完成的时间决定的一种情况。这与CPU受限的任务相反 I/O绑定状态被认为是不可取的,因为这意味着CPU必须在等待从主存或辅助存储器加载或卸载数据时暂停其操作 因此,是的,是CPU在“执行”插入,但是“执行”插入只需要很少的实际计算(1%),并且需要等待RAM赶上(99%)。插入需要存储在某个地方,对吗
因此,在您的问题上投入更多的CPU根本没有帮助,因为瓶颈是您的RAM。不要这样做!您的代码很可能不受CPU限制,因为循环中几乎没有计算。如果时间太长(我怀疑),那是因为您正在分配和初始化大量内存。这些分配不会随着并行性而消失,因此您的并行代码肯定会运行得更慢 更新:CPU/IO绑定 来自维基百科: 在计算机科学中,当一台计算机完成一项任务的时间主要由中央处理器的速度决定时,它就受到CPU的限制(或计算的限制):处理器的利用率很高,可能在数秒或数分钟内达到100%的利用率 在计算机科学中,I/O界限是指完成计算所需的时间主要由等待输入/输出操作完成的时间决定的一种情况。这与CPU受限的任务相反 I/O绑定状态被认为是不可取的,因为这意味着CPU必须在等待从主存或辅助存储器加载或卸载数据时暂停其操作 因此,是的,是CPU在“执行”插入,但是“执行”插入只需要很少的实际计算(1%),并且需要等待RAM赶上(99%)。插入需要存储在某个地方,对吗
因此,在您的问题上投入更多的CPU根本没有帮助,因为瓶颈是您的RAM。不要这样做!您的代码很可能不受CPU限制,因为循环中几乎没有计算。如果时间太长(我怀疑),那是因为您正在分配和初始化大量内存。这些分配不会随着并行性而消失,因此您的并行代码肯定会运行得更慢 更新:CPU/IO绑定 来自维基百科: 在计算机科学中,当一台计算机完成一项任务的时间主要由中央处理器的速度决定时,它就受到CPU的限制(或计算的限制):处理器的利用率很高,可能在数秒或数分钟内达到100%的利用率 在计算机科学中,I/O界限是指完成计算所需的时间主要由等待输入/输出操作完成的时间决定的一种情况。