Циклы / стоимость попадания в кэш L1 по сравнению с регистрацией на x86?

Я помню, как предполагал, что попадание в кэш L1 составляет 1 цикл (т.е. идентично времени доступа к регистру) в моем классе архитектуры, но действительно ли это верно для современных процессоров x86?

Сколько циклов занимает попадание в кэш L1? Как это сравнить с регистрационным доступом?


person user541686    schedule 23.04.2012    source источник
comment
Это зависит от процессора, но я не знаю, где бы он был достаточно таким же быстрым, как регистр - обычно на 1–5 тактов медленнее.   -  person Jerry Coffin    schedule 23.04.2012
comment
Я не знаю архитектур, в которых L1 имеет задержку в один цикл. Кроме того, я не знаю ни одной архитектуры x86, где доступ к регистрам сам по себе имеет измеримую задержку (некоторая задержка может ощущаться из-за других факторов).   -  person harold    schedule 24.04.2012
comment
См. 7-cpu.com/cpu/Haswell.html: некоторые индивидуальные числа кэша и задержки для каждого TLB, а также некоторые экспериментальные числа. См. Также pdf-файл microarch Agner Fog и другие ссылки в x86 tag wiki. Задержка использования нагрузки L1 Haswell составляет 4 цикла, что типично для современных процессоров x86. Задержка перезагрузки магазина составляет 5 циклов и не связана с попаданием или отсутствием кеша (это пересылка магазина, а не кеш). Как говорит Гарольд, доступ к регистру составляет 0 циклов (например, inc eax имеет задержку 1 цикл, inc [mem] имеет задержку 6 циклов (ALU + переадресация хранилища).   -  person Peter Cordes    schedule 25.08.2016


Ответы (4)


Вот отличная статья на эту тему:

http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/1

Чтобы ответить на ваш вопрос - да, попадание в кеш имеет примерно такую ​​же стоимость, как и доступ к регистру. И, конечно, промах в кеш-памяти обходится довольно дорого;)

PS:

Детали могут отличаться, но по этой ссылке есть неплохие приблизительные цифры:

Примерная стоимость доступа к различным кэшам и основной памяти?

Core i7 Xeon 5500 Series Data Source Latency (approximate)
L1 CACHE hit, ~4 cycles
L2 CACHE hit, ~10 cycles
L3 CACHE hit, line unshared ~40 cycles
L3 CACHE hit, shared line in another core ~65 cycles
L3 CACHE hit, modified in another core ~75 cycles remote
L3 CACHE ~100-300 cycles
Local DRAM ~30 ns (~120 cycles)
Remote DRAM ~100 ns 

PPS:

Эти цифры представляют гораздо более старые и медленные процессоры, но в основном эти соотношения сохраняются:

http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/2

Level                    Access Time  Typical Size  Technology    Managed By
-----                    -----------  ------------  ---------     -----------
Registers                1-3 ns       ?1 KB          Custom CMOS  Compiler
Level 1 Cache (on-chip)  2-8 ns       8 KB-128 KB    SRAM         Hardware
Level 2 Cache (off-chip) 5-12 ns      0.5 MB - 8 MB  SRAM         Hardware
Main Memory              10-60 ns     64 MB - 1 GB   DRAM         Operating System
Hard Disk                3M - 10M ns  20 - 100 GB    Magnetic     Operating System/User
person paulsm4    schedule 23.04.2012
comment
Как это возможно, что доступ к кэшу L3 может занять 100-300 циклов, в то время как доступ к локальной DRAM занимает всего около 120 циклов. Означает ли это, что кэш L3 может быть более чем в два раза медленнее, чем DRAM, который используется в основной памяти? - person user2316602; 10.08.2016
comment
@ user2316602: мне тоже кажется фикцией, если только эта строка таблицы не предназначена для кеш-памяти L3 процессора в другом сокете. (Это система Nehalem Xeon, поэтому основная память и L3 - это NUMA.) - person Peter Cordes; 25.08.2016
comment
Задержка L3 (и DRAM) ниже на процессорах Intel с меньшим количеством ядер, таких как двух- или четырехъядерный i7: меньше переходов на кольцевой шине и более простое отключение ядра. См. stackoverflow.com/questions/39260020/. Самые большие Xeon имеют значительно меньшую задержку попадания на L3, чем эта таблица для Woodcrest. - person Peter Cordes; 26.03.2018

Пропускная способность и время ожидания - разные вещи. Вы не можете просто добавить затраты на цикл. Информацию о пропускной способности см. В разделе Загрузка / сохранение за цикл для последних поколений архитектуры ЦП. - 2 загрузки за такт пропускная способность для большинства современных микроархитектур. И см. Как может кеширование быть таким быстрым? для микроархитектурные детали исполнительных модулей загрузки / сохранения, включая отображение буферов загрузки / сохранения, которые ограничивают степень параллелизма на уровне памяти, которую они могут отслеживать. Остальная часть этого ответа будет сосредоточена только на задержке, которая актуальна для рабочих нагрузок, связанных с отслеживанием указателей (например, связанных списков и деревьев), и на том, сколько задержки необходимо скрыть неупорядоченному исполнителю. (Промахи кэша L3 обычно слишком продолжительны, чтобы их можно было полностью скрыть.)

