c - 如何在代码片段中查找 TLB 未命中数?

标签 c memory memory-management paging tlb

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

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

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

最佳答案

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

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

维基百科提供以下信息:

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

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

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

    关于c - 如何在代码片段中查找 TLB 未命中数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19613697/

    相关文章:

    c - 如何将字符添加到字符数组

    c# - 字节变量如何存储在内存中?

    ios - 不合理的堆增长

    c++ - 删除从函数返回的指针?

    c - 同一 printf 指令中的 itoa() 和 atoi() 无法正常工作

    c - 使用 scanf 扫描一行带空格的字符串

    c - 如何创建 POSIX 共享消息队列而不将其仅创建为 root 访问权限?

    c++ - 如何复制带有指向内部数据的指针的结构(以便复制指针和它们指向的数据)?

    C内存分配初始化和处理

    memory-management - CUDA 在 __device__ 函数中分配内存