我有一个并行化的C++程序,可以进行蛮力优化。出于某种原因,我得到的每核 yield 递减,直至约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个内核中,我什么也没得到。

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

最佳答案



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

尝试使用oprofileperf或如果不可能的话,使用gprof对应用程序进行性能分析。



减轻TLB压力的一种 super 简单方法是使用大页面(大概是您的硬件支持它)。在Linux上,您可以使用libhugetlbfs及其morecore Hook 。

HUGETLB_MORECORE=yes LD_PRELOAD=libhugetlbfs.so  ./brute_force_optimization

09-10 06:25
查看更多