
Десятиліттями продуктивність комп’ютерів було легко звести до кількох основних характеристик. Процесори продавалися за тактовою частотою та кількістю ядер, відеокарти — за пропускною здатністю шейдерів, а пізніше — за терафлопсами, пам’ять — за частотою, а накопичувачі — за швидкістю послідовного передавання даних. Ці цифри й досі мають значення, але сучасні процесори стали настільки надзвичайно потужними у виконанні арифметичних операцій, що інша проблема дедалі частіше визначає, скільки з цієї теоретичної продуктивності можна реально використати: доставлення даних туди, куди їм потрібно, і тоді, коли їм це потрібно.
Сучасне ядро процесора може виконувати кілька інструкцій за кожен такт. Високопродуктивна відеокарта містить тисячі арифметичних блоків, що працюють паралельно. Прискорювачі штучного інтелекту виводять пропускну здатність матричних множень у петафлопсний діапазон. Однак жоден із цих блоків не може обчислити нічого корисного без операндів, інструкцій, текстур, геометрії, ваг моделі, проміжних результатів або будь-яких інших даних.
Це створює фундаментальний дисбаланс. По суті, пропускна здатність арифметики значно зросла за роки, але переміщення даних є порівняно набагато дорожчим з точки зору запізнень, пропускної здатності, енергії та фізичних ресурсів чипа. Як наслідок, багато сучасних робочих навантажень витрачають на диво велику кількість зусиль просто на те, щоб підтримувати виконавчі блоки в робочому стані.
Це не означає, що кожне робоче навантаження є “обмеженим пам’яттю”. Насправді, аж ніяк. Продуктивність все ще може обмежуватися пропускною здатністю обчислень, залежностями інструкцій, передбаченням розгалужень, синхронізацією, накладними витратами програмного забезпечення, накопичувачами, мережею або численними іншими факторами. Змінилося те, що розуміння поведінки пам’яті стало незамінним для розуміння сучасної обчислювальної продуктивності.
А сама “продуктивність пам’яті” виходить далеко за межі частоти або ємності. Запізнення, пропускна здатність, локальність, розмір кешу, паралелізм на рівні пам’яті, шаблони доступу, попереднє зчитування, ємність, топологія інтерконекту і навіть фізичне розташування даних — все це взаємодіє одне з одним.
Щоб зрозуміти чому, ми повинні почати, мабуть, із найважливішої відмінності: як здійснюється доступ до даних.
Послідовний та довільний доступ можуть поводитися як зовсім різні робочі навантаження
Уявіть, що ви читаєте файл розміром 1 ГБ від початку до кінця. Розташування наступної частини даних є ідеально передбачуваним. Як тільки система усвідомлює, що ви робите, вона може почати отримувати майбутні дані ще до того, як вони будуть явно запитані.
Це шаблон послідовного доступу, і сучасні комп’ютери чудово справляються з ним.
Процесори містять апаратні засоби попереднього зчитування, спеціально розроблені для розпізнавання передбачуваних потоків пам’яті. Контролери DRAM можуть підтримувати кілька транзакцій у стані виконання та перевпорядковувати запити. Контролери SSD розподіляють доступ між багатьма NAND-чіпами та каналами. Відеокарти можуть об’єднувати запити пам’яті від сусідніх потоків у більші транзакції.
Апаратне забезпечення, по суті, може побудувати конвеєр. На жаль, довільний доступ є набагато складнішим викликом.
Розгляньте обхід зв’язаного списку, де кожен елемент містить адресу наступного. Процесор може не знати, куди піде наступний доступ, доки поточний не завершиться. Це руйнує значну частину можливостей попереднього зчитування та запобігає ефективному перекриттю доступів. Ось чому два робочих навантаження, що переміщують однакову кількість даних, можуть працювати з кардинально різною швидкістю.
Ця відмінність стає ще важливішою, коли задіяні залежності від запізнень. Якщо процесор запитує чотири незалежні кеш-лінії, він може підтримувати кілька промахів кешу в стані виконання одночасно та перекрити значну частину їхніх запізнень. Однак, якщо запит B залежить від результату запиту A, B не може розпочатися, доки A не завершиться.
Це часто ілюструється за допомогою перебирання вказівників. Кожне зчитування розкриває адресу наступного зчитування, змушуючи процесор оплачувати набагато більшу частину фактичного запізнення пам’яті, а не приховувати його за допомогою спекуляцій чи паралелізму.
Той самий принцип проявляється всюди в обчисленнях. База даних, що виконує невеликі непередбачувані пошуки, створює дуже відмінний виклик від копіювання великого файлу. Відеокарта, що вибирає суміжні текселі, поводиться по-іншому, ніж тисячі потоків, що шукають незалежні адреси. SSD, що послідовно читає сотні кілобайтів, бачить принципово інше робоче навантаження, ніж отримання розкиданих блоків по 4 КБ.
Це також пояснює, чому ми не можемо просто “перетворити довільний доступ на послідовний” для покращення продуктивності. Проте розробники програмного забезпечення активно намагаються це зробити. Бази даних реорганізують дані. Ігрові рушії пакетують роботу. Алгоритми відеокарт перевпорядковують запити. Компілятори змінюють макети даних. Структури масивів іноді можуть замінити масиви структур. Сортування може перетворити розкидані доступи на відносно узгоджені.
Але це не завжди можливо. Насправді, якщо наступна адреса залежить від результату поточної операції, то залежність є реальною. Якщо промінь може відбитися в непередбачувану частину 3D-сцени, то відеокарта не може знати всі майбутні доступи заздалегідь. Якщо користувач бази даних запитує конкретний запис, то читання терабайта суміжних записів спочатку очевидно суперечить меті.
Отже, мета стає менш про усунення довільних доступів, а більше про те, щоб дорогі доступи відбувалися якомога рідше, передбачувано та одночасно.

