我正在使用一台8核处理器,并且正在使用Boost线程运行一个庞大的程序。 从逻辑上讲,该程序可以分成多个组,每个组由一个线程运行。 在每个组内,一些类总共会调用“new”运算符10000次。 Rational Quantify显示,“new”内存分配占用了程序运行时的最大处理时间,并减慢了整个程序的运行速度。
我可以通过在每个“组”内部使用线程来加快系统速度,使得这10000个内存分配可以并行进行。
我不清楚在这里内存分配将如何被管理。操作系统调度程序真的能够并行分配内存吗?
我正在使用一台8核处理器,并且正在使用Boost线程运行一个庞大的程序。 从逻辑上讲,该程序可以分成多个组,每个组由一个线程运行。 在每个组内,一些类总共会调用“new”运算符10000次。 Rational Quantify显示,“new”内存分配占用了程序运行时的最大处理时间,并减慢了整个程序的运行速度。
我可以通过在每个“组”内部使用线程来加快系统速度,使得这10000个内存分配可以并行进行。
我不清楚在这里内存分配将如何被管理。操作系统调度程序真的能够并行分配内存吗?
在旧版的 Visual Studio 中,默认的 CRT 分配器是阻塞式的,但至少从 Visual Studio 2010 开始,它会直接调用相应的操作系统函数。Windows 堆管理器在 Windows XP 之前一直是阻塞的,在 XP 中,可选的低碎片堆不是阻塞的,而默认的堆则是阻塞的,而新版本的操作系统(如Vista / Win7)默认使用LFH。最近(Windows 7)分配器的性能非常好,与下面列出的可扩展替代品相当(如果针对较旧的平台或需要它们提供的某些其他功能,则仍可能更喜欢它们)。存在数个“可扩展分配器”,具有不同的许可证和不同的缺点。我认为,在Linux上,默认运行时库已经使用可扩展分配器(PTMalloc 的某些变体)。
我知道以下内容:
创建自己的非多线程新内存分配器,每个线程都有其独特的副本。
(您可以覆盖 new 和 delete )
因此,它通过大块分配工作,并且不需要任何锁定,因为每个线程都拥有它自己的内存块。
将您的线程限制为可用核心数。
使用new操作符进行内存分配会存在阻塞问题,因为它需要查找下一个可用的内存位,如果有很多线程同时请求内存,这将变得非常棘手。
内存分配速度较慢 - 如果你需要频繁进行内存分配,特别是在多线程环境下,则需要重新设计。你可以在开始时预先分配足够的空间,或者只分配一个大块内存,然后自己进行划分。
您可能想看一下 The Hoard Memory Allocator:"它是malloc()的替代品,可以显著提高应用程序的性能,特别是在多处理器上运行的多线程程序中。"
您可以尝试并行分配大约8个内存(因为您有8个物理核心),而不是您所写的10000,这是最好的方法。
标准的malloc使用互斥锁,标准的STL分配器也是如此。因此,当引入线程时,它不会自动加速。 然而,您可以使用另一个malloc库(例如搜索“ptmalloc”)来避免使用全局锁定。如果您使用STL进行分配(例如分配字符串、向量),则必须编写自己的分配器。
相当有趣的文章:http://developers.sun.com/solaris/articles/multiproc/multiproc.html