假设页面大小为 1KB,如何计算类似以下代码片段的代码中的 TLB 未命中数:
int i;
int p[1024];
for (i=0; i<1024; i++)
p[i]=0;
除了知道#TLB 未命中数之外,我有兴趣了解能够计算几乎每个给定代码片段中 TLB 未命中数的一般规则。
最佳答案
不可能有任何直接的答案。答案会因处理器而异。首先,TLB(条目数)的大小是不一样的。其次,处理器倾向于使用算法来保留更有值(value)的条目(正如他们认为的那样)并丢弃其他条目。这些算法从未发表过。
除此之外,TLB 的一部分将用于读取指令,某些部分将被操作系统使用。这意味着您无法知道确切的结果。
维基百科提供以下信息:
在您的示例中,您将需要 5 个页面的 1024 个 4 字节整数数组,因为您的数组很可能不是对齐的页面边界。一旦在循环中访问每个页面,它就会在 TLB 中占有一席之地。这个初始放置可以被视为 TLB 未命中吗?据我所知,没有明确的答案。有些人可能会回答是,有些人会回答不是。我会回答没有。
当TLB的大小不足以存储算法所需的所有页面时,这无可争议地称为TLB未命中。在您的情况下,如果 TLB 只有 2 个条目,则将有 3 次未命中。
关于c - 如何在代码片段中查找 TLB 未命中数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19613697/