Что такое отвал l3 кэша
Как компьютерный инженер, который пять лет занимался проблемами кэша в Intel и Sun, я немного разбираюсь в когерентности кэша. Это одна из самых трудных концепций, которые пришлось изучить ещё в колледже. Но как только вы действительно её освоили, то приходит гораздо лучшее понимание принципов проектирования систем.
Вы можете удивиться: зачем же разработчику ПО думать о механизме кэширования в CPU? Отвечу. С одной стороны, многие понятия из концепции когерентности кэша непосредственно применимы в распределённых системах и на уровнях изоляции СУБД. Например, представление реализации когерентности в аппаратных кэшах помогает лучше понять разницу в моделях согласованности (консистентности) — отличие строгой согласованности (strong consistency) от согласованности в конечном счёте (eventual consistency). У вас могут появиться новые идеи, как лучше обеспечить согласованность в распределённых системах, используя исследования и принципы из аппаратного обеспечения.
С другой стороны, неправильные представления о кэшах часто приводят к ложным утверждениям, особенно когда речь идёт о параллелизме и состоянии гонки. Например, часто говорят о трудности параллельного программирования, потому что «у разных ядер в кэшах могут быть разные/устаревшие значения». Или что квалификатор volatile в языках вроде Java нужен, чтобы «предотвратить локальное кэширование общих данных» и принудительно «читать/записывать только в основную память».
Такие заблуждения в основном безвредны (и могут быть даже полезны), но также ведут к плохим решениям при проектировании. Например, разработчики могут подумать, что они избавлены от вышеупомянутых ошибок параллелизма при работе с одноядерными системами. В действительности даже одноядерные системы подвержены риску ошибок параллелизма, если не используются соответствующие конструкции параллелизма.
Или ещё пример. Если переменные volatile действительно каждый раз пишутся/считываются из основной памяти, то они будут чудовищно медленными — ссылки в основной памяти в 200 раз медленнее, чем в кэше L1. На самом деле volatile-reads (в Java) часто настолько же производительны, как из кэша L1, и это развенчивает миф, будто volatile принуждает читает/записывать только в основную память. Если вы избегали volatile из-за проблем с производительностью, возможно, вы стали жертвой вышеуказанных заблуждений.
Но если у разных ядер собственный кэш, хранящий копии одних и тех же данных, не приведёт ли это к несоответствию записей? Ответ: аппаратные кэши в современных процессорах x86, как у Intel, всегда синхронизируются. Эти кэши не просто тупые блоки памяти, как многие разработчики, похоже, думают. Наоборот, очень сложные протоколы и встроенная логика взаимодействия между кэшами обеспечивает согласованность во всех потоках. И всё это происходит на аппаратном уровне, то есть нам, разработчикам программного обеспечения/компиляторов/систем, не нужно об этом думать.
Кратко объясню, что имеется в виду под «синхронизированными» кэшами. Здесь много нюансов, но в максимальном упрощении: если два разных потока в любом месте системы читают с одного и того же адреса памяти, то они никогда не должны одновременно считывать разные значения.
В качестве простого примера, как непротиворечивые кэши могут нарушить вышеупомянутое правило, просто обратитесь к первому разделу этого учебника. Ни один современный процессор x86 не ведёт себя так, как описано в учебнике, но глючный процессор, безусловно, может. Наша статья посвящена одной простой цели: предотвращению таких несоответствий.
Наиболее распространённый протокол для обеспечения согласованности между кэшами известен как протокол MESI. У каждого процессора своя реализация MESI, и у разных вариантов есть свои преимущества, компромиссы и возможности для уникальных багов. Однако у всех них есть общий принцип: каждая строка данных в кэше помечена одним из следующих состояний:
- Модифицированное состояние (M).
- Эти данные модифицированы и отличаются от основной памяти.
- Эти данные являются источником истины, а все остальные источники устарели.
- Эти данные не модифицированы и синхронизированы с основной памятью.
- Ни в одном другом кэше того же уровня нет этих данных.
- Эти данные не модифицированы и синхронизированы.
- В других кэшах того же уровня тоже (возможно) есть те же данные.
- Эти данные устарели и не должны использоваться.
Предположим, что поток на core-1 хочет записать в память по адресу 0xabcd. Ниже приведены некоторые возможные последовательности событий.
Попадание в кэш
- В L1-1 есть данные в состоянии E или M.
- L1-1 производит запись. Всё готово.
- Ни в одном другом кэше нет данных, так что немедленная запись будет безопасной.
- Состояние строки кэша изменяется на M, поскольку она теперь изменена.
Промах локального кэша, попадание одноуровневого кэша
- В L1-1 есть данные в состоянии S.
- Это значит, что в другом одноуровневом кэше могут быть эти данные.
- Та же последовательность применяется, если в L1-1 вообще нет этих данных.
- L2 проверяет, что в L1-1 эти данные хранятся в состоянии E.
Теперь предположим, что поток на core-2 хочет считать с адреса 0xabcd. Ниже приведены некоторые возможные последовательности событий.
Попадание кэша
- L1-2 имеет данные в состоянии S, E или M.
- L1-2 считывает данные и возвращает в поток. Готово.
Промах локального кэша, промах кэша верхнего уровня
- L1-2 имеет данные в состоянии I (недействительное), то есть не может их использовать.
- L1-2 отправляет запрос Request-for-Share в кэш L2.
- В L2 тоже нет данных. Он считывает данные из памяти.
- L2 возвращает данные из памяти.
- L2 отправляет данные в L1-2 с разрешением войти в состояние S.
- L2 проверяет, что в L1-2 эти данные хранятся в состоянии S.
Промах локального кэша, попадание кэша верхнего уровня
- В L1-2 есть данные в состоянии I.
- L1-2 отправляет запрос Request-for-S в кэш L2.
- L2 видит, что в L1-1 данные в состоянии S.
- L2 отправляет Ack в L1-2, вместе с данными и разрешением войти в состояние S.
- L1-2 получает данные, сохраняет их в кэше и отправляет в поток.
Промах локального кэша, попадание одноуровневого кэша
- В L1-2 есть данные в состоянии I.
- L1-2 отправляет запрос Request-for-S в кэш L2.
- L2 видит, что в L1-1 данные в состоянии E (или M).
- L2 отправляет snoop-share в L1-1
- L1-1 понижает состояние до S.
- L1-1 отправляет Ack в L2 вместе с модифицированными данными, если это применимо.
- L2 отправляет Ack в L1-2 вместе с данными и разрешением войти в состояние S.
- L1-2 получает данные, сохраняет их в кэше и отправляет в поток.
Выше приведены лишь некоторые из возможных сценариев. На самом деле существует много вариаций и нет двух одинаковых реализаций протокола. Например, в некоторых конструкциях используется состояние O/F. В некоторых есть кэши обратной записи, а другие используют сквозную запись. Некоторые используют snoop-трансляции, а другие — snoop-фильтр. В некоторых инклюзивные кэши, а в других — эксклюзивные. Вариации бесконечны, а мы даже не затронули буферы хранения (store-buffers)!
Кроме того, в приведённом примере рассматривается простой процессор всего с двумя уровнями кэширования. Но обратите внимание, что этот же протокол можно применить рекурсивно. Легко добавляется кэш L3, который, в свою очередь, координирует несколько кэшей L2, используя тот же протокол, что приведён выше. У вас может быть многопроцессорная система с «домашними агентами», которые координируют работу нескольких кэшей L3 на совершенно разных чипах.
В каждом сценарии каждому кэшу нужно взаимодействовать только с кэшем верхнего уровня (для получения данных/разрешений) и его потомками (для предоставления/отмены данных/разрешений). Всё это происходит невидимо для программного потока. С точки зрения софта подсистема памяти выглядит как единый, консистентный монолит… с очень переменными задержками.
Мы обсудили удивительную мощность и согласованность системы памяти компьютера. Остался один вопрос: если кэши настолько последовательны, то зачем вообще нужны volatile в языках вроде Java?
Это очень сложный вопрос, на который лучше ответить в другом месте. Позвольте только немного намекнуть. Данные в регистрах CPU не синхронизируются с данными в кэше/памяти. Программный компилятор выполняет всевозможные оптимизации, когда дело доходит до загрузки данных в регистры, записи их обратно в кэш и даже переупорядочивания инструкций. Всё это делается при условии, что код будет выполняться в одном потоке. Поэтому любые данные, подверженные риску состояния гонки, следует защищать вручную с помощью параллельных алгоритмов и языковых конструкций вроде atomic и volatile.
В случае квалификатора volatile в Java решение отчасти состоит в том, чтобы заставить все операции чтения/записи идти в обход локальных регистров, а вместо этого немедленно обращаться к кэшу для чтения/записи. Как только данные считаны/записаны в кэш L1, вступает в силу протокол аппаратного согласования. Он обеспечивает гарантированную согласованность во всех глобальных потоках. Таким образом, если несколько потоков читают/записывают в одну переменную, все они синхронизированы друг с другом. Вот как достигается координация между потоками всего за 1 наносекунду.
Rise Up запись закреплена
в роликах rx4d частенько затрагивается тема отвала L3 кэша
вопрос такой: это рофл какой-то? или действительно существует некая проблема с L3 на xeon?Тогда и всему процессору и логике его хана.
Он просто не будет работать.
Т.е. процессор на выброс, сколько ты видел не работающих зеонов. у кого они наворачивались. как правило матери горят, всё остальное, проц целый..Владимир, контролёр памяти и кеш. как бы разные функции выполняют, Я предполагаю, что не будет процессор работать без части кэша. любого уровня.
Владимир, слышал, что и видеокарта может отвалится или не полностью работать не на 16х . но чтоб кэш угробить и проц работал при этом.
Владимир, у зерна В3 кэш не привязан к ядрам. Он типа смарт или как там. короче общий
Владимир, у меня 30м кэша. хз сколько юзается, но все норм работает.
Сергей ЗахаровПалата по отвалу кеша обычно рядом с палатой разлочки ядер на xeone. Надо там спрашивать.
С отвалом кэша встречался лично раза четыре, но все четыре раза на амд ( атлоны - феномы 939-ам3 соккет, даже один оптерон серверный был). У винды начинались рандомные глюки, то в синьку упадёт, то просто в винде при запуске какого-нибудь приложения выскакивает бредовая ошибка типа: ошибка записи при чтении, то не может завершить процесс установки винды. При этом любые мемтесты и стресс тесты может спокойно проходить без ошибок. Но если поменять процессор то сразу все приходило в норму. Либо лечилось временно отключением кэша в биосе, но при этом комп сильно становился тормознутей.
Взлёт продаж материнских плат на 2011 v.3. Рассмотрим, с какими проблемами придётся столкнуться при сборке пк на Xeon, сравнение с Ryzen.
Приветствую вас, друзья, заранее хочу обозначить, что сокет 2011 v.3 абсолютно актуален и сборки на нём имеют место быть, я лишь хочу рассказать о минусах сборок на этом сокете и её перспективности на будущее.
Итак, возьмём хорошую материнскую плату.
Huananzhi X99 TF.
Что можно сказать о данной материнской плате - китайцы постарались, материнка выглядит добротно. Из интересного: имеет 4 слота DDR3 памяти, поддерживающая ECC REG (серверная, дешёвая память) и 4 слота DDR4 памяти, подключать вместе и DDR3 и DDR4 нельзя, так указал разработчик, имеет не лучшую звуковую карту. Также из интересного: есть подсветка, кнопка включения и перезагрузки материнской платы, цифровой дисплей пост кодов. Отличный закос под брендовые материнские платы. Это основное, кому интересны порты и прочее, ссылка на материнку на алиэкспресс здесь . Цена 7800 р.
Intel Xeon E5 2678
Серьёзный камень с 12 ядрами и 24 потоками, работает на стоковой частоте 2.5 Ghz, имеет 30 мб кэша L3, 22 нм техпроцесс, архитектура Haswell, 120W тепловыделение, имеет unlock турбо буста до 3.3 Ghz на все ядра. Цена 7500 р.
Оперативная память.
DDR3 мы сегодня трогать не будем, возьмём добротные DDR4 и на данном этапе уже начинаются проблемы. Данная материнская плата поддерживает частоту оперативной памяти только до 2133 Mhz без возможности разгона, в данной сборке взяты 4 модуля памяти по 8 gb со стоковой частотой 2133 Mhz, 4 канал. HyperX Savage. Цена 3200 р.
Охлаждение процессора.
На данном этапе сборщикам на Huanan придётся выложить хорошую сумму и рассчитывать на минимум 8 медных теплотрубок. 1500-2000 р.
Это всё основное, что касается этой сборки, видеокарту и остальную периферию рассматривать не будем.
Итак, цена такого комплекта составит приблизительно 23 тысячи рублей (без учёта двух планок ОЗУ), так как для повседневного использования 2 планки по 8 гб будет достаточно.
"Танцы с бубном" при первых запусках данного пк будут обеспечены, и можно ожидать следующие проблемы: в биосе материнской платы с завода выставлен режим Legacy, его надо будет переключить на Uefi (при условии, что вы ставите свой накопитель, а не переустанавливаете винду), также биос может несколько раз вставать, выдавать ошибки, перезапускаться, об этом я и говорил, как минимум, если обычный пользователь встретится с такой проблемой, то в лучшем случае у него получится запустить всё после нескольких часов просмотра видео о лечении данных проблем, как максимум - нести в сервис к умным ребятам, для пущей достоверности посмотрите ютуб или почитайте форумы таких проблем с китайскими платформами.
Для сравнения мы можем взять сборки на Ryzen, взяв условный R7 2700 8 ядер 16 потоков, стоимость его на данный момент 13 тысяч рублей, материнские платы на среднем чипсете можно купить от 6 до 10 тысяч рублей, с двумя планками оперативной памяти в среднем получится сумма не 25-27 тысяч рублей, без танцев с бубном и с хорошей перспективой на будущее, 2011 v.3 такой перспективой похвастаться не может, хоть и хорошая, но тупиковая ветвь своего сокета.
Проверяем, какое влияние оказывает объём L3 Cache на производительность процессоров Intel Core 10 серии как в рабочих приложениях, так и в играх. Выясняем, почему нельзя использовать старшие процессоры для эмуляции младших моделей.
Что такое кэш процессора и зачем он нужен
Кэш процессора – это очень быстрая память. Он выполняет функцию буфера (временного хранения данных), из которого процессор очень быстро может получить необходимую для обработки информацию.
Современные процессоры, будь то Intel или AMD, в основном имеет 3 уровня кэша:
- L1 Cache (кэш первого уровня) — очень быстрый, но относительно небольшой, содержит данные и команды, которые понадобятся для работы в первую очередь.
- L2 Cache (кэш второго уровня процессора) — медленнее чем L1 Cache, но значительно больше по размеру. Содержит в себе данные, которые могут скоро потребоваться, но не уместились в L1.
- L3 Cache (кэш третьего уровня) — самый медленный, но в то же время самый большой по объёму хранения информации, его скорость обычно в пять-шесть раз превышает скорость DRAM.
В многоядерных процессорах каждое ядро имеет выделенный кэш L1 и L2 Cache, а вот к L3 Cache чье влияние на производительность мы и будем сегодня изучать имеют доступ все ядра процессора.
Когда процессору необходимо получить данные, поиск он начинает с кэша первого уровня. Если нужной информации в нем нет, он повторяет поиск в кэше второго и третьего уровня что несколько увеличивает время на выполнение операции. Если поиск завершился неудачей процессору приходится обращаться к оперативной памяти что значительно увеличивает время выполнение операции.
Именно поэтому чем больше объём кэша, тем больше вероятность нахождения в нем нужных данных, а значит сократить задержек. Но и у большого кэша есть и свои минусы, о которых чуть позже.
Более подробно о работе кэша процессора и зачем он нужен можно ознакомиться в статье "Что такое кэш в процессоре и зачем он нужен"
В тестировании участвую 4 процессора Intel из 10 серии:
Чтобы измерить именно влияние объёма L3 Cache на производительность процессора, зафиксируем частоту ядер всех участников на отметке 4000 MHz, а у старших моделей дополнительно отключим ядра, чтобы конфигурация ядер всех участников составила 4 ядра с HT, как и у младшей модели intel Core i3.
Частота контроллера памяти во всех случаях составила 3400 MHz. Оперативная память работала на частоте 2133 MHz по стандарту JEDEC c таймингами 15-15-15-36 CR2.
Тестовая конфигурация
- Материнская плата — MSI MPG Z490 GAMING CARBON WIFI;
- Оперативная память №1 — G.SKILL F4-3000C14-16GVR 2x16GB;
- Видеокарта — GIGABYTE GeForce RTX 3070 EAGLE OC;
- Накопитель №1 — M.2 Samsung 970 Pro 512 Гбайт;
- Накопитель №2 — SATA-III SanDisk Ultra II 960 Гб SDSSDHII-960G-G25;
- Блок питания — Cooler Master V1200 Platinum 1200 ВТ.
Тестирование в бенчмарках
В Aida64 Cache and Memory Benchmark разный объём L3 Cache оказывает незначительное влияние на прописную способность памяти, также можно заметить, что процессор с более больший кэш 3 уровня несколько отстает по скорости и задержкам от своих младших собратьев с меньшем кэшем.
Бенчмарк CPU-Z как и Geekbench 5 не питает большой любви к объёму кэша, хоть и прослеживается незначительное изменение в производительности.
Похожая картина наблюдается и в бенчмарке 3DMark Time Spy.
А вот программы архивации, в частности, WinRAR, отдают предпочтение процессору с большим кэшем, разница в производительности доходит до 35 %.
7-Zip также положительно откликается на увеличение объёма кэша, разница между моделью i3 с L3 Cache 6 mb и процессором i9 L3 Cache 20 mb составляет порядка 20 % в операциях упаковки.
Получив такую неоднозначную реакцию бенчмарков на объём кэша третьего уровня, переходим к тестированию в играх.
Тестирование в играх
Скандинавская сага о набегах викингов хорошо откликается на изменение объёма L3 кэша, и если переход от процессора с 6 мегабайтами кэша на 12 кажется не столь значительным, то переход на модель i9 c 20 мегабайтами кэша 3 уровня составляет уже 15%.
Подобная картина наблюдается во всех протестированных играх, где-то влияние больше где-то меньше, но оно безусловно.
Это еще раз доказывает факт того что использовать для тестирования необходимо оригинальные модели процессоров а не старшую модель для эмуляции младших путем отключения ядер процессора в биос материнской платы.
Выводы
Изменение объёма кэша 3 уровня положительно сказывается на игровой производительности процессора. Большинство протестированных программ практически не реагируют на его изменение, исключением являются программы-архиваторы.
В целом объем кэша 3 уровня играет немалую роль в производительности процессора, но самостоятельно пользователь увеличить его объем, увы, не сможет.
Выход процессоров AMD Zen 2 с увеличенным до 32 мегабайт кэшем 3 уровня должен был заставить инженеров Intel задуматься, ведь процессор intel Core i3 10100 c кэшем 3 уровня 20 мегабайт мог бы составить конкуренцию даже процессорам Ryzen 5000 серии.
В то же время у большого кэша есть и недостатки — это большая площадь, занимаемая на подложке, и возросшие задержки, но эти недостатки не кажутся такими серьезными на фоне роста производительности.
Компьютерные процессоры сделали значительный рывок в развитии за последние несколько лет. Размер транзисторов с каждым годом уменьшается, а производительность растет. При этом закон Мура уже становится неактуальным. Что касается производительности процессоров, то следует учитывать, не только количество транзисторов и частоту, но и объем кэша.
Возможно, вы уже слышали о кэш памяти когда искали информацию о процессорах. Но, обычно, мы не обращаем много внимания на эти цифры, они даже не сильно выделяются в рекламе процессоров. Давайте разберемся на что влияет кэш процессора, какие виды кэша бывают и как все это работает.
Что такое кэш процессора?
Если говорить простыми словами, то кэш процессора это просто очень быстрая память. Как вы уже знаете, у компьютера есть несколько видов памяти. Это постоянная память, которая используется для хранения данных, операционной системы и программ, например, SSD или жесткий диск. Также в компьютере используется оперативная память. Это память со случайным доступом, которая работает намного быстрее, по сравнению с постоянной. И наконец у процессора есть ещё более быстрые блоки памяти, которые вместе называются кэшем.
Если представить память компьютера в виде иерархии по её скорости, кэш будет на вершине этой иерархии. К тому же он ближе всего к вычислительным ядрам, так как является частью процессора.
Кэш память процессора представляет из себя статическую память (SRAM) и предназначен для ускорения работы с ОЗУ. В отличие от динамической оперативной памяти (DRAM), здесь можно хранить данные без постоянного обновления.
Как работает кэш процессора?
В наши дни процессор может обрабатывать огромное количество инструкций в секунду. Чтобы по максимуму использовать свои возможности, процессору необходима супер быстрая память. Поэтому был разработан кэш.
Контроллер памяти процессора выполняет работу по получению данных из ОЗУ и отправке их в кэш. В зависимости от процессора, используемого в вашей системе, этот контроллер может быть размещен в северном мосту материнской плате или в самом процессоре. Также кэш хранит результаты выполнения инструкций в процессоре. Кроме того, в самом кэше процессора тоже есть своя иерархия.
Веся кэш память процессора разделена на три уровни: L1, L2 и L3. Эта иерархия тоже основана на скорости работы кэша, а также на его объеме.
На данный момент это все уровни кэша процессора, компания Intel пыталась создать кэш уровня L4, однако, пока эта технология не прижилась.
Для чего нужен кэш в процессоре?
Пришло время ответить на главный вопрос этой статьи, на что влияет кэш процессора? Данные поступают из ОЗУ в кэш L3, затем в L2, а потом в L1. Когда процессору нужны данные для выполнения операции, он пытается их найти в кэше L1 и если находит, то такая ситуация называется попаданием в кэш. В противном случае поиск продолжается в кэше L2 и L3. Если и теперь данные найти не удалось, выполняется запрос к оперативной памяти.
Раньше, в конструкции процессоров кєши L2 и L3 были были вынесены за пределы процессора, что приводило к высоким задержкам. Однако уменьшение техпроцесса, по которому изготавливаются процессоры позволяет разместить миллиарды транизисторов в пространстве, намного меньшем, чем раньше. Как результат, освободилось место, чтобы разместить кэш как можно ближе к ядрам, что ещё больше уменьшает задержку.
Как кэш влияет на производительность?
Влияние кэша на произвоидтельность компьютера напрямую зависит от его эффективности и количества попаданий в кэш. Ситуации, когда данных в кэше не оказывается очень сильно снижают общую производительность.
Представьте, что процессор загружает данные из кэша L1 100 раз подряд. Если процент попаданий в кэш будет 100%, процессору понадобиться 100 наносекунд чтобы получить эти данные. Однако, как только процент попаданий уменьшится до 99%, процессору нужно будет извлечь данные из кэша L2, а там уже задержка 10 наносекунд. Получится 99 наносекунд на 99 запросов и 10 наносекунд на 1 запрос. Поэтому уменьшение процента попаданий в кэш на 1% снижает производительность процессора 10%.
В реальном времени процент попаданий в кэш находится между 95 и 97%. Но как вы понимаете, разница в производительности между этими показателями не в 2%, а в 14%. Имейте в виду, что в примере, мы предполагаем, что прощенные данные всегда есть в кэше уровня L2, в реальной жизни данные могут быть удалены из кэша, это означает, что их придется получать из оперативной памяти, у которой задержка 80-120 наносекунд. Здесь разница между 95 и 97 процентами ещё более значительная.
Низкая производительность кэша в процессорах AMD Bulldozer и Piledriver была одной из основных причин, почему они проигрывали процессорам Intel. В этих процессорах кэш L1 разделялся между несколькими ядрами, что делало его очень не эффективным. В современных процессорах Ryzen такой проблемы нет.
Можно сделать вывод, чем больше объем кэша, тем выше производительность, поскольку процессор сможет получить в большем количестве случаев нужные ему данные быстрее. Однако, стоит обращать внимание не только на объем кэша процессора, но и на его архитектуру.
Выводы
Теперь вы знаете за что отвечает кэш процессора и как он работает. Дизайн кэша постоянно развивается, а память становится быстрее и дешевле. Компании AMD и Intel уже провели множество экспериментов с кэшем, а в Intel даже пытались использовать кэш уровня L4. Рынок процессоров развивается куда быстрее, чем когда-либо. Архитектура кэша будет идти в ногу с постоянно растущей мощностью процессоров.
Кроме того, многое делается для устранения узких мест, которые есть у современных компьютеров. Уменьшение задержки работы с памятью одна из самых важных частей этой работы. Будущее выглядит очень многообещающе.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Читайте также: