1

我有一个并行化的 C++ 程序,可以进行蛮力优化。出于某种原因,我每核心的收益递减最多约 6 个核心,此时我撞到了一堵墙,进一步的核心增加了〜没有速度。这在 8 或 16 核机器上运行时是一致的。

当我运行时,strace -f ./progname我会得到一大堆在程序的多线程部分特别发生的以下内容:[pid 2646] mprotect(0x7ffe7c030000, 4096, PROT_READ|PROT_WRITE) = 0

以及其中一些一个接一个发生的事件:[pid 2645] mprotect(0x7ffe78030000, 4096, PROT_READ|PROT_WRITE <unfinished ...>-[pid 2646] <... mprotect resumed> ) = 0

他们并不总是来自同一个pid

当我减少核心数量时,我收到的上述消息较少,而在 2 或 3 个核心时,我没有收到任何消息。

我唯一能猜到的是,这可能与大量的向量分配和在每个线程中完成的访问有关。如果相关,我不会使用任何其他内存管理库。

4

1 回答 1

3

我有一个并行化的 C++ 程序,可以进行蛮力优化。出于某种原因,我每核心的收益递减最多约 6 个核心,此时我撞到了一堵墙,进一步的核心增加了〜没有速度。这在 8 或 16 核机器上运行时是一致的。

你能描述一下算法吗?许多计算算法都受内存限制。

尝试使用 , 来分析您的应用程序oprofileperf或者如果无法使用 , gprof

我唯一能猜到的是,这可能与大量的向量分配和在每个线程中完成的访问有关。如果相关,我不会使用任何其他内存管理库。

缓解 TLB 压力的一个超级简单的方法是使用大页面(假设您的硬件支持它)。在 linux 上你可以使用libhugetlbfs它的morecore钩子。

HUGETLB_MORECORE=yes LD_PRELOAD=libhugetlbfs.so  ./brute_force_optimization
于 2011-11-25T04:01:16.463 回答