0

我试图了解kcachegrind,那里似乎没有太多信息,例如,在左侧窗口中,什么是“Self”,什么是“incl.”?(见1 个核心)。

我做了一些弱扩展测试,没有通信,所以我猜这与缓存未命中有关。但据我所见,1 核和 16 核的数据未命中数相同,请参阅:16 cores

我可以看到 1 核和 16 核之间的唯一区别是,在 16 核上调用 memcpy 的次数要少得多(我可以解释)。但我仍然无法弄清楚为什么在一个核心上,执行时间是 0.62 秒,而在 16 个核心上,执行时间更接近 1 秒。每个处理器都在做相同数量的工作。如果有人能告诉我在 kcachegrind 中寻找什么,那就太棒了,这是我第一次使用 kcachegrind 和 valgrind。

编辑:我的代码以压缩行格式连接矩阵。它涉及循环子矩阵的条目并使用 memcpy 将值复制到结果矩阵中。这是代码: - 我不能发布超过 2 个链接......所以我会在评论中发布它。

我只在循环本身上启动了 valgrind,循环也是 0.62 秒执行时间和 1 秒执行时间之间的差异。花费最多时间的部分是对 memcpy 的调用(下面 github gist 中的第 37 行),当我将其注释掉时,我的代码执行时间不到 0.2 秒,尽管 1 到 16 个内核之间仍然有增加(大约增加 30%)。

我在一个包含 24 个内核的 haswell 节点上运行我的代码(两个英特尔® 至强® 处理器 E5-2690 v3)

每个核心有 5GB 内存。

4

1 回答 1

0

那里似乎没有太多信息,例如,在左侧窗口中,“Self”是什么,“incl.”是什么?

令人惊讶的是,这是kcachegrind FAQ中的第一个常见问题。具体来说,从那个链接:

...区分函数本身的成本('Self Cost')和包括所有调用函数的成本('Inclusive Cost' [incl.])是有意义的

现在,您没有显示任何代码,甚至没有提示您的程序做了什么,但是......

据我所知,1 核和 16 核的数据丢失数量相同......

如果您有一些固定数量的数据要处理,并且它在缓存之外开始,那么需要相同数量的未命中来覆盖它是合理的。

您也没有提供有关您的硬件平台的任何线索,所以我不知道您是否在单个插槽上有 16 个内核并具有统一的最后一级缓存,或者 4x4 并且您的最后一级缓存未命中在这些插槽之间进行分区,或者是什么。

但我仍然无法弄清楚为什么在一个核心上,执行时间是 0.62 秒,而在 16 个核心上,执行时间接近 1 秒

也许是同步成本。也许它是在 valgrind 下运行的神器。也许是别的东西。如果没有任何关于代码的信息,也许没有人可以真正帮助分析您的代码。

如果有人能告诉我在 kcachegrind 中寻找什么......

你想找到什么?你的代码在做什么?当不在 valgrind 下运行时,那个时差仍然存在吗?你使用什么库,什么操作系统,什么硬件平台?

于 2016-01-26T16:03:01.700 回答