Локальність — причина роботи ієрархій кеш-пам’яті
На щастя, реальне програмне забезпечення рідко отримує доступ до абсолютно довільних даних весь час. Насправді програми зазвичай демонструють як просторову локальність, так і часову локальність.
Просторова локальність означає, що якщо програма отримує доступ до одних даних, є відносна ймовірність, що незабаром їй знадобляться сусідні дані. Часова локальність означає, що нещодавно отримані дані мають розумний шанс бути отриманими знову.
Цикл, що обробляє масив, має чудову просторову локальність. Часто використовувані дані ігрового світу можуть мати сильну часову локальність. Інструкції в гарячому циклі — розділ комп’ютерного коду, який виконується дуже часто — демонструють обидва типи локальності. Саме ці властивості роблять кеш-пам’ять життєздатною.
Коли процесор потребує байт з DRAM, він, як правило, передає не тільки цей байт. Дані переміщуються через ієрархію кеш-пам’яті блоками фіксованого розміру, які називаються кеш-лініями. На мейнстрімних x86-процесорах вони зазвичай мають 64 байти. Наприклад, документація AMD щодо оптимізації описує розміщення програмного забезпечення та міркування щодо доступу навколо 64-байтових кеш-ліній.
Якщо програма згодом отримує доступ до сусідніх даних, вони можуть вже знаходитися в кеші. Це вводить інше критичне поняття: робочий набір.
Програма може технічно виділяти десятки гігабайтів пам’яті, неодноразово працюючи лише з невеликою її частиною під час певного етапу. Якщо цей активний робочий набір вміщується в швидкий кеш, продуктивність може бути чудовою. Збільште робочий набір трохи за межі доступної ємності кешу, і раптом набагато більше доступів виллється на повільніший рівень ієрархії. Це може призвести до напрочуд різких змін продуктивності.
Це також пояснює, чому покращення ємності кешу іноді дають величезний приріст, а іноді майже ніякого. Збільшення кешу з 32 МБ до 96 МБ є надзвичайно цінним, якщо це дозволяє 60 МБ часто використовуваного робочого набору залишатися на чіпі. Це дає значно меншу вигоду, якщо робоче навантаження неодноразово пропускає кілька гігабайтів даних, до яких воно більше ніколи не звернеться.
Таким чином, кеш-пам’ять найкраще працює, коли програмне забезпечення дає їй щось варте запам’ятовування.

Чому процесори мають кілька рівнів кешу замість одного гігантського кешу
Це ставить очевидне питання. Якщо кеш настільки корисний, чому б просто не побудувати величезний надшвидкий кеш і забути про повільнішу пам’ять? Тому що властивості, які ми хочемо від пам’яті, конфліктують між собою.
Найближчі до процесора кеші виготовляються з SRAM і оптимізовані для надзвичайно низьких запізнень доступу та дуже високої пропускної здатності. Але SRAM споживає значну площу кремнію. Більші структури також вимагають більше проводів, довших фізичних шляхів, більше логіки пошуку та часто більше енергії для доступу.
Зі збільшенням ємності підтримка швидкості крихітного локального кешу стає все важчою, і це є основною причиною існування ієрархії.
Кеш L1 достатньо малий, щоб розташовуватися дуже близько до виконавчого ядра і обслуговувати дані з низькими запізненнями. L2 забезпечує більшу ємність з дещо вищими запізненнями. Кеш останнього рівня (зазвичай L3 на сучасних процесорах) забезпечує ще більшу ємність і може бути спільним між ядрами, але доступ до нього, як правило, ще повільніший. Якщо пропустити всі рівні, запит зрештою має пройти до набагато повільнішої DRAM.
Дизайн кешу також виходить далеко за межі ємності. Асоціативність впливає на те, де можуть розміщуватися блоки даних, і може зменшити конфліктні промахи, але більша гнучкість пошуку додає складності. Банкування кешу може збільшити можливості паралельного доступу. Кілька портів покращують пропускну здатність, але коштують площі та потужності. Приватні кеші надають індивідуальним ядрам швидкий локальний доступ, тоді як спільні кеші можуть використовувати загальну ємність більш ефективно та спрощувати певні форми обміну даними.
Intel обговорювала цю точну проблему дизайну у своїх архітектурних дослідженнях, описуючи організацію кешу як балансування між розміром, асоціативністю, запізненнями, пропускною здатністю, приватним порівняно зі спільним організацією, масштабованістю та енергоефективністю.
Потім є узгодженість. Коли кілька ядер процесора кешують копії однієї пам’яті, система повинна гарантувати, що вони не працюватимуть нескінченно з суперечливими версіями даних. Підтримка цієї узгодженої картини генерує додаткову комунікацію та облік, особливо зі зростанням кількості ядер. Більший кеш, отже, не дає універсального безкоштовного обіду.
Технологія 3D V-Cache від AMD є чудовим сучасним прикладом інженерів, які знайшли інший спосіб подолати компроміс. Замість того, щоб значно розширювати кристал ядра процесора горизонтально, AMD вертикально накладає додатковий кристал кешу. Її реалізація другого покоління додає 64 МБ кешу L3, використовуючи пряме з’єднання мідь-мідь та наскрізні кремнієві vias.
Популярність процесорів Ryzen X3D в іграх забезпечує практичну демонстрацію того, що відбувається, коли додатковий кеш відповідає робочому набору робочого навантаження. Ігри постійно маніпулюють станом світу, даними викликів малювання, структурами фізики, анімацією, інформацією про видимість та численними іншими структурами даних. Зберігання більшої кількості цієї часто використовуваної інформації близько до процесора може зменшити дорогі поїздки до DRAM.
Але навіть тут приріст суттєво відрізняється між іграми. Деякі вже вміщують свої критичні дані в звичайні/менші кеші. Інші обмежені в іншому місці. Деякі отримують величезну вигоду.
Ця мінливість — саме те, що передбачає теорія ієрархії пам’яті.

