gpt4 book ai didi

c - 我怎样才能导致指令缓存未命中?

转载 作者:IT王子 更新时间:2023-10-29 00:20:22 24 4
gpt4 key购买 nike

我的任务是生成一定数量的数据缓存未命中和指令缓存未命中。我已经能够毫无问题地处理数据缓存部分。

所以我只剩下生成指令缓存未命中。我不知道是什么原因造成的。有人可以建议生成它们的方法吗?

我在 Linux 中使用 GCC。

最佳答案

正如人们所解释的,指令缓存未命中在概念上与数据缓存未命中相同 - 指令不在缓存中。这是因为处理器的程序计数器 (PC) 已跳转到尚未加载到缓存中的位置,或者由于缓存已满而被刷新,并且该缓存行是被选择用于逐出的行(通常是最近最少使用)。

与强制数据高速缓存未命中相比,手动生成足够的代码来强制指令未命中要难一些。

一种不费吹灰之力就能获得大量代码的方法是编写一个生成源代码的程序。

例如编写一个程序来生成一个带有巨大 switch 语句的函数(在 C 中)[警告,未经测试]:

printf("void bigswitch(int n) {\n    switch (n) {");
for (int i=1; i<100000; ++i) {
printf(" case %d: n += %d;\n", n, n+i/2);
}
printf(" }\n return n;}\n");

然后你可以从另一个函数调用它,你可以控制它沿着缓存行跳转的大小。

switch 语句的一个属性是可以强制代码向后执行,或者通过选择参数以模式执行。因此,您可以使用预取和预测机制,或者尝试对付它们。

同样的技术也可用于生成大量函数,以确保可以随意“破坏”缓存。因此,您可能有 bigswitch001、bigswitch002 等。您可以使用您也生成的开关来调用它。

如果您可以使每个函数(大约)具有一定数量的 i-cache 行大小,并且还生成比缓存中容纳的函数更多的函数,那么生成指令缓存未命中的问题将变得更容易控制。

通过转储汇编器(使用 gcc -S)或 objdump .o 文件,您可以准确地查看一个函数、整个 switch 语句或 switch 语句的每一段有多大。因此,您可以通过调整 case: 语句的数量来“调整”函数的大小。您还可以通过明智地选择 bigswitchNNN() 的参数来选择命中多少缓存行。

关于c - 我怎样才能导致指令缓存未命中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10588567/

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