Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何识别阻碍我的程序在32核CPU上良好扩展的瓶颈?_C++_Performance_Optimization_Concurrency_Profiling - Fatal编程技术网

C++ 如何识别阻碍我的程序在32核CPU上良好扩展的瓶颈?

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进行实验

我写了一个程序,工作得很好。我现在想在我们的32核机器(AMD Threadripper 2990wx、128GB DDR4 RAM、Ubuntu 18.04)上并行运行32个独立的实例。但是,在同一台机器上并发运行大约12个进程之后,性能增益几乎为零。我现在需要优化这个。以下是平均加速比的曲线图:

我想确定这个缩放瓶颈的来源

我想知道可用的技术,在我的代码中,是否有任何“热门”部分阻止32个进程产生显著的收益,而不是12个

我猜这与内存访问和NUMA架构有关。我尝试使用
numactl
进行实验,并为每个进程分配一个核心,但没有明显的改进。 应用程序的每个实例最多使用大约1GB的内存。它是用C++编写的,没有“并行代码”(没有线程,没有互斥,没有原子操作),每个实例都是完全独立的,没有进程间通信(我只是用NoHUP,通过BASH脚本启动它们)。该应用程序的核心是基于代理的模拟:许多对象被逐步创建、相互交互并定期更新,这可能不太利于缓存

我曾尝试使用linux
perf
,但我不确定我应该寻找什么;此外,perf的mem模块在AMD CPU上不工作。 我也尝试过使用AMD
uProf
,但我不确定这个系统范围的瓶颈会出现在哪里


非常感谢您的帮助。

问题可能是Threadripper架构。它是32核CPU,但这些核心分布在4个NUMA节点之间,其中一半未直接连接到内存。所以你可能需要

  • 为所有进程设置处理器亲缘关系,以确保它们不会在核心之间跳转
  • 确保在正常NUMA节点上运行的进程只访问直接连接到该节点的内存
  • 在受损NUMA节点上的核心上施加更少的负载

  • 问题可能是螺纹裂土器结构。它是32核CPU,但这些核心分布在4个NUMA节点之间,其中一半未直接连接到内存。所以你可能需要

  • 为所有进程设置处理器亲缘关系,以确保它们不会在核心之间跳转
  • 确保在正常NUMA节点上运行的进程只访问直接连接到该节点的内存
  • 在受损NUMA节点上的核心上施加更少的负载

  • 请花些时间阅读,尤其是名为的章节。也请阅读,以及。最后,请不要忘记如何创建。请看一看“英特尔VTune放大器”以及Valgrind与cachegrind。此外,如果能看到您强大的缩放数字,那就太好了。1、2、4、8等进程的执行时间是什么样子。好的。我试着编辑这个问题,以便它更关注可用的工具和技术来识别源代码中的瓶颈,以便我能够对其进行优化。问题是问题的范围很广,因为我不确定系统规模的瓶颈在哪里。这也可能是一个无法解决的硬件或操作系统限制,我只是不太清楚。我还添加了一个情节来更好地了解执行时间。这对我来说是一个相当重要的问题。我很想知道在这个问题上我能做些什么和改进,使它不再被搁置?你的程序内存密集吗?或者它能很好地利用片上缓存吗?请花一些时间阅读,尤其是命名为的部分。也请阅读,以及。最后,请不要忘记如何创建。请看一看“英特尔VTune放大器”以及Valgrind与cachegrind。此外,如果能看到您强大的缩放数字,那就太好了。1、2、4、8等进程的执行时间是什么样子。好的。我试着编辑这个问题,以便它更关注可用的工具和技术来识别源代码中的瓶颈,以便我能够对其进行优化。问题是问题的范围很广,因为我不确定系统规模的瓶颈在哪里。这也可能是一个无法解决的硬件或操作系统限制,我只是不太清楚。我还添加了一个情节来更好地了解执行时间。这对我来说是一个相当重要的问题。我很想知道在这个问题上我能做些什么和改进,使它不再被搁置?你的程序内存密集吗?或者它能充分利用片上缓存吗?谢谢。是的,我想正是这种架构处于瓶颈的核心。我曾尝试使用numactl为每个进程(以及相应的内存节点)分配一个内核,但没有取得多大成功。对于你的建议3,我想这更难。这基本上意味着只使用一半的CPU核。谢谢。是的,我想正是这种架构处于瓶颈的核心。我曾尝试使用numactl为每个进程(以及相应的内存节点)分配一个内核,但没有取得多大成功。对于你的建议3,我想这更难。这基本上意味着只使用一半的CPU核。