Продуктивність DRAM — це набагато більше, ніж частота та запізнення CAS
Зрештою, дані, які не доступні в кеші, повинні надходити з основної/системної пам’яті, або DRAM.
DRAM пропонує значно більшу ємність, ніж SRAM, за частку вартості за біт, але вона значно повільніша. Інженери, отже, компенсують це пропускною здатністю та паралелізмом.
Сучасна DRAM внутрішньо розділена на банки та групи банків. У межах цих банків є рядки пам’яті. Доступ до даних зазвичай включає активацію рядка в буфер рядка перед зчитуванням або записом потрібних стовпців.
Це призводить до трьох спрощених сценаріїв: якщо потрібний рядок вже активований, контролер отримує хіт буфера рядка. Якщо жоден відповідний рядок не відкритий, його потрібно активувати. Якщо в поточному банку відкритий неправильний рядок, існуючий рядок може спочатку потрібно закрити, перш ніж новий можна буде активувати.
Отже, контролер пам’яті робить набагато більше, ніж просто сліпо пересилає запити процесора. Він відстежує незавершені транзакції та намагається ефективно планувати їх між каналами, рангами, групами банків і банками, дотримуючись обширного набору обмежень синхронізації пам’яті.
Це одна з причин, чому пропускна здатність пам’яті та запізнення пам’яті не слід розглядати як взаємозамінні вимірювання.
Фактично, запізнення описує, скільки часу займає певна операція. Пропускна здатність описує, скільки даних може бути передано за одиницю часу. Система може мати величезну сукупну пропускну здатність і все ще бути відносно поганою в обслуговуванні ланцюга залежних довільних доступів до пам’яті.
І навпаки, робоче навантаження, здатне підтримувати сотні незалежних транзакцій у стані виконання, може толерувати значні запізнення, наближаючись при цьому до вражаючої загальної пропускної здатності.
Пам’ять DDR5 ілюструє, наскільки сильно сучасний дизайн пам’яті залежить від паралелізму. Порівняно з DDR4, DDR5 збільшує кількість груп банків, подвоює стандартну довжину пакету з восьми до шістнадцяти та розділяє DIMM на два незалежні підканали. Micron конкретно зазначає, що збільшення груп банків покращує ймовірність використання менш обмежувальних часових параметрів групи банків і дозволяє залишатися відкритими одночасно більшій кількості сторінок пам’яті.
Це також пояснює, чому налаштування DRAM іноді дають настільки розчаровувальні, непослідовні результати. Збільшення швидкості передавання підвищує теоретичну пропускну здатність. Зменшення затримок може скоротити різні затримки. Додавання рангів може вплинути на доступний паралелізм. Контролер пам’яті, архітектура процесора та поведінка програми визначають, наскільки значним буде покращення для фактичного програмного забезпечення.
Отже, бенчмарк стиснення, гра, база даних та копіювання великого файлу можуть реагувати дуже по-різному на одне й те саме оновлення пам’яті.

GDDR та HBM вирішують різні версії тієї ж проблеми
Відеокартам потрібна величезна пропускна здатність, оскільки тисячі ліній виконання можуть одночасно запитувати дані. Тому споживчі відеокарти використовують пам’ять GDDR, підключену через відносно широкі інтерфейси та працюючу з дуже високими швидкостями передавання.
Прискорювачі ШІ та HPC ще більше просувають це завдяки пам’яті з високою пропускною здатністю (High Bandwidth Memory), або HBM.
Замість розміщення пакетів пам’яті навколо процесора та керування ними через традиційні інтерфейси на рівні плати, HBM складає DRAM-чіпи і використовує надзвичайно широкі інтерфейси, розташовані дуже близько до обробного пристрою, через розширену упаковку.
Результатом є надзвичайна пропускна здатність і хороша енергоефективність на переданий біт, хоча і зі значно більшою складністю упаковки та вищою вартістю.
AMD Instinct MI355X дає корисне уявлення про сьогоднішній масштаб. Один прискорювач містить 288 ГБ HBM3E та забезпечує до 8 ТБ/с теоретичної пропускної здатності пам’яті. Таким чином, системи з вісьмома відеокартами містять 2,3 ТБ HBM.
Ці цифри були б абсурдно надмірними для настільного процесора. Однак для сучасного ШІ, подача даних обчислювальному обладнанню стала однією з центральних архітектурних проблем.

