Як кеш може бути таким швидким?


37

Ось скріншот еталону кешу:

Результати показника AIDA64 Кеш і пам'ять

У еталоні швидкість зчитування кешу L1 становить приблизно 186 ГБ / с, затримка становить приблизно 3-4 тактових цикли. Як така швидкість навіть досягається?

Розглянемо тут пам'ять: максимальна теоретична швидкість - 665 МГц (частота пам’яті) x 2 (подвійна швидкість передачі даних) x 64 біт (ширина шини), що становить приблизно 10,6 ГБ / с, що ближче до базового значення 9,6 ГБ / с. .

Але з кешем L1, навіть якщо ми могли читати на кожному циклі з процесором на його максимальній частоті (3 ГГц), нам знадобиться близько 496 рядків даних для досягнення такої пропускної здатності, яка звучить нереально. Це стосується і інших кешів.

Що я пропускаю? Як ми обчислюємо пропускну здатність кешу з його параметрів?


14
Ви думали про те, наскільки маленький кеш L1,2,3 & однаково там, де він фізично знаходиться. Порада, вам не потрібно
потурбуватися про

2
Також: Чи тест достатньо знає про те, що він робить для того, щоб деякі дані, з якими він тестується, не зберігалися прямо у реєстрі?
rackandboneman

7
@rackandboneman: AIDA64 - це шановний орієнтир, а не те, що хтось просто зламав у C і дозволив компілятору оптимізувати деякі навантаження! Я припускаю, що компоненти мікробензика написані в зборах, у версіях SSE або AVX.
Пітер Кордес

1
@Peter Cordes, що задовольняє відповідь - на необхідне питання.
rackandboneman

1
Просто, щоб поставити мислителі у фізичну перспективу: за 1,4 наносекунди світло проходить близько півтори футів. Це означає, що якщо кеш-пам'ять була розташована з іншого боку материнської плати, така затримка, як така, може порушити відносність. Або помилка вимірювання .
Артур

Відповіді:


35

Цей процесор має ...

2 ядра Інструкція 32 КБ та кеш даних першого рівня кеш-пам'яті (L1) для кожного ядра

Оскільки є два ядра, ми можемо розраховувати, що тест буде виконувати два потоки паралельно. Їх веб-сайт дає надзвичайно мало інформації, але якщо ми подивимось на це , процесори з більшою кількістю ядер, здається, дають відповідно більшу пропускну здатність L1. Тому я думаю, що те, що відображається, - це загальна пропускна здатність з усіма ядрами, що працюють паралельно. Отже, для вашого процесора ми повинні розділити два на одне ядро ​​та один кеш:

Read   93 GB/s
Write  47 GB/s
Copy   90 GB/s

Тепер факт "копіювати" в 2 рази швидше, ніж "писати", є дуже підозрілим. Як він може скопіювати швидше, ніж може написати? Я збираюся зробити ставку, що тест, який відображається як "копія", є сумою прочитання + пропускної здатності, і в цьому випадку він би і читав, і писав зі швидкістю 45 ГБ / с, але відображав 90, тому що це еталон, і хто, до біса, довіряє орієнтирам? Тож давайте ігнорувати «копію».

Read   93 GB/s => 30 bytes/clock
Write  47 GB/s => 15 bytes/clock

Тепер один 128-розрядний регістр має 16 байт, достатньо близько, тому звучить, що цей кеш може робити два 128-розрядних читання та одне записування за такт.

Це саме ви хочете дійсно впорядкувати ці інструкції щодо скорочення числа SSE: два читання та одне записування за цикл.

Це, швидше за все, буде реалізовано з великою кількістю паралельних ліній даних, що є звичайним способом дуже швидко перебирати безліч даних всередині чіпа.


4
На сторінці 55 документа @ посилання на наступний хак на нього зазначається "Внутрішньо, доступ має до 16 байт. [...] Дві операції з завантаженням і одна операція зберігання можуть оброблятися за кожен цикл". Це пояснює, чому читання в два рази швидше - воно може робити два читання в одній операції, одночасно виконуючи одне записування.
Том Карпентер

