C++ 如何识别阻碍我的程序在32核CPU上良好扩展的瓶颈?
我写了一个程序,工作得很好。我现在想在我们的32核机器(AMD Threadripper 2990wx、128GB DDR4 RAM、Ubuntu 18.04)上并行运行32个独立的实例。但是,在同一台机器上并发运行大约12个进程之后,性能增益几乎为零。我现在需要优化这个。以下是平均加速比的曲线图: 我想确定这个缩放瓶颈的来源 我想知道可用的技术,在我的代码中,是否有任何“热门”部分阻止32个进程产生显著的收益,而不是12个 我猜这与内存访问和NUMA架构有关。我尝试使用C++ 如何识别阻碍我的程序在32核CPU上良好扩展的瓶颈?,c++,performance,optimization,concurrency,profiling,C++,Performance,Optimization,Concurrency,Profiling,我写了一个程序,工作得很好。我现在想在我们的32核机器(AMD Threadripper 2990wx、128GB DDR4 RAM、Ubuntu 18.04)上并行运行32个独立的实例。但是,在同一台机器上并发运行大约12个进程之后,性能增益几乎为零。我现在需要优化这个。以下是平均加速比的曲线图: 我想确定这个缩放瓶颈的来源 我想知道可用的技术,在我的代码中,是否有任何“热门”部分阻止32个进程产生显著的收益,而不是12个 我猜这与内存访问和NUMA架构有关。我尝试使用numactl进行实验
numactl
进行实验,并为每个进程分配一个核心,但没有明显的改进。
应用程序的每个实例最多使用大约1GB的内存。它是用C++编写的,没有“并行代码”(没有线程,没有互斥,没有原子操作),每个实例都是完全独立的,没有进程间通信(我只是用NoHUP,通过BASH脚本启动它们)。该应用程序的核心是基于代理的模拟:许多对象被逐步创建、相互交互并定期更新,这可能不太利于缓存
我曾尝试使用linuxperf
,但我不确定我应该寻找什么;此外,perf的mem模块在AMD CPU上不工作。
我也尝试过使用AMDuProf
,但我不确定这个系统范围的瓶颈会出现在哪里
非常感谢您的帮助。问题可能是Threadripper架构。它是32核CPU,但这些核心分布在4个NUMA节点之间,其中一半未直接连接到内存。所以你可能需要
问题可能是螺纹裂土器结构。它是32核CPU,但这些核心分布在4个NUMA节点之间,其中一半未直接连接到内存。所以你可能需要
请花些时间阅读,尤其是名为的章节。也请阅读,以及。最后,请不要忘记如何创建。请看一看“英特尔VTune放大器”以及Valgrind与cachegrind。此外,如果能看到您强大的缩放数字,那就太好了。1、2、4、8等进程的执行时间是什么样子。好的。我试着编辑这个问题,以便它更关注可用的工具和技术来识别源代码中的瓶颈,以便我能够对其进行优化。问题是问题的范围很广,因为我不确定系统规模的瓶颈在哪里。这也可能是一个无法解决的硬件或操作系统限制,我只是不太清楚。我还添加了一个情节来更好地了解执行时间。这对我来说是一个相当重要的问题。我很想知道在这个问题上我能做些什么和改进,使它不再被搁置?你的程序内存密集吗?或者它能很好地利用片上缓存吗?请花一些时间阅读,尤其是命名为的部分。也请阅读,以及。最后,请不要忘记如何创建。请看一看“英特尔VTune放大器”以及Valgrind与cachegrind。此外,如果能看到您强大的缩放数字,那就太好了。1、2、4、8等进程的执行时间是什么样子。好的。我试着编辑这个问题,以便它更关注可用的工具和技术来识别源代码中的瓶颈,以便我能够对其进行优化。问题是问题的范围很广,因为我不确定系统规模的瓶颈在哪里。这也可能是一个无法解决的硬件或操作系统限制,我只是不太清楚。我还添加了一个情节来更好地了解执行时间。这对我来说是一个相当重要的问题。我很想知道在这个问题上我能做些什么和改进,使它不再被搁置?你的程序内存密集吗?或者它能充分利用片上缓存吗?谢谢。是的,我想正是这种架构处于瓶颈的核心。我曾尝试使用numactl为每个进程(以及相应的内存节点)分配一个内核,但没有取得多大成功。对于你的建议3,我想这更难。这基本上意味着只使用一半的CPU核。谢谢。是的,我想正是这种架构处于瓶颈的核心。我曾尝试使用numactl为每个进程(以及相应的内存节点)分配一个内核,但没有取得多大成功。对于你的建议3,我想这更难。这基本上意味着只使用一半的CPU核。