我有一个并行化的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 分配和访问有关。如果相关,我不会使用任何其他内存管理库。
最佳答案
你能描述一下算法吗?许多计算算法受内存限制。
尝试使用oprofile
,perf
或如果不可能的话,使用gprof
对应用程序进行性能分析。
减轻TLB压力的一种 super 简单方法是使用大页面(大概是您的硬件支持它)。在Linux上,您可以使用libhugetlbfs
及其morecore
Hook 。
HUGETLB_MORECORE=yes LD_PRELOAD=libhugetlbfs.so ./brute_force_optimization