2
Так, це чітко рахує копію BW = читати і записувати. Це здається настільки ж справедливим, як і альтернатива, оскільки важливо, що читання та запис може виконуватись паралельно. Зауважте, що номери OP для L2 / L3 мають копію не набагато вище, ніж запис, і меншу для пам'яті. Шина пам'яті DDR3 не є повнодуплексною: такі ж рядки даних потрібні для читання та запису. (Докладніше про пропускну здатність memcpy / memset x86 з магазинами NT та звичайними магазинами див. Stackoverflow.com/questions/43343231/… ).
Пітер Кордес

6
Ви здогадуєтесь, що IvyBridge може робити 2 читання та 1 запис за один і той же годинний цикл. Ви маєте рацію, але лише за дуже обмежених обставин. IvB має лише 2 порти AGU, тому зазвичай він обмежений 2 оперативними пам'ятьми на годину, до одного з яких може бути магазин . Але 256b AVX навантажень / сховищ займає 2 цикли, щоб виконати в портах завантаження / зберігання, при цьому потрібно лише АГУ в першому циклі. Таким чином, адреса магазину взагалі може працювати на порту 2/3 під час цього 2-го циклу завантаження 256b без витрат на пропускну здатність навантаження. (Уоп для зберігання даних працює на порт 4.) Джерело: agner.org/optimize microarch pdf
Peter Cordes

2
Сімейство AMD Bulldozer або процесор Ryzen дасть вам одне і те ж читання = 2х цифр запису, але вони дійсно обмежені двома оперативними пам'ятьми за годинник (до одного може бути запис) без прорізів. читання / запис / копіювання не виявляє різниці, але Triad can ( a[i] = b[i] + c[i]). BTW, Intel Haswell і пізніші магазини мають порт-AGU на порту 7, який може обробляти прості (неіндексовані) режими адресації, тому вони можуть виконувати 2 завантаження + 1 сховище уряду на годину. (А шлях даних до L1D - 256b, тому він подвоює пропускну здатність L1D.) Дивіться про запис Девіда Кантера: realworldtech.com/haswell-cpu/5
Пітер Кордес

1
@AliChen: ОП чітко згадував про затримку навантаження на 4 цикли IvyBridge відразу після пропускної здатності, перш ніж запитати, як це може бути таким швидким.
Пітер Кордес

27

У відповіді @ peufeu вказується, що це загальносистемні пропускні здатності. L1 і L2 - це приватні кеші на одне ядро ​​в сімействі Intel Sandybridge, тож цифри в 2 рази більше, ніж може зробити одне ядро. Але це все ще залишає нам вражаюче високу пропускну здатність і низьку затримку.

Кеш L1D вбудований прямо в ядро ​​процесора і дуже щільно поєднується з блоками виконання завантаження (і буфером зберігання) . Аналогічно, кеш L1I знаходиться безпосередньо поруч із командою отримання / декодування частини ядра. (Я фактично не дивився на кремнієвий план Sandybridge, тому це може не бути буквально правдою. Випуск / перейменування частини передньої частини, ймовірно, ближче до декодованого загального кешу "L0", який економить енергію та має кращу пропускну здатність. ніж декодери.)

Але з кешем L1, навіть якщо ми могли читати на кожному циклі ...

Навіщо зупинятися на цьому? Intel з Sandybridge і AMD з K8 можуть виконувати 2 навантаження за цикл. Багатопортові кеші та TLB - це річ.

Списання мікроархітектури компанії Sandybridge Девіда Кантера має гарну схему (яка стосується і вашого процесора IvyBridge):

