我正在尝试理解kcachegrind,那里似乎没有太多信息,例如,在左侧窗口,什么是“Self”,什么是“incl。”? (见1 core)。
我做了一些弱缩放测试,没有通信,所以我的猜测是它与缓存未命中有关。但据我所知,1核和16核的数据丢失数量相同,请参阅:16 cores。
我在1核心和16核心之间可以看到的唯一区别是,对16个核心的memcpy的调用要少得多(我可以解释)。但我仍然无法弄清楚为什么在一个内核上,执行时间为0.62秒,而在16个内核上,执行时间接近1秒。每个处理器都在做同样的工作。如果有人能告诉我在kcachegrind中寻找什么,那就太棒了,这是我第一次使用kcachegrind和valgrind。
编辑:我的代码以压缩行格式连接矩阵。它涉及循环子矩阵的条目,并使用memcpy将值复制到结果矩阵中。 这是代码: - 我不能发布超过2个链接...所以我会在评论中发布它。
我只在循环本身启动了valgrind,循环也是0.62秒执行时间和1秒执行时间之间的区别。花费最多时间的部分是对memcpy的调用(下面github要点中的第37行),当我评论出来时,我的代码执行时间不到0.2秒,尽管仍然有1到16个内核之间的增加(约增加30%)。
我在haswell节点上运行我的代码,该节点由24个内核组成(两个Intel®Xeon®处理器E5-2690 v3)
每个核心都有5GB的内存。
答案 0 :(得分:0)
那里似乎没有太多的信息,例如,在左侧窗口,什么是&#34; Self&#34;,什么是&#34; incl。&#34;?< / p>
令人惊讶的是,这是kcachegrind FAQ中第一个常见问题。具体来说,从该链接:
...区分功能本身的成本(&#39;自我成本&#39;)和包括所有被叫功能的成本(&#39;包含成本&#39; [incl。])是有意义的
现在,您还没有显示任何代码,甚至没有提示您的程序是什么,但是......
从我所看到的情况来看,1核和16核都有相同数量的数据丢失......
如果您有一些固定数量的数据可以开始工作,并且它在缓存之外启动,那么将需要相同数量的未命中来覆盖它。
您还没有提供有关您的硬件平台的任何线索,因此我不知道您是否在具有统一最后一级缓存的单个套接字上有16个内核,或者4x4以及您的最后一级缓存未命中在这些套接字之间划分,或者是什么。
但我仍然无法解决为什么在一个内核上,执行时间为0.62秒,而在16个内核上,执行时间接近1秒
也许它的同步成本。也许它是在valgrind下运行的神器。也许它是别的东西。也许没有人可以真正帮助分析您的代码,而无需任何有关代码的信息。
如果有人能告诉我在kcachegrind中寻找什么...
你想找到什么?你的代码在做什么?没有在valgrind下运行的时候还有时差吗?您使用的是哪些库,哪些操作系统以及哪些硬件平台?