что такое flops в смартфоне
Учи матчасть. Выбираем смартфон по процессору
Во времена мобильных телефонов, которые были «глупыми» и мало что, по нынешним меркам, умели, особого внимания начинке покупатель не уделял. Бо́льшую важность представляли внешний вид, объем памяти для записи телефонных номеров и SMS, позже — «навороты» в виде браузера, почтового клиента и тому подобные. Может, играла роль престижность модели.
Как это часто бывает, все изменила Apple, выпустив джинна из бутылки — оригинальный iPhone. Он дал начало новой моде на девайсы. Хотя «яблочная» корпорация не была первой в сфере «умных телефонов» (ведь задолго до этого существовали IBM Simon, Nokia 9000 Communicator, Qualcomm pdQ 800 и другие), именно она смогла популяризовать направление — своим подходом, созданием должного образа и, что самое главное, экосистемы.
В бой ринулись многие, дав толчок развитию технологий, позволяющих нарастить мощность «телефонов» нового поколения — смартфонов в том виде, в котором мы привыкли их видеть. Постепенно мобильные устройства стали походить по своей производительности и возможностям на компьютеры, поэтому ожидания и требования к ним возрастали.
Сегодня рынок устоялся, основных игроков, выпускающих мобильные процессоры, не так много, к тому же они используют решение одной компании Аrm, подстраивая его под себя. Расскажем простыми словами, что это за зверь — мобильный процессор. А позже перейдем к другим компонентам смартфонов.
Коротко, о чем пойдет речь:
Мобильный процессор, но правильнее — SoC
В отличие от домашнего компьютера, смартфон использует несколько иную логику: в случае с умными мобильниками процессором часто называют всю «систему на чипе» — SoC (System-on-a-Chip), или «систему на кристалле». Это набор компонентов, которые выполняют основные функции смартфона — от обработки данных, поступающих из всех источников, до подключения к беспроводным сетям и вывода картинки на экран.
То есть SoC — это собственно вычислительный процессор (CPU), «видеокарта» (GPU), модемы (3G, 5G и тому подобные), модули беспроводной связи (Wi-Fi, Bluetooth) и что угодно еще, но мы будем говорить именно о «процессоре», то есть об основном вычислительном компоненте. Отметим, что существуют и раздельные решения, когда тот или иной компонент не интегрирован, однако основной путь — «все вместе».
Какие мобильные процессоры самые-самые? Сейчас к актуальным и топовым относятся: Apple A13 Bionic для iPhone, Snapdragon 855 и 855 Plus для большинства Android-смартфонов, Helio G90, Exynos 990 для смартфонов Samsung, Kirin 990 для Huawei и Honor. Хотя те, что постарше на год-два, не особенно хуже, и средний юзер не ощутит разницы в производительности от слова «вообще».
Многоядерность, тактовая частота
Все адекватные производители смартфонов используют сегодня решения с многоядерными процессорами. Многоядерность позволяет эффективнее утилизировать ресурсы.
«Многоядерность — это плюс и минус одновременно»
Появляется возможность одновременного выполнения нескольких заданий (работа приложений в фоне). Кроме того, в одном CPU обычно компонуются как менее производительные ядра, так и более производительные с разной тактовой частотой. В восьмиядерном процессоре это могут быть «наборы» 4+4, 4+3+1 или другие в зависимости от производителя процессора и требований заказчика.
Нужно набрать SMS или посмотреть список дел? Задействованы «слабые» ядра с низкой частотой, нагрузка на батарейку минимальная. Запустили игру? Включились «сильные» ядра, аккумулятор стал активнее терять заряд. В жизни это означает, что один и тот же смартфон в руках мобильного геймера или любителя поснимать видео в 4K продержится часов пять, а у предпочитающего только звонки и SMS — двое суток.
Многоядерность — это плюс и минус одновременно. Наличие разных инструментов (ядер) позволяет сделать смартфон универсальным для разных задач. Но в то же время нужно научить их работать правильно со всеми приложениями, а это получается не всегда. Что выливается в проблемы, например, с производительностью (система не понимает, что нужно включить производительные ядра, и все «тупит») или утечкой энергии (работает все на максимуме, аж дым идет, когда не надо).
Ядра бывают разные
Производители смартфонов используют ядра (архитектуру), разработанные в компании Arm. Дизайн чипов при этом проектируют отдельно: Apple делает свое, Samsung, Huawei, Qualcomm и MediaTek — свое.
Одно и то же ядро (например, Cortex-A77 — самый актуальный вариант) может работать на разной частоте в зависимости от устройства и собственной модификации. Ядра объединяют в кластеры — те самые «наборы».
От дизайна зависит, сколько может быть ядер в одном кластере. Общее количество ядер в одном процессоре Android-смартфона обычно составляет восемь (в самых свежих iPhone — шесть).
«Количество ядер не указывает на производительность смартфона»
big.LITTLE, в свою очередь, расшифровывается просто: есть ядра более производительные (big) и менее производительные (little). Смартфон должен обеспечить плавное переключение на лету между кластерами в зависимости от задач, выполняемых мобильником. Это сложно и иногда работает со сбоями. Логика инженеров Apple и их возможности немного иные. Также есть и другие нюансы, объективно выделяющие «яблоко» из остальных (часто ли вы видели тормозящий iPhone?).
В качестве примера приведем флагманский процессор Snapdragon 855+ для Android-смартфонов. Он использует чип с одним высокопроизводительным ядром до 2,84 ГГц, двумя производительными до 2,42 ГГц, построенными на базе Cortex-A76 (они же кастомные Kryo 485 Gold и Kryo 485 Gold Prime), и четырьмя энергосберегающими до 1,8 ГГц на базе Cortex-A55 (Kryo 485 Silver). Итог — три кластера под разную интенсивность работы.
И, как мы видим, ядра, базируясь на одной архитектуре, имеют модификации, что отражается на их тактовой частоте.
Еще один момент: количество ядер не указывает прямо на производительность смартфона. Поэтому восемь слабых ядер уступят компоновке из четырех мощных и четырех малопроизводительных.
Важно также, как производитель позиционирует смартфон. Поэтому заморачиваться по поводу того, какой процессор установлен в свежем флагмане, особенно не стоит: наверняка там будет адекватное решение (актуально для зарекомендовавших себя брендов).
Какие-то нанометры
«У вас будет 7-нанометровый процессор!» Речь о размерах транзисторов, из которых «собран» CPU. Чем меньше цифра, тем в теории лучше. Когда-то в смартфоны устанавливали 64-нанометровые процессоры, сейчас мейнстримом становится 7 нанометров, однако есть также 8-нанометровые, 10-нанометровые и более «крупные» для смартфонов подешевле и постарше.
Представьте, что на одну и ту же площадь можно установить больше маленьких транзисторов, повысив тем самым общую вычислительную мощность. К тому же они нагреваются меньше, что позволяет еще больше увеличить производительность.
К примеру, 7-нанометровый чип будет производительнее 14-нанометрового при том же напряжении на четверть или таким же по производительности при вдвое сниженном напряжении (и батарея сядет позже).
Но есть нюанс, связанный с маркетингом (куда без него): производители могут использовать разные способы подсчета нанометров и производительности, так что эти цифры носят отчасти условный характер, из-за чего прямое сравнение возможностей процессоров от разных компаний не всегда возможно.
Троттлинг
Обычно троттлинг означает чрезмерный нагрев процессора, после которого тот снижает частоту и заметно теряет в производительности. Это механизм защиты, придуманный для того, чтобы сохранить целостность CPU в критической ситуации. Отчего случается «плохой троттлинг»?
«Если система отвода тепла не продумана, гигагерцы не помогут»
Например, из-за желания производителя смартфона «разогнать» ядра процессора, не обеспечив эффективного охлаждения и/или не проведя оптимизацию ПО и других «железных» компонентов. Или чтобы набрать больше баллов в тестах, рекламируя свой телефон как «самый мощный». А еще из-за желания вендоров идти по грани, удерживая максимальную производительность долгое время. По большому счету троттлинг в смартфонах неизбежен, но с ним можно управиться, и чем труднее процессору добраться до точки кипения, тем он эффективнее.
В спецификациях к мобильнику можно заявить о частоте в 2,5 ГГц на все восемь ядер, производительность будет «доказана» в синтетических тестах. В реальности же смартфон не будет справляться с играми или тяжелыми приложениями: первые пару минут все будет хорошо, затем последует сильный нагрев из-за попыток CPU выдавить из себя условные 2,5 ГГц, появятся «фризы», «тормоза», аппарат будет неприятно горячим и станет бесполезным — если система отвода тепла не продумана, а ПО работает плохо.
GFLOPS или по поводу производительности GPU
Практически все юзеры, которые понимают что-то в SoC вступают в кровопролитные споры о том, чей смартфон, процессор, GPU круче. Собственно, мощность GPU измеряют в FLOPS- специальной единице, которая показывает, сколько операций с плавающей запятой может выполнить GPU(и не только) в секунду. Кому интересно, прошу под кат!
Начнем с самого популярного GPU- Mali-400. Этот GPU завоевал немалую славу за счет своей производительности и энергопотребления. Одновременно мощный и экономный по отношению к заряду аккумулятора чип использовался во многих процессорах- от NovaThor U8500 до Exynos 4412. Существует множество разновидностей этого GPU, которые отличаются кол-вом ядер. Ниже привожу несколько сматфонов, в которые внедрен этот GPU и кол-во GFLOPS.
Samsung Galaxy Ace 2- Mali-400MP- 275MHz- 2.48Gflops
Samsung Galaxy S3- Mali-400MP4- 533MHz- 19.2Gflops
Довольно большая разница, не правда ли?
Также развожу миф о том, чем больше частота, тем мощнее чип
Mali-450MP4- 700MHz, который стоит в MT6592, и который, по заверениям нескольких пользователей Трешбокса должен побить даже ещё не вышедший Adreno 420. Результат- 41.8Gflops. Довольно большой шаг вперед по сравнению с Mali-400MP4, но Adreno 330- 450MHz набирает целых 129.6Gflops, что нереально много. Причем его частота ниже, чем на Mali-450MP4 на 250MHz. Для сравнения топовый PowerVR G6430- 450MHz, который стоит в IPhone 5S и IPad Air набирает 115.2Gflops.Самый мощный Mali-628MP6- 533MHz, который стоит в Octa версии Samsung Galaxy Note 3 набирает 102.4Gflops.
Также не стоит забывать Tegra 4 и Tegra 4i. GeForce ULP x72, который стоит в Tegra 4 набирает 96.8Gflops, а его LTE-брат с GeForce ULP x60- 79.2
Но тут происходит самое интересное, ведь Adreno 330 имеет и 550MHz версию(которую в скором будущем можно будет получить при помощи кастомных ядер) и эта самая разогнанная версия набирает целых 158.4Gflops! Это рекорд.
Давайте посмотрим и на более старые GPU, такие как Adreno 320, Adreno 225, GeForce ULP x12 и PowerVR SGX544MP3 и SGX554MP4, также не стоит забывать и о простом SGX544MP, который стоит в сверхпопулярном чипе MT6589.
Также, давайте рассмотрим видео процессоры Adreno 203, Adreno 205, Adreno 200, Adreno 220 и Adreno 305.Первые 4 видео процессора набирают следующие оценки: Adreno 200- 3.92Gflops при частоте 245MHz, Adreno 203- 7.84Gflops при той-же частоте 245MHz. Как видим: двукратный результат при одинаковой частоте.
Adreno 205- продолжение 203-го. Он набирает 8.5Gflops, что не очень много, но следующий GPU, под названием Adreno 220 ломает стереотипы не самых топовых GPU: невероятные 18Gflops- уровень Mali-400MP4 533MHz, который стоит в топовом Samsung Galaxy S3. Теперь рассмотрим Adreno 305, который является упрощённой версией Adreno 320. Данный GPU стоит в таких процессорах, как Snapdragon S4 Plus и Snapdragon 400. Так вот, данный ускоритель набирает 21.6Gflops при частоте 450MHz.
Adreno 320 разделяется на два разряда: который стоит в S4 Pro, и который стоит в Snapdragon 600. Отличаются они кол-вом блоков: если у S4 Pro версии их 64, то у 600 версии их 96. Adreno 320 S4 Pro набирает 57Gflops, а его S600 версия целых 97.2 при частоте 450MHz. Это даже больше, чем GeForce ULP x72, поэтому в Snapdragon 600 1.9GHz более мощный GPU, чем в Tegra 4. Шокирующий результат.
Давайте посмотрим на Adreno 225. При частоте в 400MHz он набирает 25.6Gflops. Для сравнения GeForce ULP x12, который стоит в Tegra 3 набирает 12.5Gflops при частоте 520MHz. Adreno 225 мощнее чем GeForce ULP x12… Мда… Но если по делу, то у GeForce ULP x12 производительность на уровне… На 4.5Gflops ниже, чем на Adreno 220…
Теперь перейдем к PowerVR SGX544MP3, который стоит в Exynos 5410 или, проще говоря в Samsung Galaxy S4. Его производительность составляет 51.1Gflops. Не самый мощный. Более топовый SGX554MP4, который послужил игровой основой для IPad 4 выдает 76.8Gflops. Значительно больше.
Но как только я узнал производительность SGX544MP, который стоит в MT6589 и MT6589T я… неважно. У MT6589 версия с частотой 286MHz. Он выдает всего 9.2Gflops. Это очень мало, но всеравно больше, чем у его младшего брата MT6589M. У него граф. ускоритель работает на частоте всего 156MHz. Честно говоря мне не хочется говорить о этом процессоре, но придется. Так вот, он выдает всего 4.9Gflops. Это немногим лучше, чем на Adreno 200. Турбированный MT6589T владеет ускорителем с частотой 357MHz и это дает ему 11.4Gflops.
А теперь по поводу консолей. Многими любимый PSP выдает всего 2.6Gflops. Вы помните невероятную графику PSP игр? А то, как они плавно шли на нем? Adreno 330 более чем в 50 раз мощнее, чем PSP. Но 50-кратного прироста не ощущается. PSVita- это серьезное развитие железа. Он обладает PowerVR SGX543MP4+ и это дает внушительные 51.2Gflops.
А теперь по поводу PS и Xbox. PS3 обладает производительностью в 228.8Gflops и я верю, что следующее поколение GPU будет мощнее, чем любимая многими приставка, но до уровня PS4, который набирает 1840Gflops еще, как раком до Китая. Кстати, сверхмощная видеокарта Nvidia GeForce GTX Titan набирает 4500Gflops, а новый GTX 780Ti примерно 4800Gflops. До компа, как до Луны 😀
О, забыл о видео ускорителе Vivante GC6400, который работает на частоте 800MHz. Этот видеоускоритель- единственный конкурент адскому Adreno 330: его производительность составляет 128. Gflops, что всего на 1.6Gflops меньше, чем у Adreno 330, но мы знаем, что разработчики не сильно хотят оптимизировать игры под этот редкий ускоритель. Я, например, не знаю ни одного устройства с данным ускорителем. Кто знает: напишите, пожалуйста, в комментариях
Если составить рейтинг мобильных GPU, то получается следующий список:
Но не стоит забывать об энергопотреблении, ведь если судить именно по нему, то рейтинг немного поменяется 🙂
Почему даже на самых мощных смартфонах игры хуже, чем на ПК и консолях?
Каждый год производители мобильников радуют нас новыми цифрами производительности. Apple хвастается крутыми графиками и постоянными обновлениями графических API (инструментов для работы с «железом» смартфонов) – мол, теперь в 100500 раз быстрее, чем раньше. Так куда же «сливают» все эти гигафлопсы? В какую чёрную дыру они улетают, если даже новейшие мобильные игры на самых мощных смартфонах всё равно отстают от игр десятилетней давности – не только по геймплею, но и по графике?
Сравните, например, консольную Burnout: Paradise 2008 года с мобильной Asphalt 9 2018-го. Burnout на Xbox 360 и PlayStation 3 работала в разрешении 720p с частотой 60 FPS – и это была гонка в открытом мире! Там были реальные и вполне детальные отражения на кузове автомобиля и в целом графика до сих пор смотрится свежо (если б не старомодные эффекты пост-процессинга).
Почему же такое происходит? Почему несмотря на все достижения технического прогресса мобильные игры остаются буквально на дне индустрии? Этому есть несколько причин. Разделим их на две категории: технические и экономические.
Технические причины
1. Флопсы флопсам рознь
Когда мы говорим о производительности такого-то чипа в количестве операций в секунду, то мы не учитываем, а чем, собственно, этот чип вообще будет занят и как обрабатывать поступающую информацию. Разработчики игр для консолей могут иметь прямой доступ к любому железу (почти) и нагружать его как угодно, при этом операционная система самой консоли отдаёт играм максимальный приоритет, да и в целом сама по себе ОС достаточно лёгкая. Грубо говоря – процессор и графика консоли заняты исключительно игрой и вся их производительность (почти) работает на игру.
У мобильников (как и у персональных компьютеров, кстати) забот гораздо больше. И прямого доступа к «железу», считай, нет, и операционные системы тяжёлые, да и приоритеты совсем другие. Вы же не хотите пропустить важный звонок только из-за игрушки? Хотя, признаемся, бывает и такое желание. Но всё-таки, ни Android, ни iOS себе такого позволить не могут. Да и фоновых процессов там куча.
2. Тротлинг и проблема охлаждения
Предыдущий пункт очевиден многим, мы его упомянули только потому, что не упомянуть его всё равно нельзя. Но гораздо меньше людей задумываются о тротлинге – то есть, об уменьшении быстродействия процессора (за счёт пропуска тактов) в случае перегрева.
Snapdragon 810, конечно, вопиющий случай, но по нему наглядно видны проблемы со стабильностью работы процессоров в смартфонах (источник: Ars Technica)
Взять ту же Nintendo Switch – по факту это просто планшет на Nvidia Tegra X1. Такой же, как Shield TV, не считая геймпада. В стационарном режиме Tegra X1 в Switch может работать на частоте 768 МГц, тогда как в портативном – либо 302,7 МГц, либо 368 МГц. Проблема в том, что Switch не может позволить себе замедлиться ни при каких условиях. Ни на один мегагерц. Собственно, именно для этого в Switch понижается тактовая частота Tegra X1 (номинальная её частота – 1000 Мгц) не только в портативном режиме, но даже в режиме док-станции. Потому, что консоль должна быть рассчитана (и она рассчитана) на постоянную работу под максимальной нагрузкой со стабильной производительностью. А мобильник может спустя 10 минут игры в новомодную игрушку взять и срезать частоту.
А здесь Xiaomi Mi 8 работает в полную силу только с искусственным охлаждением (в морозилке, например). Источник: GSMArena
Даже если будут тормоза – мобильной ОС всё равно, лишь бы не сгореть. Тем более, что размеры мобильников не позволяют устанавливать туда активное охлаждение. Да и как вы представляете себе мобильник с вентиляторами? А вот в той же Switch вентилятор есть. Что уж говорить про стационарные консоли!
3. Фрагментированность
Конечно, даже несмотря на оба фактора, перечисленных выше, можно постараться и выжать все соки из топового железа – хотя бы на 5 минут геймплея. Проблема в том, что такого железа «на руках» очень мало, и ту же графику неизменно придётся понижать для обладателей средних девайсов. В итоге такие затраты сил, времени и денег уйдут практически впустую.
Если делать игры без учёта маломощных смартфонов, много денег не заработаешь
Помните, на заре появления Nvidia Tegra было немало эксклюзивных игр именно для этой SoC («процессора», как говорят в народе)? Tegra на то время на аппаратном уровне поддерживала множество эффектов (например, частицы воды). Но, во-первых, конкуренты быстро догнали Tegra, а во-вторых, пока это не случилось, в эти игры играли единицы. Ну и стоит ли оно того?
4. Неудобное управление
Одна из главных причин, почему нормальные игры на мобильниках невозможны – неудобное управление. Прежде всего, давайте признаем, что сенсорный экран подходит лишь для двух типов игр – point-&-click (стратегии, игры одной кнопки, квесты «найди предмет в этой комнате») и игр с физикой и управлением гироскопом/акселерометром (катай шарик по полю). Всё. В лучшем случае можно придумать что-то вроде аркадных гонок, где управляешь наклоном смартфона и нажимаешь пару педалей – это максимум, что можно выжать из смартфонного управления.
Наэкранные же кнопки не только неудобны, они ещё и сильно сужают обзор.
Конечно, можно купить геймпад. Но, во-первых, какой? С консолями геймпады поставляются в комплекте, и любой разработчик игры может точно быть уверен, какой это геймпад, сколько там кнопок (и каких), как они расположены. А вот для мобильников геймпады далеко не универсальны по количеству и расположению кнопок.
Но главная проблема – инпут-лаг (отклик на нажатие), особенно у Android-смартфонов. При подключении обычного Bluetooth-геймпада инпут-лаг составляет 120-150 мс (причём, чаще именно 150), что делает игру крайне затруднительной. На консолях уже 100 мс считается высоким инпут-лагом, а тут 120 – редко достижимый минимум.
Думаете, проводные геймпады решают проблему? Вовсе нет. Автор этого текста тестировал модуль геймпада для Moto Z2 Play, который подключается к смартфону с помощью контактной площадки. Так вот – с этим геймпадом инпут-лаг возрастал до 200 мс! Причём, с этим же телефоном простой китайский геймпад выдавал 120-150 мс! (К слову, это не невидаль какая-то – у геймпада PlayStation 4 тоже по проводному подключению инпут-лаг внезапно выше, чем по Bluetooth).
Конечно, в некоторые игры можно играть и так. Медленные, неторопливые. Но рассчитывать на нормальные слэшеры, файтинги и шутеры на мобилках не приходится. Разработчик не может позволить себе «наказывать» игрока за медленную реакцию, если имеется такой дикий лаг в управлении вкупе с общим дискомфортом. Вообще, высокий инпут лаг – проблема Android, там даже с реакцией на сам экран не всё гладко.
Экономические причины
В экономических причинах всё гораздо интереснее. Прежде всего, потому, что здесь уже речь не столько о том, почему «графона не завезли», а о том, почему сами игры – плохие.
1. 100 рублей – дорого
Одна из главных причин – разработка хорошей игры стоит дорого, и это касается не только графики. Но владельцы мобильников не привыкли столько платить. Когда Doom только вышел на PlayStation 4 и Xbox One, он стоил 3999 рублей. И его покупали! Когда цену на Xbox One на постоянной основе скинули до 849 рублей – его купили даже те, кому эта игра не особо нужна. Потому что для консольщика 849 рублей – это копейки, огромная скидка.
Как и зачем мерить FLOPSы
Как известно, FLOPS – это единица измерения вычислительной мощности компьютеров в (
попугаях) операциях с плавающей точкой, которой часто пользуются, чтобы померить у кого больше. Особенно важно померяться FLOPS’ами в мире Top500 суперкомпьютеров, чтобы выяснить, кто же среди них самый-самый. Однако, предмет измерения должен иметь хоть какое-нибудь применение на практике, иначе какой смысл его замерять и сравнивать. Поэтому для выяснения возможностей супер- и просто компьютеров существуют чуть более приближенные к реальным вычислительным задачам бенчмарки, например, SPEC: SPECint и SPECfp. И, тем не менее, FLOPS активно используется в оценках производительности и публикуется в отчетах. Для его измерения давно уже использовали тест Linpack, а сейчас применяют открытый стандартный бенчмарк из LAPACK. Что эти измерения дают разработчикам высокопроизводительных и научных приложений? Можно ли легко оценить производительность реализации своего алгоритма в FLOPSaх? Будут ли измерения и сравнения корректными? Обо всем этом мы поговорим ниже.
Давайте сначала немного разберемся с терминами и определениями. Итак, FLOPS – это количество вычислительных операций или инструкций, выполняемых над операндами с плавающей точкой (FP) в секунду. Здесь используется слово «вычислительных», так как микропроцессор умеет выполнять и другие инструкции с такими операндами, например, загрузку из памяти. Такие операции не несут полезной вычислительной нагрузки и поэтому не учитываются.
Значение FLOPS, опубликованное для конкретной системы, – это характеристика прежде всего самого компьютера, а не программы. Ее можно получить двумя способами – теоретическим и практическим. Теоретически мы знаем сколько микропроцессоров в системе и сколько исполняемых устройств с плавающей точкой в каждом процессоре. Все они могут работать одновременно и начинать работу над следующей инструкцией в конвеере каждый цикл. Поэтому для подсчета теоретического максимума для данной системы нам нужно только перемножить все эти величины с частотой процессора – получим количество FP операций в секунду. Все просто, но такими оценками пользуются, разве что заявляя в прессе о будущих планах по построению суперкомпьютера.
Практическое измерение заключается в запуске бенчмарка Linpack. Бенчмарк осуществляет операцию умножения матрицы на матрицу несколько десятков раз и вычисляет усредненное значение времени выполнения теста. Так как количество FP операций в имплементации алгоритма известно заранее, то разделив одно значение на другое, получим искомое FLOPS. Библиотека Intel MKL (Math Kernel Library) содержит пакет LAPAСK, — пакет библиотек для решения задач линейной алгебры. Бенчмарк построен на основе этого пакета. Cчитается, что его эффективность находится на уровне 90% от теоретически возможной, что позволяет бенчмарку считаться «эталонным измерением». Отдельно Intel Optimized LINPACK Benchmark для Windows, Linux и MacOS можно качать здесь, либо взять в директории composerxe/mkl/benchmarks, если у вас установлена Intel Parallel Studio XE.
Очевидно, что разработчики высокопроизводительных приложений хотели бы оценить эффективность имплементации своих алгоритмов, используя показатель FLOPS, но уже померянный для своего приложения. Сравнение измеренного FLOPS с «эталонным» дает представление о том, насколько далека производительность их алгоритма от идеальной и каков теоретический потенциал ее улучшения. Для этого всего-навсего нужно знать минимальное количество FP операций, требуемое для выполнения алгоритма, и точно измерить время выполнения программы (ну или ее части, выполняющей оцениваемый алгоритм). Такие результаты, наряду с измерениями характеристик шины памяти, нужны для того, чтобы понять, где реализация алгоритма упирается в возможности аппаратной системы и что является лимитирующим фактором: пропускная способность памяти, задержки передачи данных, производительность алгоритма, либо системы.
Ну а теперь давайте покопаемся в деталях, в которых, как известно, все зло. У нас есть три оценки/измерения FLOPS: теоретическая, бенчмарк и программа. Рассмотрим особенности вычисления FLOPS для каждого случая.
Теоретическая оценка FLOPS для системы
Чтобы понять, как подсчитывается количество одновременных операций в процессоре, давайте взглянем на устройство блока out-of-order в конвеере процессора Intel Sandy Bridge.
Здесь у нас 6 портов к вычислительным устройствам, при этом, за один цикл (или такт процессора) диспетчером может быть назначено на выполнение до 6 микроопераций: 3 операции с памятью и 3 вычислительные. Одновременно могут выполняться одна операция умножения (MUL ) и одна сложения (ADD ), как в блоках x87 FP, так и в SSE, либо AVX. С учетом ширины SIMD регистров 256 бит мы может получить следующие результаты:
8 MUL (32-bit) и 8 ADD (32-bit): 16 SP FLOP/cycle, то есть 16 операций с плавающей точкой одинарной точности за один такт.
4 MUL (64-bit) и 4 ADD (64-bit): 8 DP FLOP/cycle, то есть 8 операций с плавающей точкой двойной точности за один такт.
Теоретическое пиковое значение FLOPS для доступного мне 1-сокетного Xeon E3-1275 (4 cores @ 3.574GHz) составляет:
16 (FLOP/cycle)*4*3.574 (Gcycles/sec)= 228 GFLOPS SP
8 (FLOP/cycle)*4*3.574 (Gcycles/sec)= 114 GFLOPS DP
Запуск бенчмарка Linpack
Запускам бенчмарк из пакета Intel MKL на системе и получаем следующие результаты (порезано для удобства просмотра):
Здесь нужно сказать, как именно учитываются FP операции в бенчмарке. Как уже упоминалось, тест заранее «знает» количество операций MUL и ADD, которые необходимы для перемножения матриц. В упрощенном представлении: производится решение системы линейных уравнений Ax=b (несколько тысяч штук) путем перемножения плотных матриц действительных чисел (real8) размером MxK, а количество операций сложения и умножения, необходимых для реализации алгоритма, считается (для симметричной матрицы) Nflop = 2*(M^3)+(M^2). Вычисления производятся для чисел с двойной точностью, как и для большинства бенчмарков. Сколько операций с плавающей точкой действительно выполняется в реализации алгоритма, пользователей не волнует, хотя они догадываются, что больше. Это связано с тем, что выполняется декомпозиция матриц по блокам и преобразование (факторизация) для достижения максимальной производительности алгоритма на вычислительной платформе. То есть нам нужно запомнить, что на самом деле значение физических FLOPS занижено за счет неучитывания лишних операций преобразования и вспомогательных операций типа сдвигов.
Оценка FLOPS программы
Чтобы исследовать соизмеримые результаты, в качестве нашего высокопроизводительного приложения будем использовать пример перемножения матриц, сделанный «своими руками», то есть без помощи математических гуру из команды разработчиков MKL Performance Library. Пример реализации перемножения матриц, написанный на языке С, можно найти в директории Samples пакета Intel VTune Amplifier XE. Воспользуемся формулой Nflop=2*(M^3) для подсчета FP операций (исходя из базового алгоритма перемножения матриц) и померим время выполнения перемножения для случая алгоритма multiply3 при размере симметричных матриц M=4096. Для того, чтобы получить эффективный код, используем опции оптимизации –O3 (агрессивная оптимизация циклов) и –xavx (использовать инструкции AVX) С-компилятора Intel для того, чтобы сгенерировались векторные SIMD-инструкции для исполнительных устройств AVX. Компилятор нам поможет узнать, векторизовался ли цикл перемножения матрицы. Для этого укажем опцию –vec-report3. В результатах компиляции видим сообщения оптимизатора: «LOOP WAS VECTORIZED» напротив строки с телом внутреннего цикла в файле multiply.c.
На всякий случай проверим, какие инструкции сгенерированы компилятором для цикла перемножения.
$icl –g –O3 –xavx –S
По тэгу __tag_value_multiply3 ищем нужный цикл — инструкции правильные.
$vi muliply3.s
Результат выполнения программы (
7 секунд)
нам дает следующее значение FLOPS = 2*4096*4096*4096/7[s] = 19.6 GFLOPS
Результат, конечно, очень далек от того, что получается в Linpack, что объясняется исключительно квалификционной пропастью между автором статьи и разработчиками библиотеки MKL.
Ну, а теперь дессерт! Собственно то, ради чего я затеял свое исследование этой, вроде бы скучной и давно избитой, темы. Новый метод измерения FLOPS.
Измерение FLOPS программы
Существуют задачи в линейной алгебре, программную имплементацию решения которых очень сложно оценить в количестве FP операций, в том смысле, что нахождение такой оценки само является нетривиальной математической задачей. И тут мы, что называется, приехали. Как считать FLOPS для программы? Есть два пути, оба экспериментальных: трудный, дающий точный результат, и легкий, но обеспечивающий приблизительную оценку. В первом случае нам придется взять некую базовую программную имплементацию решения задачи, скомпилировать ее в ассемблерные инструкции и, выполнив их на симуляторе процессора, посчитать количество FP операций. Звучит так, что резко хочется пойти легким, но недостоверным путем. Тем более, что если ветвление исполнения задачи будет зависеть от входных данных, то вся точность оценки сразу поставится под сомнение.
Идея легкого пути состоит в следующем. Почему бы не спросить сам процессор, сколько он выполнил FP инструкций. Процессорный конвеер, конечно же, об этом не ведает. Зато у нас есть счетчики производительности (PMU – вот тут про них интересно), которые умеют считать, сколько микроопераций было выполнено на том или ином вычислительном блоке. С такими счетчиками умеет работать VTune Amplifier XE.
Несмотря на то, что VTune имеет множество встроенных профилей, специального профиля для измерения FLOPS у него пока нет. Но никто не мешает нам создать наш собственный пользовательский профиль за 30 секунд. Не утруждая вас основами работы с интерфейсом VTune (их можно изучить в прилагающимся к нему Getting Started Tutorial), сразу опишу процесс создания профиля и сбора данных.
Далее мы просто подсчитываем значения FLOPS по формулам. Данные у нас были собраны для всех процессоров, поэтому умножение на их количество здесь не требуется. Операции данными двойной точности выполняются одновременно над четырмя 64-битными DP операндами в 256-битном регистре, поэтому умножаем на коэффициент 4. Данные с одинарной точностью, соответственно, умножаем на 8. В последней формуле не умножаем количество инструкций на коэффициент, так как операции сопроцессора x87 выполняются только со скалярными величинами. Если в программе выполняется несколько разных типов FP операций, то их количество, умноженное на коэффициенты, суммируется для получения результирующего FLOPS.
FLOPS = 4 * SIMD_FP_256.PACKED_DOUBLE / Elapsed Time
FLOPS = 8 * SIMD_FP_256.PACKED_SINGLE / Elapsed Time
FLOPS = (FP_COMP_OPS_EXE.x87) / Elapsed Time
В нашей программе выполнялись только AVX инструкции, поэтому в результатах есть значение только одного счетчика SIMD_FP_256.PACKED_DOUBLE.
Удостоверимся, что данные события собраны для нашего цикла в функции multiply3 (переключившись в Source View):
FLOPS = 4 *34.6Gops/7s = 19.7 GFlops
Значение вполне соответствует оценочному, подсчитанному в предыдущем пункте. Поэтому с достаточной долей точности можно говорить о том, что результаты оценочного метода и измерительного совпадают. Однако, существуют случаи, когда они могут не совпадать. При определенном интересе читателей, я могу заняться их исследованием и рассказать, как использовать более сложные и точные методы. А взамен очень хочется услышать о ваших случаях, когда вам требуется измерение FLOPS в программах.
Заключение
FLOPS – единица измерения производительности вычислительных систем, которая характеризует максимальную вычислительную мощность самой системы для операций с плавающей точкой. FLOPS может быть заявлена как теоретическая, для еще не существующих систем, так и измерена с помощью бенчмарков. Разработчики высокопроизводительных программ, в частности, решателей систем линейных дифференциальных уравнений, оценивают производительность реализации своих алгоритмов в том числе и по значению FLOPS программы, вычисленному с помощью теоретически/эмпирически известного количества FP операций, необходимых для выполнения алгоритма, и измеренному времени выполнения теста. Для случаев, когда сложность алгоритма не позволяет оценить количество FP операций алгоритма, их можно измерить с помощью счетчиков производительности, встроенных в микропроцессоры Intel.