Штучний інтелект перетворив переміщення даних на першокласну проблему продуктивності
Сучасний генеративний штучний інтелект — головним чином у формі великих мовних моделей (LLM) — надає, мабуть, найчіткіший приклад того, чому сира арифметична пропускна здатність може розповісти лише частину історії.
Великі нейронні мережі включають величезну кількість матричних операцій, саме для виконання яких побудовані сучасні відеокарти та спеціалізовані прискорювачі ШІ. Але процесор все ще повинен отримувати ваги моделі, активації та проміжні дані, перш ніж ці арифметичні блоки зможуть виконувати корисну роботу.
Навчання є особливо вимогливим до пам’яті, оскільки система повинна підтримувати набагато більше, ніж просто ваги моделі. Залежно від техніки навчання та оптимізатора, їй також можуть знадобитися градієнти, стани оптимізатора, активації, збережені для зворотного поширення помилки, та тимчасовий робочий простір.
Виведення усуває деякі з цих вимог, але створює власні проблеми з пам’яттю.
Візьміть велику мовну модель із семи мільярдами параметрів. При 16-бітній точності лише ваги вимагають приблизно 14 ГБ, не враховуючи KV-кешу та накладних витрат під час виконання.
Квантування допомагає, оскільки зменшення кожного параметра з 16 до 8 або 4 біт скорочує обсяг пам’яті, необхідний для зберігання та переміщення моделі. Ось чому формати низької точності покращують більше, ніж ємність зберігання. Менша кількість байтів, що переміщуються з пам’яті, може безпосередньо збільшити продуктивність, коли трафік пам’яті є обмежувальним фактором.
Більший висновок виходить далеко за межі ШІ. Повторне обчислення та переміщення даних часто є взаємозамінними витратами. Іноді зберігати результат дешевше, ніж обчислювати його знову. Іноді повторне обчислення значення дешевше, ніж отримання його з віддаленої пам’яті.
Сучасна архітектура все частіше намагається визначити, яка сторона цього компромісу виграє.

Ігри — одне з найскладніших робочих навантажень пам’яті
Ігри особливо цікаві, оскільки не існує єдиного “ігрового навантаження”.
В один момент процесор може обробляти структури видимості/відсікання та готувати виклики малювання. Інший потік може оновлювати фізику або ШІ. Відеокарта одночасно обробляє геометрію, вибирає текстури, читає дані матеріалів, записує цільові об’єкти рендерингу, оцінює шейдери та отримує доступ до структур прискорення. У грі з відкритим світом активи також можуть завантажуватися з накопичувача в системну пам’ять і VRAM у фоновому режимі. Деякі з цих операцій є високоузгодженими, але інші — ні. Це допомагає пояснити кілька тенденцій у апаратному забезпеченні.
З боку процесора, процесори X3D від AMD використовують великі кеші останнього рівня для захоплення більшої частини робочих наборів, що використовуються іграми. Вигода може бути суттєвою, коли критичні ігрові дані в іншому випадку неодноразово подорожують до DRAM.
На відеокартах великі кеші останнього рівня так само зменшують зовнішній трафік VRAM, збільшуючи ефективну пропускну здатність пам’яті та значно знижуючи запізнення доступу до критичних даних. NVIDIA, AMD та Intel істотно змінили структури кешів у поколіннях відеокарт, оскільки уникнення позачіпових транзакцій може покращити ефективну продуктивність пам’яті без необхідності такого ж великого збільшення фізичної пропускної здатності пам’яті.
Трасування променів у реальному часі ще більше ускладнює поведінку даних. Насправді, промені перетинають ієрархії обмежуючих об’ємів (Bounding Volume Hierarchies), або BVH, які є древоподібними структурами даних, що визначають, які частини геометрії сцени вони можуть перетинати. На відміну від традиційних растеризованих робочих навантажень, промені можуть розходитися і рухатися до абсолютно різних областей сцени.
NVIDIA описує це як дивергенцію виконання та дивергенцію даних: сусідні потоки відеокарти можуть слідувати різними шляхами коду, одночасно отримуючи доступ до адрес пам’яті, які важко об’єднати або кешувати. Її технологія перевпорядкування виконання шейдерів (Shader Execution Reordering) була розроблена частково для перегрупування роботи з трасуванням променів таким чином, щоб покращити локальність виконання та даних.
Це важливий приклад, оскільки він показує, що швидша пам’ять не завжди є єдиним вирішенням проблеми пам’яті, оскільки іноді кращим варіантом є реорганізація роботи так, щоб існуюча підсистема пам’яті могла використовуватися ефективніше.
Ігри також можуть бути обмежені ємністю, а не пропускною здатністю чи запізненнями. Якщо потрібні текстури, геометрія та ресурси рендерингу перевищують ємність VRAM, система може переміщувати ресурси через шину PCI-Express із системної пам’яті або вивантажувати та перезавантажувати їх. Відеокарта з величезною теоретичною пропускною здатністю не може компенсувати дані, яких немає в її локальній пам’яті.
Отже, продуктивність пам’яті має кілька вимірів навіть в межах одного кадру: скільки даних вміщується локально, наскільки швидко до них можна отримати доступ, наскільки ефективно доступ об’єднуються, наскільки добре кеші захоплюють повторне використання, і скільки паралельного трафіку може підтримувати архітектура.

