gpt4 book ai didi

c - 缓存提供的空间局部性是指虚拟内存、物理内存还是两者兼而有之?

转载 作者:行者123 更新时间:2023-12-02 02:49:19 24 4
gpt4 key购买 nike

我试图理解为什么可以以某种方式编写使用数组(例如矩阵乘法)的程序来利用缓存的空间局部性。

  • 缓存提供的空间局部性是指虚拟内存、物理内存或两者中的局部性吗?
    当计算机系统将一块数据从主内存带入 CPU 缓存时,它是否将虚拟或物理上连续的数据对象带入 CPU 缓存?
  • 当我们以非动态方式或动态方式(通过 malloc())定义一个数组或结构对象时,连续分配这样的数组或对象是否正确? “连续”是指虚拟内存还是物理内存或两者兼而有之?

  • 如果缓存的空间局部性是用于物理内存而不是虚拟内存,并且操作系统可以分配给 C 程序实际上不一定是物理连续的数组,那么我们如何编写程序来利用缓存的空间局部性?

    谢谢。

    最佳答案

    1) 真的两者都有,但为什么是微妙的。

    2) 缓存对称为行的数据块进行操作,行内的字节在虚拟和物理上都是连续的。典型的行大小为 16、32、64 字节。
    如果两个相邻的高速缓存线位于同一页内,则它们在物理上必须是连续的。典型的页面大小为 4、8、16 K。因此,具有 32 字节缓存行和 4K 基页的机器每页有 128 行。

    3,4) 在结构的 C 成员中, union 或数组实际上是连续的。它是否在物理上是连续的取决于操作系统。

    (1) 第 2 部分:还有另一个缓存称为转换后备缓冲区 (TLB),它保留最近使用的页面映射。如果没有这样的机制,每个内存引用都需要两个物理内存引用:一个用于加载内存地址转换,然后应用它来生成所需的内存引用。

    假设您的 TLB 有 32 个条目(这些天非常小),并且您有这样的代码遍历数组:

    char *p;
    for (p = array; p < array + 4096; p++) {
    char *q;
    for (q = p; q < p + 32 * 4096; q += 4096) {
    *q += 1;
    }
    }

    你可以有效地模拟一台没有 TLB 的机器,因为“*q”的每个内存引用都会在 TLB 中丢失,需要从内存中获取。

    如果您知道缓存关联性和大小的详细信息,您可以为内存缓存构建一个类似的病态案例;或者如果你不走运,你可能会不小心碰到它,想知道为什么你的程序这么慢。

    关于c - 缓存提供的空间局部性是指虚拟内存、物理内存还是两者兼而有之?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52955107/

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