谁决定内存访问模式?
Who decides the memory access pattern?
我正在尝试了解内存访问模式。我的问题很简单。谁决定内存访问模式?
- 我通过给
gcc
作为参数来决定程序的模式。因此,我可以根据我的代码进行设置。
- 我的OS决定内存访问模式。因此,我无法为我的任何程序更改它。
- 我的 CPU 决定使用什么内存访问模式。因此,我 PC 上的任何 OS 运行 都使用该模式。
Who decides the memory access pattern?
大部分;编写代码的人通过他们所做的选择来决定内存访问模式。
举个愚蠢的例子;如果您决定遍历一个数组(如 for(i = 0; i <= size; i++) { do_something(&my_array[i]); }
),那么您已经形成了一个很好的线性访问模式;如果您决定改为遍历链表(如 while(current != NULL) { do_something(current); current = current->next; }
),那么您的访问模式可能会相对不稳定。
但是;在某些情况下,compiler/linker 可能会尝试优化内存访问模式。这主要只是稍微改变了细节(个别 reads/writes 的确切顺序,而不是整体模式本身),但在某些情况下,编译器可以进行更明显的优化(主要涉及嵌套循环和数组)。
注1:结果很可能是“虚拟内存访问模式”。在下面会有一个完整的内存层次结构——OS 将控制虚拟内存到物理内存的映射(并处理诸如交换 space 等的事情);然后会有多级缓存和其他内置于硬件中的“类似缓存的东西”。 None 这件事。它使实际访问的内容变得复杂(哪个缓存的哪一部分,或者哪个物理内存,或者交换 space 的哪一部分,或者......)但是访问仍然会以相同的顺序发生(并且以相同的模式) 不管实际访问的是什么。
注2:典型的程序很少是simple/single算法。如果一个程序(网络浏览器、电脑游戏、编译器等)有数百个部分,那么该程序的访问模式将是每个部分的各个访问模式的某种组合。
我正在尝试了解内存访问模式。我的问题很简单。谁决定内存访问模式?
- 我通过给
gcc
作为参数来决定程序的模式。因此,我可以根据我的代码进行设置。 - 我的OS决定内存访问模式。因此,我无法为我的任何程序更改它。
- 我的 CPU 决定使用什么内存访问模式。因此,我 PC 上的任何 OS 运行 都使用该模式。
Who decides the memory access pattern?
大部分;编写代码的人通过他们所做的选择来决定内存访问模式。
举个愚蠢的例子;如果您决定遍历一个数组(如 for(i = 0; i <= size; i++) { do_something(&my_array[i]); }
),那么您已经形成了一个很好的线性访问模式;如果您决定改为遍历链表(如 while(current != NULL) { do_something(current); current = current->next; }
),那么您的访问模式可能会相对不稳定。
但是;在某些情况下,compiler/linker 可能会尝试优化内存访问模式。这主要只是稍微改变了细节(个别 reads/writes 的确切顺序,而不是整体模式本身),但在某些情况下,编译器可以进行更明显的优化(主要涉及嵌套循环和数组)。
注1:结果很可能是“虚拟内存访问模式”。在下面会有一个完整的内存层次结构——OS 将控制虚拟内存到物理内存的映射(并处理诸如交换 space 等的事情);然后会有多级缓存和其他内置于硬件中的“类似缓存的东西”。 None 这件事。它使实际访问的内容变得复杂(哪个缓存的哪一部分,或者哪个物理内存,或者交换 space 的哪一部分,或者......)但是访问仍然会以相同的顺序发生(并且以相同的模式) 不管实际访问的是什么。
注2:典型的程序很少是simple/single算法。如果一个程序(网络浏览器、电脑游戏、编译器等)有数百个部分,那么该程序的访问模式将是每个部分的各个访问模式的某种组合。