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