- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是 cachegrind 输出的一部分。这部分代码已经执行了1224次。 elmg1 是一个大小为 16 x 20 的 unsigned long 数组。我的机器 L1 缓存大小为 32KB,64B 缓存行大小和 8 路组关联。
一个。我把它放在这里的原因是,在 for 循环内的第 3 行,我看到了一些 I1 未命中(还有一个 L2 未命中)。这有点令人困惑,我猜不出原因是什么?
B.我正在尝试优化(时间)一部分代码。以上只是一个小片段。我认为在我的程序内存访问中花费了我很多。与上面的示例一样,elmg1 是一个 16 x 20 大小的无符号长数组。当我尝试在代码中使用它时,总会有一些遗漏,而在我的程序中这些变量经常出现。有什么建议吗?
C.我需要分配和(有时初始化)这些无符号长整型。你能建议我更喜欢哪一个,calloc 或数组声明,然后显式初始化。顺便问一下,缓存处理它们的方式会有什么不同吗?
谢谢。
最佳答案
你试过展开循环吗?
edit: 数字很难以这种方式阅读并且第一次读错了。
确保我读的是第 5 行的数字:
Ir 146,880
I1mr 1,224
ILmr 1
Dr 48,960
D1mr 0
DLmr 0
Dw 24,480
D1mw 0
DLmw 0
L1 缓存分为两个 32KByte 缓存,一个用于代码 I1,一个用于数据 D1。 IL & DL是数据和指令共享的L2或L3缓存。
大量的 I1mr 是指令未命中而不是数据未命中,这意味着循环代码正在从 I1 指令缓存中弹出。
第 1 行和第 5 行的 I1 未命中总数为 3672,是 1224 的 3 倍,因此每次循环运行时,您都会得到 3 次 I1 缓存未命中和 64 字节缓存行,这意味着您的循环代码大小在 128-192 字节之间以覆盖 3缓存行。所以第 5 行的那些 I1 未命中是因为这是循环代码穿过最后一个缓存行的地方。
I would recommend using KCachegrind for viewing the results from cachegrind
编辑:关于缓存行的更多信息。
那个循环代码看起来不像它自己被调用了 1224 次,所以这意味着有更多的代码将这个代码推出 I1 缓存。
你的 32Kbyte I1 缓存被分成 512 个缓存行(每行 64 字节)。 “8-way set associative”部分意味着每个内存地址仅映射到这 512 个缓存行中的 8 个。如果您要分析的整个程序是一个连续的 32 KB 内存块,那么它会全部放入 I1 高速缓存,并且不会被弹出。这很可能不是这种情况,将有超过 8 个 64 字节的代码块满足相同的 8 个缓存行。假设您的整个程序有 1MB 的代码(包括库),那么每组 8 个缓存行将有大约 32(1Mbyte/32Kbyte)段代码满足这 8 个缓存行。
Read this lwn.net article for all the gory details about CPU caches
编译器无法始终检测程序的哪些函数将成为热点(多次调用),哪些将成为代码点(即错误处理程序代码,几乎从不运行)。 GCC 具有函数属性 hot/cold这将允许您将函数标记为热/冷,这将允许编译器将热函数组合在一个内存块中以获得更好的缓存使用(即冷代码不会将热代码推出缓存)。
无论如何,那些 I1 失误真的不值得花时间去担心。
关于Cachegrind输出解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4066937/
我目前正在学习 Linux 下的各种分析和性能实用程序,尤其是 valgrind/cachegrind。 我有以下玩具程序: #include #include int main() {
我需要提高系统的吞吐量。 通常的优化周期已经完成,我们已经实现了 1.5 倍的吞吐量。 我现在开始怀疑是否可以利用 cachegrind 输出来提高系统的吞吐量。 有人可以指出我如何开始吗? 我的理解
Inspired by SQLite ,我正在考虑使用 valgrind 的“cachegrind”工具来进行可重复的性能基准测试。它输出的数字比我发现的任何其他计时方法都要稳定得多,但它们仍然不是确
是否有任何工具可以分析一个充满 xdebug 转储的文件夹? 当我们在生产服务器上短时间启用 Xdebug 分析时,我们总是会得到数百个文件,这需要花费大量时间在 WinCacheGrind 或 KC
我的源代码: $ cat play.c int main() { return 0; } 在其上构建并运行 cachegrind: $ gcc -g -Wall play.c -o play &&
出于好奇,我编写了几个不同版本的矩阵乘法并针对它运行了 cachegrind。在下面的结果中,我想知道哪些部分是 L1、L2、L3 未命中和引用,它们的真正含义是什么?下面是我的矩阵乘法代码,以防万一
如果我运行 Valgrind cachegrind,一个或多个线程的结果会不同吗?还是 Valgrind 只是将程序顺序化,只报告一个线程的工作? 最佳答案 Valgrind 以不确定的方式序列化所有
是否有某种方法可以检查应用程序中的哪些查询速度较慢,并且可以使用某种工具进行优化,尽可能不引人注意地允许您单击 Web 应用程序并跟踪其中查询的性能? 我正在使用带有准备好的语句的 PHP PDO 来
在尝试优化代码时,我对 kcachegrdind 和 gprof 生成的配置文件的差异感到有点困惑。具体来说,如果我使用 gprof(使用 -pg 开关编译等),我有这个: Flat profile:
有这样的事情吗? 我在 Windows 上使用 WinCacheGrind 应用程序,它似乎不适用于大文件 (~2 MB)。我收到类似“找不到调用目标”的错误。 您知道用 PHP 编写的此类文件的任何
Looking to profile my web app, I have added the following settings to my Applications php.ini file:
我正在对两种搜索算法的缓存行为进行基准测试,这两种搜索算法使用 Cachegrind 对已排序的项目范围进行操作。我在一个 vector 中有 n 个项目,另一个 vector 包含所有有效索引。我在
我正在尝试为 cachegrind 配置 Xdebug,但我无法启用探查器功能以转储已执行的网页。 我正在使用 the official guide (还有一些具有类似设置的)并且它似乎不起作用。 我
见鬼去吧。我在 apache/php 服务器上安装了 XDEBUG 作为 ZEND 模块。它输出分析文件,但输出不包含函数名称,仅包含数字。 我看起来不像其他 cachegrind 输出文件。我的文件
我想了解人们如何进行缓存优化, friend 向我推荐了 cachegrind作为实现这一目标的有用工具。 Valgrind 是一个 CPU 模拟器,假设有一个 2 级缓存,如前所述 here , 当
有什么方法可以限制 cachegrind 文件(xdebug 分析输出)? 我想启用 xdebug.profile 来调试整个项目(不仅仅是触发器),但如果有人忘记禁用它,我不希望光盘已满。 我在 t
我是一名优秀的程序员,十分优秀!