("Уніфікований планувальник" містить увімкнення ALU і пам'яті, які очікують, що їх введення будуть готові, та / або чекають їх порту виконання (наприклад, vmovdqa ymm0, [rdi]декодує завантаження, яке взагалі має чекати, rdiякщо попередній add rdi,32ще не виконаний, для Приклад). Intel планує вводити порти на час випуску / перейменування . Ця діаграма відображає лише порти виконання для Uops пам’яті, але і невиконані ALU Uops змагаються за це. Етап питання / перейменування додає uops до ROB та планувальника . Вони залишаються в ROB до виходу на пенсію, але в планувальнику лише до відправки до порту виконання (Це термінологія Intel; інші люди використовують питання видачі та відправки по-різному)). AMD використовує окремі планувальники для цілих / FP, але в режимах адресації завжди використовуються цілі регістри

Діаграма пам'яті SnB Девіда Кантера

Як це показує, є лише 2 порти AGU (одиниці генерації адрес, які приймають режим адресації, як [rdi + rdx*4 + 1024]і створюють лінійну адресу). Він може виконати 2 оперативні пам'яті за годинник (по 128b / 16 байт кожен), до одного з них є магазином.

Але він має хитрість до свого рукаву: SnB / IvB запускає 256b AVX завантаження / зберігає як єдиний генерал, який займає 2 цикли в порту завантаження / зберігання, але потребує лише АГУ в першому циклі. Це дозволяє адресу магазину взагалі працювати на AGU на порту 2/3 протягом цього другого циклу, не втрачаючи пропускної здатності навантаження. Так що з AVX (який процесори Intel Pentium / Celeron не підтримують: /), SnB / IvB може (теоретично) підтримувати 2 навантаження та 1 сховище за цикл.

Ваш процесор IvyBridge - це стискання Sandybridge (з деякими мікроархітектурними вдосконаленнями, такими як mov-elimination , ERMSB (memcpy / memset) та попереднє попереднє завантаження на наступній сторінці). Покоління після цього (Haswell) вдвічі збільшувало пропускну здатність L1D за добу, розширюючи шляхи передачі даних від одиниць виконання до L1 з 128b до 256b, так що навантаження AVX 256b може підтримувати 2 за такт. Він також додав додатковий порт-AGU порт для простих режимів адреси.

Пікова пропускна здатність Haswell / Skylake - 96 байт, що завантажуються + зберігаються на такт, але інструкція з оптимізації Intel передбачає, що середня пропускна здатність Skylake (все ще припускаючи відсутність пропусків L1D або TLB) становить ~ 81B за цикл. (Скалярний цілочисленний цикл може підтримувати 2 навантаження + 1 сховище за годинник, згідно з моїм тестуванням на SKL, виконуючи 7 уоп (не злитий домен) за годину з 4 Uops з конденсованим доменом. Але він дещо сповільнюється за допомогою 64-бітних операндів замість 32-розрядний, тому, мабуть, існує деякий мікроархітектурний ліміт ресурсів, і це не лише питання планування магазину-адреси Uops на порт 2/3 та крадіжки циклів із вантажів.)

Як ми обчислюємо пропускну здатність кешу з його параметрів?

Ви не можете, якщо параметри не включають практичні номери пропускної здатності. Як зазначалося вище, навіть L1D Skylake не може бути в курсі своїх блоків виконання завантаження / зберігання для 256b векторів. Хоча це близько, і це може бути для 32-бітових цілих чисел. (Не було б сенсу мати більше одиниць завантаження, ніж кеш-порт прочитав порти, або навпаки. Ви просто залишите апаратне забезпечення, яке ніколи не можна повністю використовувати. Зауважте, що L1D може мати додаткові порти для надсилання / отримання рядків на / з інших ядер, а також для читання / запису зсередини ядра.)

Просто перегляд ширини та годин шини даних не дає вам усієї історії. Пропускну здатність L2 і L3 (і пам'яті) може бути обмежена кількістю невиправлених помилок, які L1 або L2 можуть відстежувати . Пропускна здатність не може перевищувати затримки * max_concurrency, а чіпи з більш високою затримкою L3 (як багатоядерний Xeon) мають набагато меншу одноядерну пропускну здатність L3, ніж двоядерний / чотирьохядерний процесор тієї ж мікроархітектури. Дивіться розділ «затримки пов'язаних платформ» з цього SO відповіді . Процесори сімейства Sandybridge мають 10 буферів для заповнення рядків для відстеження пропусків L1D (також використовуються магазинами NT).

(Сукупна пропускна здатність L3 / пам'яті з багатьма активними ядрами величезна на великому Xeon, але однопотоковий код бачить гіршу пропускну здатність, ніж на чотирьохядерному ядрі при однаковій тактовій швидкості, тому що більше ядер означає більше зупинок на кільцевій шині, і, отже, вище затримка L3.)


Затримка кешу

Як така швидкість навіть досягається?

Затримка завантаження в кеш-пам’яті L1D у 4 циклі є досить дивовижною , особливо враховуючи, що він повинен починатися з режиму адресації, як [rsi + 32], отже, він повинен робити додавання, перш ніж навіть мати віртуальну адресу. Потім це потрібно перекласти у фізичне, щоб перевірити теги кешу на відповідність.

(Адресація режимів, відмінних від [base + 0-2047]прийняття додаткового циклу в сімействі Intel Sandybridge, тому в АГУ є ярлик для простих режимів адресації (типово для випадків переслідування покажчиків, коли низька затримка використання навантаження, мабуть, найважливіша, але також загальна) . (Див . Посібник з оптимізації Intel , розділ Sandybridge 2.3.5.2 L1 DCache.) Це також передбачає не переопрацювання сегмента, а базовий адресу сегмента 0, що є нормальним.)

Він також повинен перевірити буфер магазину, щоб побачити, чи він перетинається з будь-якими попередніми магазинами. І це слід розібратися, навіть якщо раніше (в порядку програми) магазин-адреса взагалі ще не виконаний, тому адреса магазину не відома. Але, мабуть, це може статися паралельно з перевіркою на потрапляння L1D. Якщо виявляється, дані L1D не були потрібні, оскільки переадресація магазину може надавати дані з буфера магазину, то це не втрата.

Intel використовує кеш VIPT (фактично індексований фізично помічений), як майже всі інші, використовуючи стандартний трюк, щоб кеш був достатньо малим і з достатньо високою асоціативністю, щоб він поводився як кеш PIPT (не згладжувався) зі швидкістю VIPT (може індексувати в паралельно віртуального TLB-> фізичного пошуку).

Кеш-пам’яті L1 від Intel є 32-кілобайтним, 8-ти стороннім асоціативом. Розмір сторінки - 4кіБ. Це означає, що біти "індексу" (які вибирають, який набір із 8 способів може кешувати будь-який заданий рядок) знаходяться під зміщенням сторінки; тобто ці бітні адреси зміщуються на сторінку, і завжди однакові у віртуальній та фізичній адресах.

Більш детально про це та інші подробиці того, чому маленькі / швидкі кеші корисні / можливі (і добре працюють у поєднанні з більшими повільними кешами), дивіться мою відповідь, чому L1D менший / швидший, ніж L2 .

Невеликі кеші можуть робити те, що у великих кешах буде занадто дорогим за потужність, як-от отримати масиви даних із набору одночасно із завантаженням тегів. Отож, коли компаратор знаходить, який тег збігається, він просто мусує одну з восьми 64-байтних кеш-ліній, які вже отримані з SRAM.

(Насправді це не так просто: Sandybridge / Ivybridge використовують банківський кеш L1D з вісьмома банками з 16-ти байтними фрагментами. Ви можете отримати конфлікти кеш-банку, якщо два звернення до одного банку в різних лініях кешу намагаються виконати в одному циклі. (Є 8 банків, тож це може статися з адресами, кратними 128 один від одного, тобто 2 лінії кешу.)

IvyBridge також не має штрафу за нестандартний доступ до тих пір, поки він не перетинає межу кеш-лінії 64B. Я здогадуюсь, він з'ясовує, який банк (и) отримати (виходячи з бітів низької адреси), і встановлює будь-який зсув, який повинен відбутися для отримання правильних 1 - 16 байт даних.

У розділах кеш-лінії розбивається лише один загальний доступ, але це доступ до кількох кеш-запитів. Штраф все ще невеликий, за винятком 4-х розбитків. Skylake робить навіть 4k розбиття досить дешевими, із затримкою близько 11 циклів, як і звичайний розділений рядок кеш-пам'яті зі складним режимом адресації. Але пропускна здатність 4k-split значно гірша, ніж cl-split нерозщеплення.


Джерела :


1
Це дуже чітко, вичерпно і добре написано! +1!
наступний хак

8

На сучасних процесорах кеш-пам'ять розташована поруч із процесором на тому ж штампі (мікросхемі) , вона робиться за допомогою SRAM, який набагато, набагато швидше, ніж DRAM, який використовується для модулів оперативної пам'яті в ПК.

На одиницю пам'яті (біт або байт) SRAM набагато дорожче, ніж DRAM. Тому DRAM використовується і в ПК.

Але оскільки SRAM виготовлений за тією ж технологією, що і сам процесор, він настільки ж швидкий, як і процесор. Крім того, є тільки внутрішні (на процесорі) автобуси, з якими можна мати справу, тому якщо йому потрібно шиною шириною 496 ліній, то, мабуть, так і є.


Дякуємо за ваш інтерес У кількох книгах я бачив, що швидкості доступу до регістру перевищують 300 ГБ / с, в цьому випадку для процесора 3 ГГц пропускна здатність регістра становить 100 В / цикл, що неможливо, оскільки регістри зазвичай шириною 64/128, вони не могли так багато вивести. Це те, що стосується мене. Є правильним способом вираження пропускної здатності GB / sa.
лицар

3
@Knight майте на увазі, що IvB (як і будь-який високопродуктивний процесор) виконує кілька інструкцій за цикл, такі як 3 ОПУ ALU, 2 завантаження та 1 магазин. Більшість з них може приймати 2 входи (навіть навантаження, для індексованої адреси), а завантаження навіть займає 3. Ось 13 регістрів по 8 байт, 104 байти (це могло бути так, що таке епічне поєднання не дозволено, але там не вказує на те, що це стосується IvB, хоча його не можна підтримувати). Якщо ви також враховуєте векторні регістри, це число збільшується ще більше.
Гарольд

@harold: related: У Haswell та Skylake, здається, є обмеження на читання реєстру за добу, хоча це може бути в передній частині і не впливає на сплеск виконання після того, як деякі входи стануть готовими. Можливо, це якийсь інший мікроархітектурний ліміт, але я виявив вузькі місця в коді, які повинні мати змогу підтримувати більше операцій на годину. agner.org/optimize/blog/read.php?i=415#852 . У Haswell, мій найкращий сценарій зчитування ~ 6,5 цілочисельних регістрів за такт (підтримується). Мені також вдалося отримати постійні 7 Uops за тактове відправлення / виконання на Skylake (магазини - це магазин-адреса + магазин-дані).
Пітер Кордес

@PeterCordes, який повинен бути передовим, хоча правда? IIRC, що також було проблемою історично (PPro до Core2), і я не впевнений, як дробові числа мають сенс інакше. Хоча мої номери все одно були трохи
harold

@harold: Так, я впевнений, що це вузьке вузьке вузьке місце, можливо, перейменоване. Вузьке місце зчитування з реєстрації P6 знаходилось у «холодних» регістрах, які доводилося читати з постійного файлу реєстру у спірному ROB. Нещодавно змінені регістри все ще були у РОБ, і на цьому не було вузького місця. Я не дуже досліджував холодні та гарячі регістри на HSW / SKL, оскільки чомусь не думав робити мою петлю більшою, ніж 4 уп / в ідеалі, 1c за ітерацію. ой. IDK, скільки розбіжностей між переадресацією та PRF читаннями (які мають відбутися під час виконання, а не видавати / перейменувати).
Пітер Кордес

4

Кеші L1 - досить широкі структури пам'яті. Архітектуру кешів L1 в процесорах Intel можна знайти в цьому посібнику (надається next-hack). Однак інтерпретація деяких параметрів є невірною, "розмір лінії кешу" не є "шириною даних", це розміром послідовного блоку доступу до атомних даних.

У таблиці 2-17 (розділ 2.3.5.1) вказується, що на навантаженнях (читається) пропускна здатність кешу становить 2х16 = 32 байти на ядро на CYCLE . Це одне дає теоретичну пропускну здатність 96 Гбіт / с на ядрі 3 ГГц. Незрозуміло, про що повідомляє цитований бенчмарк, схоже, він вимірює два ядра, які працюють паралельно, тому він складає 192 Гбіт / с за два ядра.


2

Затримка воріт - це що? 10 пікосекунд? Час циклу для цілих конвеєрних операцій становить 333 пікосекунди, з різними розшифровками та шинними операціями та захопленням даних у вільний час, перш ніж розпочнеться наступний тактовий цикл.

Я очікую, що найповільніша активність у читанні кешу очікує, що даталіни досить зруйнують один від одного (ймовірно, це різниці: одна посилання та одна фактична зарядка від біта читання), що компаратор / засувка може бути зафіксований для впровадження позитиву- дії зворотного зв’язку для перетворення крихітної напруги у велике коливання напруги логічного рівня залізниця-рейка (близько 1 вольта).


1
Майте на увазі, що затримка L1D 4 циклу включає генерацію адрес (для простих режимів адресації [reg + 0-2047]), пошук TLB, порівняння тегів (8-ти напрямних асоціативних засобів) та розміщення отриманих до 16-ти нерівних байтів на вихідний порт вантажної одиниці для переадресації на інші виконавчі блоки. Це затримка 4с для циклу, що переслідує вказівник mov rax, [rax].
Пітер Кордес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.