2

假设页面大小为 1KB,我如何计算代码中的 TLB 未命中数,如下面的代码片段:

int i;
int p[1024];
for (i=0; i<1024; i++)
    p[i]=0;

我有兴趣了解能够计算几乎每个给定代码片段中的 TLB 未命中数的一般规则,除了知道此代码片段的#TLB 未命中数。

4

1 回答 1

3

不可能有任何直截了当的答案。答案会因处理器而异。首先,TLB(条目数)的大小是不一样的。其次,处理器倾向于使用算法来保留更有价值的条目(正如他们所相信的那样)并丢弃其他条目。这些算法从未发布过。

除此之外,TLB的某些部分将用于读取指令,某些部分将被操作系统使用。这意味着您无法知道确切的结果。

维基百科提供以下信息:

  • 大小:12 - 4,096 个条目;
  • 命中时间:0.5 - 1 个时钟周期;
  • 未命中惩罚:10 - 100 个时钟周期;
  • 未命中率:0.01 - 1%。

在您的示例中,您将需要 5 个页面的 1024 个 4 字节整数数组,因为您的数组很可能不是页面边界对齐的。一旦循环访问,每个页面都会在 TLB 中占据一席之地。这个初始位置可以被视为 TLB 未命中吗?据我所知,没有明确的答案。有些人可能会回答是,有些人会回答不是。我会回答不。

当 TLB 的大小不足以存储算法所需的所有页面时,这无疑被称为 TLB 未命中。在您的情况下,如果 TLB 只有 2 个条目,那么将有 3 个未命中。

于 2013-10-27T02:54:54.157 回答