SSD демонструють, чому послідовна пропускна здатність не може описати реальну продуктивність накопичувача.
Накопичувачі, мабуть, найлегше демонструють, наскільки оманливою може стати одна цифра пропускної здатності.
Сучасні SSD NVMe PCIe рекламують вражаючу послідовну пропускну здатність, але послідовні передавання є надзвичайно сприятливим робочим навантаженням. Великі безперервні запити дозволяють контролеру ефективно розподіляти роботу між каналами NAND, чіпами та площинами, одночасно підтримуючи багато операцій у стані виконання. Реальні ж додатки часто запитують щось зовсім інше.
Операційні системи, ігри, бази даних та програми можуть запитувати тисячі відносно невеликих частин даних, розкиданих по всьому диску. Ось чому специфікації SSD розрізняють послідовну пропускну здатність та довільні IOPS, глибину черги та запізнення.
Власна документація Solidigm щодо робочих навантажень визначає послідовні доступи як суміжні блоки, довільні доступи як блоки, розкидані по всьому носію, а глибину черги — як кількість незавершених запитів вводу-виводу. Критично важливо, що збільшення глибини черги може покращити пропускну здатність, виставляючи більше паралельної роботи, але це відбувається за рахунок запізнень.
Це концептуально дуже схоже на DRAM. Фактично, SSD на базі флеш-пам’яті NAND містить багато флеш-чіпів, що працюють паралельно за контролером. Сама NAND організована в сторінки та більші блоки стирання, і записи не можуть розглядатися як перезапис байта в DRAM. Контролер виконує трансляцію адрес, вирівнювання зносу, збирання сміття та інші фонові операції, щоб NAND виглядала як звичайний блоковий пристрій.
Ці процеси можуть створювати додатковий внутрішній трафік, відомий як коефіцієнт посилення запису, коли SSD фізично записує більше даних, ніж запитував хост. Збирання сміття також може призвести до сплесків запізнень під час тривалих робочих навантажень.
Споживчі SSD часто додають ще один рівень до ієрархії через швидке кешування запису. Фактично, частина NAND може тимчасово працювати в режимі, схожому на SLC, швидко приймаючи записи, перш ніж дані будуть пізніше згорнуті в щільніші сховища TLC або QLC. Деякі накопичувачі також включають DRAM для відображення даних, тоді як конструкції без DRAM можуть використовувати такі технології, як Host Memory Buffer, для зберігання частин своїх структур відображення в системній пам’яті.
Знову ж таки, пристрій зберігання фактично побудував власну ієрархію пам’яті. І як тільки швидкий кеш вичерпається, стійка продуктивність запису може виглядати дуже відмінно від короткого бенчмарк-сплеску, показаного на сторінці продукту.

