这是部分的cachegrind输出。这一部分代码已被执行为1224次。elmg1是一系列unsigned long的尺寸16×20.我的机器L1高速缓存的大小32KB,64缓线的大小和8的方式设定相联。

  1. (i=0;我 < 20;我++) 78,336 2,448 2 50,184 0 0 1,224 0 0
  2. {
  3. telm01=elmg1[i];146,880 0 0 73,440 0 0 24,480 0 0
  4. telm31=(telm01 << 3)^val1;97,920 0 0 48,960 0 0 24,480 0 0
  5. telm21=(telm01 << 2)^(val1>>1);146,880有1,224 1 48,960 0 0 24,480 0 0
  6. telm11=(telm01 << 1)^(val1>>2);146,880 0 0 48,960 0 0 24,480 0 0
  7. }

A.其原因我已经把它放在这里的是,在3号线内的循环,我看到了一些I1想念(一个L2近)。它是有点令人困惑,我不能猜测的原因为什么?

B。我想要优化(时间上)的一部分代码。以上只是一个小段。我想在我的节目内存入一个花费我很多。像在上面的例子elmg1是一系列的16x20尺寸的未签名的渴望.当我试图使用它的代码中,总是有一些失误,和在我的程序,这些变量发生了很多。任何建议?

C.我需要分配和(有时初始化)的这些未签署的渴望.你可以建议哪一个我应该愿意,calloc或阵列宣言》和随后明确的初始化。通过这种方式会有任何差异的方式缓处理他们?

谢谢。

有帮助吗?

解决方案

你有没有试着要解开的循环?

  1. 我不会担心L1错过了现在。还有一个L2错过的1224次是确定的,cpu有负价值进入缓存在一些点。
  2. 什么样的百分比L2不会错过这个代码的成本相比,其余的计划?
  3. 使用calloc(),如果所列大小都是一样,你使用常数的大小,那么编译器可以优化零'ing的阵列。也唯一的事情,会影响的高速缓冲线的用途是准,不是它是如何initizliated.

编辑:数,很难阅读,阅读他们的看法是错误的第一次。

让我们确保我读数正确的,用于第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指令缓存。

I1错过在线1和5的总3672这是3次1224,因此,每次循环的运行,你得到3I1cache misses与64字节缓线意味着你的循环码尺寸之间128-192字节以复盖3缓线。因此,这些I1错过在第5行,因为这是该循环码跨越最后的高速缓存线。

我会推荐使用某些回答呈查结果cachegrind

编辑:更多关于缓线。

这一循环码看起来并不像它正在呼叫1224次通过本身,所以这意味着有更多的代码,是推动这种代码出的I1缓存。

你32Kbyte I1缓划分为512缓线(64字节每个)。"8-方式设置的关联"的一部分意味着,每一个存储的地址是映射到只有8这些512缓线。如果整个程序的你的个人资料是一个连续的框32Kbytes的记忆,然后它会适合进入I1缓和没有人会被喷出。这是很可能是在$没有的情况下,将有更多的然后8 64字节的代码块满足于针对相同的8缓线。可以说,你的整个程序具有1m的代码(这包括图书馆),然后每组8缓线将有大约32(1m/32Kbyte)段代码满足于对这些相同的8缓线。

读这个lwn.net 条为所有的细节约CPU缓存

编译器不能总是检测它的功能的程序将热点地区(所谓的许多许多倍),并将codespots(即错误的处理程序的代码,其中几乎从来没有运行).海湾合作委员会具有功能性 热/冷 这将让你标记的功能热/冷,这将允许编译器组的热功能结合在一起,在一个街区的存储器,以获得更好的高速缓存的使用(即冷码不会推动hotcode出的缓存).

不管怎么说这些I1错过真的很不值得花时间来担心的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top