问题标签 [cachegrind]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - 为什么 cachegrind 忽略了 L3 缓存,与文档相矛盾?
我想了解人们如何进行缓存优化,一位朋友建议我使用 cachegrind 作为实现此目标的有用工具。
Valgrind 是一个 CPU 模拟器,在使用 cachegrind 时假设有 2 级缓存,如此处所述
Cachegrind 模拟您的程序如何与机器的缓存层次结构和(可选)分支预测器进行交互。它模拟具有独立的一级指令和数据缓存(I1 和 D1)的机器,由统一的二级缓存 (L2) 支持。这与许多现代机器的配置完全匹配。
下一段继续为
然而,一些现代机器具有三级或四级缓存。对于这些机器(在 Cachegrind 可以自动检测缓存配置的情况下),Cachegrind 模拟第一级和 最后一级缓存。这种选择的原因是最后一级缓存对运行时的影响最大,因为它屏蔽了对主存的访问。
然而,当我尝试在我的简单矩阵-矩阵乘法代码上运行 valgrind 时,我得到了以下输出。
根据文档,应该使用 L1 和 L3 缓存,但输出显示 L3 缓存被忽略。这是为什么?
cachegrind 是否也预先假定 L1 和最后一级缓存大小是多少,或者它是否使用当前运行的 CPU 的 L1 和最后一级缓存大小?
xdebug - QCacheGrind 源代码路径错误
尝试使用 QCacheGrind 分析我的代码并且一切正常,但我看不到程序中的源代码。
由于某种原因,源代码路径错误。
现在是cachegrind file location
+php file location
应该只是php file location
macos - xdebug.profiler_enable 导致 cachegrind 文件占用过多内存
早上好,
我的 Mac 今天的工作内存用完了,这很奇怪。我检查了空间的使用位置,它在我的 log/xdebug 文件中,将近 20 GB 的 cachegrind.out 文件!我只使用了 xdebug.profiler_enable 大约 3-4 周,并且我正在使用 PHPStorm 进行一些调试,尽管不多。
我如何告诉 xdebug 删除超过 x 个条目或只保存 x 兆字节的数据?
还是有什么大错特错?
作为参考,我的堆栈是 OSX 本机 Apache,带有用于 PHP 的 mod_fastcgi,以及使用自制软件安装的 PHP 和 MariaDB。通常在 Drupal 上开发,是的,PHP 5.4 上的 Drupal 6 会抛出一堆错误,因为它一直支持 PHP 4。Blech。还是20场?哎呀。这就像一天的演出。
提前致谢!
mysql - MySQL 会话的调用图
我正在尝试创建valgrind
MySQL 客户端连接的 (cachegrind) 分析。
我正在valgrind
运行--trace-children=yes
。
我要查找的是内部方法调用之一,在使用时查看调用图...
运行后,valgrind
--trace-children=yes ./bin/mysqld_safe
我得到了当时编写的许多转储文件。
我正在等待 5 分钟(让我希望创建的新文件具有不同的“最后修改”日期。
在这 5 分钟之后,我打开了 30 个会话,并用小事务淹没了系统,当我完成后 - 关闭 MySQL。
现在的问题:
1.运行30个事务并关闭系统后,只修改了3个文件。我预计会看到 30 个文件,因为我虽然 MySQL 跨越进程。所以首先 - 有人可以确认 MySQL 跨越线程而不是每个会话的进程吗?
我看到三个不同的数据库日志调用:一个到 DUMMY,一个到
binlog
,一个到innodb
日志。有人可以解释为什么 thebinlog
和 DUMMY 在那里,它们之间有什么区别?(我猜 DUMMY 是因为,但如果我的第一个猜测是真的innodb
,我不明白为什么存在)。binlog
有没有更好的方法来做这个分析?
有没有这样的工具kcachegrind
可以打开多个文件并显示所有文件的摘要?(或者有可能以某种方式在内部kcachegrind
?)
谢谢!!
顺便说一句 - 对于扩展和开发 MySQL 的人来说 - 那里有很多有趣的事情可以改进......
c++ - 如何在 C++ 中编写指令缓存友好的程序?
最近 Herb Sutter 做了一场关于“现代 C++:你需要知道的事情”的精彩演讲。本次演讲的主题是效率以及数据局部性和访问内存的重要性。他还解释了 CPU 将如何喜欢内存(数组/向量)的线性访问。他从另一本经典参考“鲍勃·尼斯特罗姆的游戏表现”中就该主题举了一个例子。
阅读这些文章后,我了解到有两种类型的缓存会影响程序性能:
- 数据缓存
- 指令缓存
Cachegrind工具还测量我们程序的缓存类型检测信息。许多文章/博客已经解释了第一点以及如何实现良好的数据缓存效率(数据局部性)。
但是,我没有得到太多关于指令缓存主题的信息,以及我们在程序中应该注意哪些事情才能获得更好的性能?根据我的理解,我们(程序员)对执行哪条指令或执行什么顺序没有太多控制。
如果小型 c++ 程序能够解释这个计数器(即指令缓存)如何随着我们编写程序的风格而变化,那就太好了。在这一点上,程序员应该遵循哪些最佳实践来获得更好的性能?
我的意思是我们可以理解数据缓存主题,如果我们的程序以类似的方式(向量与列表)可以解释第二点。这个问题的主要目的是尽可能地理解这个话题。
intel - 我不了解 cachegrind 与 perf 工具之间的缓存未命中计数
我正在使用一个简单的微基准研究缓存效果。
我认为如果 N 大于缓存大小,那么缓存在每个第一次读取缓存行时都会进行一次未命中操作。
在我的机器中,缓存行大小=64Byte,所以我认为完全缓存发生 N/8 未命中操作,缓存研磨表明。
但是,性能工具显示不同的结果。它仅发生 34,265 次缓存未命中操作。
我怀疑硬件预取,所以在BIOS中关闭这个功能。无论如何,结果是一样的。
我真的不知道为什么 perf 工具的缓存未命中发生比“cachegrind”非常小的操作。有人能给我一个合理的解释吗?
1. 这是一个简单的微基准程序。
2. 以下结果是 cachegrind 的输出:
3. 以下结果是 perf 的输出:
更多实验结果(2014.05.13):
在上面的结果中,“L1D 硬件预取请求”的数量似乎是 cachegrind 上的 D1 未命中(1,250,000)。
在我的结论中,如果内存访问“流模式”,则启用 L1D 预取功能。由于 LLC 缺失信息,我无法检查从内存中加载了多少字节。
我的结论正确吗?
编者注:
(1)根据 的输出cachegrind
,OP 很可能使用了没有优化的 gcc 4.6.3。
(2) 中使用的一些原始事件perf stat
仅在 Nehalem/Westmere 上得到官方支持,所以我认为这就是 OP 正在使用的微架构。
(3) 原始事件代码中最高有效字节(即第三字节)中设置的位被 忽略perf
。(虽然不是第三个字节的所有位都被忽略。)因此事件实际上是 r024e、r014e、r0f0a 和 r0109。
(4) 事件 r0f0a 和 r0109 是非核心事件,但 OP 已将它们指定为核心事件,这是错误的,因为perf
会将它们测量为核心事件。
debian - 如何限制 xdebug-profiler 创建的 cachegrind 文件
有没有办法限制 cachegrind 文件(xdebug 分析输出)?我想启用 xdebug.profile 来调试整个项目(不仅是触发器),但如果有人忘记禁用它,我不希望磁盘已满。
我在分析器文档中没有找到类似的选项。
linux - Cachegrind 没有显示函数级结果?
我正在使用 Valgrind 的 Cachegrind 分析我的 C++ 应用程序,使用此终端行:
从我看到的在线指南中,这应该会自动显示功能级别的分析结果。但是,我只得到程序级的结果。
我还需要指定什么才能查看每个函数的结果?
更新
好的,我需要运行这个:
得到函数级的结果。
valgrind - 在 Valgrind 中限制 Cachegrind 的数据收集
众所周知,该套装的callgrind
分析工具 提供了通过命令行指令或. 例如,以下代码将仅在小时后收集数据。valgrind
callgrind_control -i on
callgrind_control -i off
该工具是否有类似的选项cachegrind
?如果是这样,我该如何使用它(我在文档中找不到任何内容)?如果不是,我怎样才能在一定时间后开始收集数据cachegrind
?
caching - 缓存使用和派生类型
我是使用 valgrind 和 cachegrind 分析代码的新手,最近我开始使用这些工具来查看我的代码在缓存利用率方面的表现。我发现一个简单的 if 语句似乎几乎每次执行都会导致缓存未命中。例如,我在 Fortran 程序中使用了以下派生类型:
此示例表示位置空间中的 100 个单元格,其中最多可以包含 50 个由其位置和动量描述的粒子。该代码使用一个简单的粒子移动器来更新粒子在给定时间步的位置和动量。为了实现这一点,我使用如下循环:
通过包含 if 语句,我认为当给定单元格中没有粒子时,我将通过循环循环来加速代码。但是,我使用 valgrind 和 cachegrind 工具对我的代码进行了一些分析,发现这个简单的 if 语句几乎总是会导致缓存未命中。--auto=yes
以下是使用 cg_annotate 并启用选项的 if 语句的结果示例:
几乎每次执行时,这似乎都是缓存未命中。在循环单元格时,我在我的代码中经常这样做,我认为这会导致速度大幅下降。这是使用派生类型的结果吗?有没有办法提高这里的缓存利用率,或者一般来说使用派生类型?
为了完整起见,我使用 gfortran 4.8.3 进行编译并使用以下标志:-g -O3 -ffast-math -mcmodel=medium -fdefault-real-8