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界限是指完成计算所需的时间主要由等待输入/输出操作完成的时间决定的一种情况。