Это не имеет значения, если ваш компьютер заполнен сверхбыстрой памятью.
Но, к сожалению, дело не в этом, и память компьютера выглядит примерно так 1 :
+----------+
| CPU | <<-- Our beloved CPU, superfast and always hungry for more data.
+----------+
|L1 - Cache| <<-- works at 100% of CPU speed (fast)
+----------+
|L2 - Cache| <<-- works at 25% of CPU speed (medium)
+----+-----+
|
| <<-- This thin wire is the memory bus, it has limited bandwidth.
+----+-----+ <<-- works at 10% of CPU speed.
| main-mem | <<-- The main memory is big but slow (because we are cheap-skates)
+----------+
|
| <<-- Even slower wire to the harddisk
+----+-----+
| harddisk | <<-- Works at 0,001% of CPU speed
+----------+
Пространственная местность
На этой диаграмме чем ближе данные к ЦП, тем быстрее ЦП может добраться до него.
Это связано с Spacial Locality
. Данные имеют пространственную локализацию, если они расположены близко друг к другу в памяти.
Из-за дешевых коньков, которые мы являемся оперативной памятью, на самом деле это не произвольный доступ, это действительно Slow if random, less slow if accessed sequentially Access Memory
SIRLSIAS-AM. DDR SDRAM передает одну серию из 32 или 64 байтов для одной команды чтения или записи.
Вот почему разумно хранить связанные данные близко друг к другу, чтобы вы могли последовательно читать кучу данных и экономить время.
Временная местность
Данные остаются в основной памяти, но они не могут оставаться в кэше, иначе кэш перестает быть полезным. Самые последние использованные данные можно найти в кеше; старые данные выталкиваются.
Это связано с temporal locality
. Данные имеют сильную временную локализацию, если к ним обращаются одновременно.
Это важно, потому что, если элемент A находится в кэше (хорошо), то, скорее всего, элемент B (с сильной временной привязкой к A) также будет в кэше.
Сноска 1:
Это упрощение с процентами, составленными для примера, но оно дает правильное представление о порядке для типичных процессоров.
На самом деле задержка и пропускная способность являются отдельными факторами, причем задержку труднее улучшить для памяти дальше от ЦП. Но предварительная выборка HW и / или exec-of-exec может скрыть задержку в некоторых случаях, например, циклическое выполнение по массиву. При непредсказуемых шаблонах доступа эффективная пропускная способность памяти может быть намного ниже, чем 10% кеша L1d.
Эта упрощенная версия также исключает эффекты TLB (локальность гранулярности страницы) и локальность DRAM-страницы. (Не то же самое, что страницы виртуальной памяти). Чтобы глубже погрузиться в аппаратную часть памяти и настроить программное обеспечение для нее, см. Что должен знать каждый программист о памяти?
Related: Почему размер кэша L1 меньше, чем размер кэша L2 в большинстве процессоров? объясняет, почему многоуровневая иерархия кэша необходима для получения комбинации задержки / пропускной способности и емкость (и скорость попадания) мы хотим.
Один огромный быстрый кэш данных L1 будет чрезмерно дорогостоящим, и все же даже невозможен при такой низкой задержке, как небольшой быстрый кэш L1d в современных высокопроизводительных процессорах.
В многоядерных процессорах кэш-память L1i / L1d и L2 обычно является частным кешем для каждого ядра с общим кешем L3. Разные ядра должны конкурировать друг с другом за пропускную способность L3 и память, но у каждого есть своя пропускная способность L1 и L2. См. Как кеш может быть таким быстрым? для эталонного результата от двухъядерного процессора IvyBridge 3GHz: суммарная пропускная способность чтения кэша L1d на обоих ядрах 186 ГБ / с против 9,6 ГБ / с пропускной способности чтения DRAM с оба ядра активны. (Таким образом, память = 10% L1d для одноядерных процессоров является хорошей оценкой пропускной способности для процессоров настольных компьютеров этого поколения, имеющих только 128-битные пути загрузки / хранения данных SIMD). И задержка L1d 1,4 нс против задержки DRAM 72 нс