Задержка одноциклового кэша раньше была проблемой для простых конвейеров с более низкой тактовой частотой (поэтому каждый цикл занимал больше наносекунд), особенно с более простыми кешами (меньшими, не такими ассоциативными, и с меньший TLB для кешей, которые не были адресованы чисто виртуально.) например классический 5-этапный конвейер RISC, такой как MIPS I, предполагает 1 цикл для доступа к памяти при попадании в кеш , с вычислением адреса в EX и доступом к памяти в одной стадии конвейера MEM, перед WB.

Современные высокопроизводительные процессоры разделяют конвейер на большее количество этапов, что позволяет сократить каждый цикл. Это позволяет простым инструкциям, таким как add / or / and выполняться очень быстро, с задержкой в ​​1 цикл, но с высокой тактовой частотой.


Для получения дополнительных сведений о подсчете циклов и выполнении вне очереди см. pdf-файл с микроархитектурой Agner Fog и другие ссылки в вики-странице тегов x86.


Задержка использования нагрузки Intel Haswell L1 составляет 4 цикла для отслеживания указателя, что типично для современных процессоров x86. т.е. насколько быстро mov eax, [eax] может работать в цикле с указателем, указывающим на себя. (Или для связанного списка, который попадает в кеш, легко микростенд с замкнутым циклом). См. Также Есть ли штраф, когда база + смещение находится на другой странице, чем базовая? Этот особый случай задержки с 4 циклами применяется только в том случае, если указатель поступает непосредственно из другой нагрузки, в противном случае это 5 циклов.

Задержка использования нагрузки на 1 цикл выше для векторов SSE / AVX в процессорах Intel.


Задержка перезагрузки хранилища составляет 5 циклов и не связана с попаданием или отсутствием кеша (это пересылка хранилища, чтение из буфера хранилища для данных хранилища, которые еще не зафиксированы в кеш-памяти L1d).

Как прокомментировал Гарольд, доступ к регистру составляет 0 циклов. Так, например:

  • inc eax имеет задержку в 1 цикл (только операция ALU)
  • add dword [mem], 1 имеет задержку в 6 циклов, пока загрузка из dword [mem] не будет готова. (ALU + переадресация магазина). например хранение счетчика цикла в памяти ограничивает цикл одной итерацией на 6 циклов.
  • mov rax, [rsi] имеет задержку в 4 цикла от rsi готовности до rax готовности к удару L1 (задержка использования нагрузки L1).

http://www.7-cpu.com/cpu/Haswell.html есть таблица задержки на кэш (которую я скопирую здесь) и некоторые другие экспериментальные числа, включая задержку попадания L2-TLB (при промахе L1DTLB).

Intel i7-4770 (Haswell), 3,4 ГГц (Turbo Boost выключен), 22 нм. Оперативная память: 32 ГБ (PC3-12800 cl11 cr2).

  • Кэш данных L1 = 32 КБ, 64 байт / строка, 8-WAY.

  • Кэш инструкций L1 = 32 КБ, 64 байт / строка, 8-WAY.

  • Кэш L2 = 256 КБ, 64 Б / линия, 8-WAY

  • Кэш L3 = 8 МБ, 64 Б / строка

  • Задержка кэша данных L1 = 4 цикла для простого доступа через указатель (mov rax, [rax])

  • Задержка кэша данных L1 = 5 циклов для доступа со сложным вычислением адреса (mov rax, [rsi + rax*8]).

  • Задержка кэша L2 = 12 циклов

  • Задержка кэша L3 = 36 циклов

  • Задержка ОЗУ = 36 циклов + 57 нс

Страница теста верхнего уровня: http://www.7-cpu.com/utils.html, но все еще не объясняет, что означают разные размеры тестов, но код доступен. Результаты теста включают Skylake, который почти такой же, как Haswell в этом тесте. .

В ответе @ paulsm4 есть таблица для многосокетного Nehalem Xeon, включая некоторые удаленные (другие сокеты) номера памяти / L3.

