Как использовать высокопроизводительные ядра в Apple Silicon
Я разработал приложение для macOS, которое сильно зависит от многопоточности (симулятор колл-центра). Он отлично работает на моем iMac 2019 и хорошо заполняет все ядра. В моем тестовом сценарии он имитирует приложение. 1,4 млн. телефонные звонки в общей сложности за 100 итераций, каждая итерация как элемент отправки в параллельной очереди отправки.
Теперь я купил новый Mac mini с Apple Silicon M1 и очень хотел посмотреть, как улучшится производительность на этой тестовой машине. Что ж, неплохо, но не так хорошо, как я ожидал:
Изучив немного дальше, я заметил, что в начале моделирования все 8 ядер M1 Mac заполнены должным образом, но через несколько секунд только 4 высокоэффективных ядра уже используются.
Я прочитал документы Apple «Оптимизация для Apple Silicon с помощью ядер производительности и эффективности» и дважды проверил, что очередь отправки для итераций настроена правильно:
let simQueue = DispatchQueue.global(qos: .userInitiated)
Но безуспешно. Очевидно, что после нескольких секунд работы высокопроизводительные ядра больше не используются. Я даже попытался настроить очередь с qos, установленным на
.userInteracive
вверх это тоже не помогло. Я также пометил отправляемые товары правильными qos, но это ничего не изменило. Мне кажется, что другие приложения (например, XCode) действительно используют высокопроизводительные ядра даже в течение более длительного времени.
Кто-нибудь знает, как заставить M1 Mac использовать высокопроизводительные ядра?
2 ответа
«M1 8 core» - это действительно «M1 4 производительности + 4 энергосберегающих ядра». Я ожидаю, что его производительность будет немного выше, чем у ядра Intel 6, но не намного. Как видите, на 15% быстрее, чем шесть ядер Intel, или примерно так же быстро, как было бы 7 ядер Intel. Текущие чипы M1 - это процессоры низкого уровня . «Немного лучше шести ядер Intel» - это неплохо.
Ваш код должен работать на ядрах производительности, иначе не было бы никаких шансов приблизиться к производительности Intel. На этом графике ничего не говорит вам, какие ядра используются.
Скорее всего, происходит то, что все ядра запускаются, каждое пытается выполнить одну восьмую работы, и примерно через 8 секунд ядра производительности завершают свою работу. Затем ядра энергосбережения переносят свою работу на ядра производительности. И вы просто неверно интерпретируете изображение, так как только ядра с низкой производительностью выполняют работу.
Я предполагаю, что Apple по многим причинам отдала предпочтение использованию эффективных ядер, а не производительности. Одной из них является время автономной работы, и, скорее всего, тепловые причины. Это большой вопрос с SoC, который изначально был разработан для смартфонов и планшетов. MacOS — гораздо более тяжелая ОС, чем IOS или iPad OS. Apple, скорее всего, считала, что производительные ядра нужны только в тех случаях, когда требуется максимальная пропускная способность. Без сомнения, я думаю, что некоторые, включая меня с M1 Mac Mini, хотели бы найти способ отрегулировать этот баланс между эффективностью и производительностью ядер. Лично я бы предпочел, чтобы все ядра могли переключаться между эффективностью и производительностью, как в технологии Intel Speedshift. Это может произойти вместе с достижениями M1 с точки зрения моделей Mac Pro и других моделей Pro.