Те саме апаратне забезпечення може бути швидким або повільним залежно від робочого навантаження
На цьому етапі має бути зрозуміло, чому бенчмарки пам’яті потребують контексту.
Копіювання великого файлу потребує стійкої послідовної пропускної здатності.
База даних, чутлива до запізнень, може набагато більше піклуватися про невеликі довільні доступи та хвостові запізнення.
Наукова симуляція, що працює з щільними масивами, може чудово використовувати потокову пропускну здатність та векторизацію.
Компілятор може витратити значний час на пошук складних структур даних з відносно поганою просторовою та/або часовою локальністю.
Гра, обмежена процесором, може отримати величезну вигоду від більшого кешу останнього рівня, якщо її гарячий робочий набір вміщується в ньому, тоді як інша гра може ледь реагувати.
Навчання ШІ потребує одночасно величезної обчислювальної пропускної здатності, ємності та пропускної здатності. Декод LLM з низькою конкурентністю може набагато сильніше спиратися на пропускну здатність пам’яті. Виведення з довгим контекстом додає KV-кеш і перетворює доступну ємність пам’яті на ще один центральний ресурс.
Навіть слово пропускна здатність потребує кваліфікації. Існує теоретична пропускна здатність інтерфейсу, стійка програмна пропускна здатність, пропускна здатність кешу, пропускна здатність DRAM, пропускна здатність накопичувача та пропускна здатність інтерконекту. Робоче навантаження може наситити одне, ледь використовуючи інше.
Що врешті-решт визначає продуктивність, так це те, як шаблон доступу до даних програми взаємодіє з усією ієрархією.
Сучасні обчислення все більше стосуються переміщення меншої кількості даних, а не просто швидшого їх переміщення
Ось чому деякі з найцікавіших удосконалень у сучасних процесорах — це не просто швидші арифметичні блоки.
Кеші зберігають повторно використовувані дані близько до виконавчих ресурсів, попередні зчитувачі передбачають майбутні доступи, контролери пам’яті перевпорядковують запити для виявлення паралелізму DRAM, планування потоків GPU намагається покращити узгодженість, плитка розбиває великі проблеми на робочі набори, що вміщуються в менші пам’яті, стиснення зменшує кількість байтів, які потрібно передати, квантування робить те саме для моделей ШІ, HBM фізично наближає великі обсяги пам’яті до прискорювачів через надзвичайно широкі інтерфейси, 3D-штабелювання додає ємність, не змушуючи кожен біт пам’яті бути на тому ж планарному кристалі, чіплетти дозволяють дизайнерам гнучкіше комбінувати спеціалізовані обчислювальні структури, кеш та вводу-виводу, а все більш складні інтерконекти намагаються запобігти тому, щоб комунікація між ЦП, ГПУ та прискорювачами стала наступною стіною.
Загальна тема проста: використовувати дорогі переміщення даних якомога ефективніше.
Сира обчислювальна потужність продовжуватиме зростати. Пропускна здатність пам’яті також зростатиме, кеші збільшуватимуться, HBM ставатиме швидшою, SSD просуватимуться далі в двозначні гігабайти на секунду, а розширені упаковки наближатимуть раніше окремі компоненти.
Однак фізична відстань, енергія, ємність та запізнення гарантують, що жодна окрема технологія пам’яті не зможе одночасно забезпечити величезну ємність, величезну пропускну здатність, незначні запізнення та незначну вартість.
Тому ієрархія пам’яті нікуди не дінеться, і, якщо що, вона стає глибшою та складнішою.
Сучасна продуктивність все більше залежить від розміщення правильних даних на правильному рівні цієї ієрархії ще до того, як процесор їх запитає, та від організації програмного забезпечення таким чином, щоб одні й ті самі дані могли бути повторно використані, а не переміщені знову.
Ядро процесора, що чекає сотні тактів на залежний доступ до пам’яті, не є корисним обчисленням. Відеокарта з тисячами бездіяльних арифметичних блоків, що чекають на VRAM, не є корисною обчисленням. Прискорювач ШІ, здатний до петафлопс, але позбавлений даних моделі, не є корисним обчисленням. Так само, як і 14 ГБ/с SSD, якщо програма не може ефективно видавати та обробляти запити, необхідні для його використання.
Найшвидша операція, зрештою, часто не полягає в тому, щоб отримати дані швидше. Це уникнути отримання взагалі.
Джерело новини: wccftech.com
