gpt4 book ai didi

caching - 内联和指令高速缓存命中率和废弃

转载 作者:行者123 更新时间:2023-12-02 00:22:35 27 4
gpt4 key购买 nike

在本文https://www.geeksforgeeks.org/inline-functions-cpp/中,它指出内联的缺点是:


3)过多的内联也会降低指令高速缓存命中率,从而降低了从高速缓存到主存储器的指令获取速度。


内联如何影响指令缓存命中率?


6)内联函数可能会导致崩溃,因为内联可能会增加二进制可执行文件的大小。内存溢出会导致计算机性能下降。


内联如何增加二进制可执行文件的大小?仅仅是增加了代码库的长度吗?此外,对我来说还不清楚为什么具有较大的二进制可执行文件会导致抖动,因为两者似乎没有链接。

最佳答案

关于内联为什么会损害i-cache命中率或引起抖动的困惑可能在于静态指令计数与动态指令计数之间的差异。内联(几乎总是)减少了后者,但经常增加了前者。

让我们简要地研究一下这些概念。

静态指令计数

某些执行跟踪的静态指令计数是二进制映像中出现的唯一指令的数量。基本上,您只需要数汇编集转储中的指令行即可。以下x86代码段的静态指令计数为5(.top:行是一个不会转换为二进制文件中任何内容的标签):

  mov eci, 10
mov eax, 0
.top:
add eax, eci
dec eci
jnz .top


对于二进制大小和缓存注意事项,静态指令计数最重要。

静态指令计数也可以简称为“代码大小”,我有时在下面使用该术语。

动态指令计数

另一方面,动态指令数取决于实际的运行时行为,并且是执行的指令数。由于循环和其他分支,同一条静态指令可以被计数多次,并且静态计数中包含的某些指令可能根本不会执行,因此在动态情况下不会计数。上面的代码段的动态指令计数为 2 + 30 = 32:前两个指令执行一次,然后循环执行10次,每次迭代执行3条指令。

作为非常粗略的近似,动态指令数对于运行时性能至关重要。

权衡

为了提高运行时性能(通常与动态指令数密切相关),许多优化(例如循环展开,函数克隆,矢量化等)都增加了代码大小(静态指令数)。

内联也是这样的优化,尽管对于某些调用站点而言,内联会减少动态和静态指令计数。


内联如何影响指令缓存命中率?


本文提到了太多的内联,这里的基本思想是很多内联通过增加工作集的静态指令数而通常减少其动态指令数而增加了代码占用量。由于典型的指令高速缓存1会缓存静态指令,因此较大的静态占用空间意味着高速缓存压力增加,并经常导致较差的高速缓存命中率。

静态指令计数增加是因为内联本质上在每个调用站点上都复制了函数体。因此,最终得到的是函数主体的 N副本,而不是函数主体的一个副本和一些多次调用函数 N的指令。

现在,这是一个非常幼稚的模型,它说明了内联的工作方式,因为在内联之后,可能是在特定的调用站点的上下文中可以进行进一步的优化,这可能会大大减少内联代码的大小。在非常小的内联函数或大量后续优化的情况下,由于内联后的其余代码(如果有的话)可能小于调用函数2所涉及的开销,因此内联后所得的代码可能会更小。

尽管如此,基本思想仍然存在:太多的内联会膨胀二进制映像中的代码。

i缓存的工作方式取决于某些执行的静态指令计数,或更具体地取决于二进制映像中接触的指令缓存行的数量,这在很大程度上是静态指令计数的直接函数。也就是说,i缓存会缓存二进制映像的区域,因此即使动态指令数恰好变少,区域也越大,它们越大,缓存占用空间就越大。


内联如何增加二进制可执行文件的大小?


这与上面的i-cache情况完全相同:较大的静态占用空间意味着需要分页输入更多不同的页面,从而可能给VM系统带来更大的压力。现在,我们通常以兆字节为单位来衡量代码大小,而服务器,台式机等设备上的内存通常以千兆字节来衡量,因此过多的内联不太可能对此类系统的崩溃产生有意义的影响。在更小或嵌入式的系统上,这可能是一个问题(尽管后者通常根本没有MMU)。



0此处的唯一性是指,例如,指令的IP,而不是编码指令的实际值。您可能会在二进制文件的多个位置找到 inc eax,但是每个 call在此意义上都是唯一的,因为它们出现在不同的位置。

1有一些例外,例如某些类型的跟踪缓存。

2在x86上,必要的开销几乎只是 指令。根据呼叫站点的不同,可能还存在其他开销,例如将值洗牌到正确的寄存器中以遵守ABI,以及溢出呼叫者保存的寄存器。更一般而言,仅由于编译器必须在整个函数调用中重置其许多假设(例如内存状态)而使函数调用的成本较高。

关于caching - 内联和指令高速缓存命中率和废弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49334487/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com