我有一个并行化的 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 个核心时,我没有收到任何消息。
我唯一能猜到的是,这可能与大量的向量分配和在每个线程中完成的访问有关。如果相关,我不会使用任何其他内存管理库。