person Peter Cordes    schedule 24.08.2016
comment
По какой-то причине я никогда не вижу значение задержки L1i на этих сайтах. Это было 2 цикла на P6 для попадания / попадания ITLB, это все еще 2 цикла на более поздних микроархитектурах? Я надеюсь, что это так. - person Lewis Kelsey; 31.01.2021
comment
@LewisKelsey: Хороший вопрос, но IDK. Я сомневаюсь, что задержка осталась прежней, так как тактовые частоты растут так, как они есть, и с размером 32 КБайт / 8 каналов (то же самое, что и до IceLake L1d). Буферизация между этапами и хорошее предсказание ветвлений может помочь скрыть пузыри даже в коде с высокой пропускной способностью. Кроме того, самый горячий код обычно запускается из кеша uop, что означает, что задержка попадания L1i во многих случаях не имеет значения. Я бы ожидал задержки в 4 или 5 циклов, возможно, 3, если это поможет, что он может быть однопортовым только для чтения и не должен поддерживать невыровненные нагрузки. И не нужно прощупывать буфер хранилища. - person Peter Cordes; 31.01.2021
comment
@LewisKelsey: Без заявления производителя это довольно сложно измерить. Очень сложно отделить другие эффекты длины конвейера / повторного управления от фактической задержки L1i. На практике время восстановления при отсутствии ветвления - это то, что вы можете измерить для совпадения попаданий в uop-cache по сравнению с промахами в uop-кешах + попаданиями L1i. - person Peter Cordes; 31.01.2021
comment
фактически, поздний клирен BPU вызывает образование пузыря с 3 циклами на Westemere, и это, по-видимому, происходит на стадии ILD. Это говорит о том, что, если он может на верхнем фронте цикла 5 перенастроить новый IP на нижний край первого цикла, а затем появится пузырек из 3 циклов (между циклами 1 и 5), это означает, что есть место для 4 циклов до ILD, так что, может быть, на самом деле это 4 для обычного удара. Я не могу найти никаких диаграмм для этапов поиска в кеше, но, возможно, некоторые из этих оригинальных часов теперь разделены на 2 из-за более высоких тактовых частот. - person Lewis Kelsey; 31.01.2021

Если я правильно помню, это примерно 1-2 такта, но это приблизительная оценка, и новые кеши могут быть быстрее. Это из книги по компьютерной архитектуре, которая у меня есть, и это информация для AMD, поэтому Intel может немного отличаться, но я бы ограничил ее между 5 и 15 тактовыми циклами, что кажется мне хорошей оценкой.

РЕДАКТИРОВАТЬ: Упс L2 составляет 10 циклов с доступом к TAG, L1 занимает от 1 до двух циклов, моя ошибка: \

person Jesus Ramos    schedule 23.04.2012
comment
Просто проверяю, вы говорите о попадании, а не о промахе, верно? - person user541686; 23.04.2012
comment
Да, я полагаю, что для доступа к TAG требуется только 2 цикла, а остальное время - доступ к кешу и загрузка. - person Jesus Ramos; 23.04.2012
comment
@Mehrdad Я дал информацию для L2, мой плохой обновился с правильной информацией. - person Jesus Ramos; 23.04.2012
comment
Я как бы заподозрил что-то странное. :) Спасибо. - person user541686; 23.04.2012
comment
Чем быстрее работает ЦП, тем больше циклов требуется для того же количества реального времени. Современные процессоры имеют задержку использования нагрузки L1, равную примерно 4 циклам (Intel Haswell). (т.е. циклы / итерация для цикла, содержащего mov eax, [eax], с указателем, указывающим на себя.) См. верхнюю часть 7-cpu.com/cpu/Haswell.html для некоторых чисел. - person Peter Cordes; 25.08.2016

Фактически стоимость попадания в кэш L1 почти такая же, как стоимость доступа к регистру. Для меня это было удивительно, но это правда, по крайней мере, для моего процессора (Athlon 64). Некоторое время назад я написал простое тестовое приложение для оценки эффективности доступа к общим данным в многопроцессорной системе. Тело приложения - это простая переменная памяти, увеличивающаяся в течение заранее определенного периода времени. Для сравнения я сначала проверил не разделяемую переменную. И во время этого действия я зафиксировал результат, но затем, во время дизассемблирования приложения, я обнаружил, что компилятор обманул мои ожидания и применил нежелательную оптимизацию к моему коду. Он просто помещает переменную в регистр ЦП и многократно увеличивает ее в регистре без доступа к памяти. Но настоящий сюрприз был достигнут после того, как я заставил компилятор использовать переменную в памяти вместо переменной регистра. В обновленном приложении я получил почти такие же результаты тестирования. Снижение производительности было действительно незначительным (~ 1-2%) и, похоже, связано с каким-то побочным эффектом.

В результате:

1) Я думаю, вы можете рассматривать кеш L1 как неуправляемый пул регистров процессора.

2) Нет никакого смысла применять жесткую ассемблерную оптимизацию, заставляя компилятор хранить часто запрашиваемые данные в регистрах процессора. Если к ним действительно часто обращаются, они будут жить в кэше L1 и, следовательно, будут иметь такую ​​же стоимость доступа, что и регистр процессора.

person ZarathustrA    schedule 05.12.2012
comment
Значит, ваш тест был неправильным или ограничивал что-то еще. inc [mem] имеет задержку 6c на Intel Haswell и аналогичную на AMD. inc eax имеет задержку в 1 цикл на всех современных процессорах x86. Это задержка пересылки магазина, а не задержка L1. Задержка использования нагрузки L1 больше похожа на 4 цикла. См. Pdf-файл Microarch от Agner Fog и другие ссылки в вики-странице по тегам x86. - person Peter Cordes; 25.08.2016