【问题标题】:C++ Linux Multithread bottleneck. strace -f : `[pid 2646] mprotect(0x7ffe7c030000, 4096, PROT_READ|PROT_WRITE) = 0`C++ Linux 多线程瓶颈。 strace -f : `[pid 2646] mprotect(0x7ffe7c030000, 4096, PROT_READ|PROT_WRITE) = 0`
【发布时间】:2011-11-25 03:49:14
【问题描述】:

我有一个并行化的 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 个核心时,我没有收到任何消息。

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

【问题讨论】:

    标签: c++ linux multithreading strace


    【解决方案1】:

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

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

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

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

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

    HUGETLB_MORECORE=yes LD_PRELOAD=libhugetlbfs.so  ./brute_force_optimization
    

    【讨论】:

    • 算法有很多。基本上我有一个vector <vector <float> >,它定义了 n 组权重。在每次迭代中,我分配第二个临时的vector <vector <float> 来保存 n 组加权输入总和,每次迭代都使用第一个 vector 中的权重进行计算。这种情况每秒发生 150K 次(在瓶颈处),分布在 m 个线程中。还有一些辅助算法可以随机改变权重等。我将尝试上面的建议。
    • 好的,对于巨大的 tlb 实验:不要忘记分配一些巨大的页面并创建一个 hugetlbfs 挂载。另请参阅:hugectl(8)howto
    • 分配大页面并创建hugetlbfs 挂载的技术性如何?我已经查看了这两个链接,它似乎相当复杂。我对 Linux 还是很陌生。
    • 你愿意带我完成这个吗?另外,我想我应该提到我的程序使用的内存不到 10mb。那么在这种情况下,TLB 可能是问题所在?
    • 权重及其总和中的 10MB 数据?不,TLB 压力可能不是主要因素。缓存位置可能是。
    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多