Досі в цій серії статей я в загальних рисах розглядав, як працюють процесорні ядра в кремнієвих мікросхемах Apple, і як вони використовують керування частотою та два типи ядер для забезпечення високої продуктивності при низькому енергоспоживанні та споживанні енергії. Як я вже натякав раніше, їхня конструкція також спирається на спеціалізовані процесори та співпроцесори, що є темою цієї статті.
Ядра процесорів Apple Arm CPU вже використовують багато трюків для досягнення високої продуктивності. Серед них – передбачення того, які інструкції мають бути виконані наступними, і виконання інструкцій позачергово, коли це можливо. Перше забезпечує максимально ефективну роботу конвеєра виконання, не чекаючи на рішення про розгалуження коду; друге може усунути втрату часу, коли наступні інструкції вимагають від ядра очікування, перш ніж воно зможе продовжити виконання в суворій послідовності. Разом з іншими методами вони можуть лише гарантувати, що обчислювальні блоки в кожному ядрі працюють максимально ефективно.
Спеціалізовані обчислювальні блоки, тут векторний процесор NEON в кожному ядрі процесора, і співпроцесори, такі як нейронний двигун (ANE), досягають величезного приросту продуктивності за рахунок одночасної обробки декількох даних в архітектурі SIMD (одна інструкція, декілька даних).
Векторний процесор NEON
Найпростіший для розуміння векторний процесор – це блок векторної обробки в кожному ядрі процесора, який може прискорювати операції в 2-8 разів.
У блоці з плаваючою комою в ядрі перемноження двох 32-бітних чисел є однією інструкцією. Коли вам потрібно перемножити тисячу або мільйон пар чисел, то для виконання цього завдання потрібно виконати тисячу або мільйон інструкцій. У блоці NEON в ядрі Arm замість того, щоб завантажувати кожен регістр одним 32-бітним числом для такого множення, блок має широкі регістри по 128 біт, які заповнюються чотирма 32-бітними числами, а потім він перемножує їх по чотири за раз. Таким чином, векторний процесор NEON може множити 32-розрядні числа з плаваючою комою і виконувати багато інших операцій з ними в чотири рази швидше, ніж звичайний блок з плаваючою комою.
Блок NEON – особливий серед цих спеціалізованих процесорів, оскільки він вбудований у кожне з ядер процесора, як P, так і E, і виконує інструкції зі стандартного набору інструкцій Arm. Це робить його теоретично доступним для будь-кого, хто пише код для кремнієвих чіпів Apple, хоча це не так просто, як може здатися. Сучасні компілятори для таких мов, як Swift та Objective-C, не надають такого доступу, тому на практиці, якщо розробник не готовий писати власний асемблерний код, блок NEON доступний лише через математичні бібліотеки, включаючи величезну бібліотеку Accelerate, надану Apple.
Хоча ви могли припустити, що блок NEON в ядрі E буде блідою тінню блоку NEON в ядрі P, це не так, і в чіпі M3 блок NEON в ядрі E обробляє близько 70% від швидкості блоку NEON в ядрі P і трохи швидше, ніж блок NEON в ядрі M1.
Нейронний двигун
Нейронний двигун Apple (ANE) є окремим блоком у мікросхемах M-серії, і він недоступний для третіх осіб. Як наслідок, знання про нього обмежені, і вони були узагальнені Матійсом Холлемансом у цьому документі на GitHub.
Доступ до обчислення ANE можливий лише через CoreML та пов’язані з ним функції в macOS. Навіть там розробники мають обмежені можливості щодо того, що саме виконується в ANE, і на практиці він мало використовується навіть при виконанні завдань машинного навчання. Інструмент енергоспоживання командного рядка звітує про енергоспоживання ANE окремо, але якщо це достовірно, то навіть тести, призначені для його перевірки, відносно рідко виконуються в самому ANE.
Матричний співпроцесор Apple (AMX)
Вперше він був представлений в iPhone 11, але Apple ніколи не визнавала його існування і не надавала жодної інформації про AMX. Найкращий підсумок роботи на сьогоднішній день наведено в нещодавньому препринті Філо, Брандао та Лопеса.
У чіпах серії M кожен кластер ядер процесора, незалежно від типу P або E, має власний AMX, який розділяє кеш L2, що використовується цим кластером, і має доступ до уніфікованої пам’яті. Інструкції передаються йому від ядер CPU, оскільки вони кодуються як інструкції Arm з використанням спеціальних зарезервованих кодів, а дані передаються через пам’ять, а не безпосередньо між ядрами CPU та AMX. Продуктивність оптимізована для роботи з матрицями, а не з векторами, яким віддають перевагу пристрої NEON, і Фільо та його колеги продемонстрували надзвичайно високу продуктивність у складних тестах.
Доступ до співпроцесорів AMX суворо контролюється; хоча Фільо та кілька інших розробників змогли запустити власний код на AMX, загалом єдиний спосіб, у який розробник може використовувати потужність AMX, – це бібліотека Apple Accelerate. powermetrics не звітує про використання потужності AMX окремо, але припускається, що вона включена в показники для ядер процесора.
У деяких варіантах M1 стратегія розподілу ядер macOS, схоже, змінена, щоб врахувати використання AMX. Оскільки кожен кластер ядер CPU має власний AMX, при запуску декількох потоків, які, як передбачається, використовують ці співпроцесори, вони розподіляються, щоб збалансувати кількість потоків між кластерами. Замість того, щоб потоки з високим QoS розподілялися на перший P-кластер, потім на другий і, нарешті, на E-кластер, зі збільшенням кількості потоків спостерігається інша картина.
Червоні клітинки показують ядра, що використовуються при виконанні потоків матричного множення з високим QoS, для різної кількості потоків. Зазвичай, коли виконуються 2 потоки, вони розподіляються на P ядер в одному кластері, аналогічно з 3 і 4 потоками. Замість цього, другий потік розподіляється на ядро в другому P-кластері, а при 3 потоках третій потік виконується двома E-ядрами, які також мають власний AMX. Такий розподіл потоків між трьома кластерами триває до тих пір, поки не залишиться 8 потоків і лише одне P-ядро в кожному з двох P-кластерів не буде працювати вхолосту.
Цей характерний розподіл ядер не спостерігається, коли ті ж самі тести виконуються на M3 Pro з окремими кластерами P і E.
Графічний Процесор
Хоча графічні процесори (GPU) серії M в першу чергу призначені для прискорення графіки, їх можна використовувати в режимі Compute для виконання обчислень загального призначення, як і в більшості інших GPU. Це єдиний спеціалізований процесор, який пропонує розробникам відносно вільний доступ, хоча навіть тут він поставляється у вигляді коду Metal Shading Language, заснованого на мові C++, в шейдері Metal Shader. Налаштування є складним, вимагає компіляції шейдера на певному етапі, а також управління буферами даних і команд.
Члени сімейства мікросхем M-серії мають різні графічні процесори, причому варіанти Max і Ultra мають найбільшу обчислювальну потужність у своїх великих графічних процесорах, тоді як базовий варіант має найменший графічний процесор. Там, де програми використовують цю функцію Compute, вона може значно підвищити продуктивність, хоча це здається відносно незвичним. На щастя, оскільки показники енергоспоживання звітують про вимірювання окремо для кожного графічного процесора, включно з енергоспоживанням, це легко оцінити.
Енергоспоживання
Великою перевагою співпроцесорів є те, що коли вони не використовуються, вони споживають мало енергії або взагалі не споживають її. Однак, коли вони працюють при повному навантаженні, їхнє енергоспоживання може значно перевищувати сумарне енергоспоживання всіх ядер центрального процесора.
Максимальна потужність, що використовується 12 ядрами M3 Pro, зазвичай не перевищує 7 Вт при роботі з цілими числами або числами з плаваючою комою; вона зростає до понад 13 Вт при виконанні коду у векторних процесорах NEON. Хоча енергоспоживання AMX не можна виміряти окремо, коли він знаходиться під великим навантаженням, сумарне енергоспоживання цього та центрального процесорних ядер зростає до 45 Вт.
Енергоспоживання графічного процесора неминуче сильно варіюється в залежності від GPU. Важке обчислювальне навантаження на скромному 18-ядерному графічному процесорі в M3 Pro може легко споживати 24 Вт, а 40 ядер графічного процесора в M3 Max можуть перевищувати 40 Вт.
На жаль, порівняння енергоспоживання ідентичних завдань, що виконуються на ядрах і співпроцесорах CPU, пов’язане з певними труднощами, але в багатьох випадках використання ядер CPU все одно було б нездійсненним. Можливо, найбільш корисним тут буде порівняння з військовим кораблем, оснащеним дизельними двигунами для нормального плавання зі швидкістю 10-15 вузлів і газовими турбінами для швидкого прискорення до швидкості понад 30 вузлів, коли це необхідно.
Концепції
- Обидва ядра P і E містять власний блок векторної обробки NEON, який може застосовувати одну інструкцію до декількох даних, щоб досягти значного покращення продуктивності для відповідних завдань.
- Доступ до нейронного движка ANE можна отримати опосередковано через бібліотеки macOS, але наразі він мало використовується.
- Кожен кластер процесорних ядер має власний матричний співпроцесор AMX, який може досягти дуже високої продуктивності, але доступ до нього можна отримати лише через певні функції математичної бібліотеки Apple Accelerate.
- Розробники можуть писати металеві шейдери для використання GPU в режимі Compute. Його продуктивність залежить від варіанту чіпа M-серії, але може забезпечити значне покращення для певних завдань.
- Співпроцесори споживають мало або зовсім не споживають енергії, коли не використовуються, але споживають багато енергії, коли повністю завантажені. Таким чином, вони є частиною ефективної конструкції кремнієвих чіпів Apple, пропонуючи чудову продуктивність, коли це необхідно.
Оригінал статті Ґоварда Уоклі на сайті eclecticlight.co
Інші статті циклу: