что делает gpu ускорение
gpu ускорение андроид стоит ли включать
Одной из многочисленных возможностей, присутствующих на современных Android-устройствах, выступает GPU-ускорение, доступное в специальном системном разделе. По ходу статьи мы расскажем о том, что это за функция и в каких случаях может повлиять на работу смартфона.
Что такое GPU-ускорение на Android
Сама аббревиатура GPU на смартфонах расшифровывается точно так же, как и на других устройствах, включая компьютеры, и означает «Графический процессор». Поэтому при активации ускорения вся нагрузка телефона переходит с ЦПУ на видеокарту, едва ли задействованную в повседневных задачах.
Примечание: Во время работы описываемого режима может значительно повыситься нагрев телефона, но, как правило, без вреда для компонентов.
Главное назначение GPU-ускорения заключается в принудительном переносе рендеринга с процессора устройства на GPU с целью повышения производительности. Как правило, особенно если брать в расчет современные мощные смартфоны или планшеты и весьма требовательные игры, подобная возможность положительно повлияет на скорость обработки информации. Кроме того, на некоторых телефонах можно получить доступ к дополнительным настройкам рендера.
Иногда ситуация может быть полностью противоположной, в связи с чем включение принудительного рендеринга двухмерного рисования может стать причиной невозможности запуска того или иного приложения. Так или иначе, функцию можно включать и отключать без ограничений, что делает большинство проблем легко разрешимыми. К тому же, как можно понять по вышесказанному, большинство приложений все же отлично работают при включенном GPU-ускорении, позволяя использовать ресурсы устройства на максимум.
Включение и отключение
GPU-ускорение можно контролировать в определенном разделе с настройками. Однако для доступа к данной странице потребуется выполнить ряд действий. Более подробно процедура была нами разобрана в отдельной статье на сайте по следующей ссылке.
После перехода к странице «Для разработчиков» в системном приложении «Настройки» воспользуйтесь свайпом вверх и найдите пункт «GPU-ускорение» в блоке «Аппаратное ускорение визуализации». В некоторых случаях функция может иметь другое название, например, «Рендеринг принудительно», но практически всегда остается неизменным описание. Ориентируйтесь именно по нему, обратив внимание на представленный ниже скриншот.
Эта процедура не станет проблемой, так как все действия легко обратимы. Таким образом, чтобы отключить принудительный рендеринг, деактивируйте пункт, указанный выше. Кроме того, данная тема напрямую связана с ускорением Android-устройства, детально рассмотренным нами также в отдельной инструкции.
Как видно из представленной в статье информации, GPU-ускорение на Andro >
Отблагодарите автора, поделитесь статьей в социальных сетях.
А мы продолжаем рассматривать различные пункты меню, которые встречаются в смартфонах на базе Andro >
Включение данного пункта меню позволяет всегда использовать GPU для двухмерного рисования (еще этот пункт может называться «Рендеринг принудительно»), то есть принудительно переносит обработку графики с процессора на GPU. Если говорить в целом, включение данного пункта позволяет улучшить скорость работы некоторых приложений, в том числе игр. Увы, касается это не всех случаев, поэтому может получиться и наоборот — скорость работы приложения замедлится.
Найти этот пункт можно в разделе «Для разработчиков». Откройте настройки.
Выберите раздел «Для разработчиков» или «Режим разработчика». Если у вас его нет, включите с помощью этой инструкции.
Здесь вы можете увидеть строку «GPU-ускорение» в подразделе «Аппаратное ускорение визуализации».
Включите при необходимости. Или отключите.
Другие записи:
2 комментария
Сайт очень классный, случайно на вас набрёл, и теперь не сожалею об этом. Сам я уже как 2-ой год хожу с Android(ом), но до сих пор не мог знать элементарных вещей, таких, как GPU-ускорение и т.д. то есть я пользовался ими, но так и не знал, что они означают (да, так бывает)). Ну да не суть.
От себя мне хотелось бы пожелать вам развивать свой сайт, ну и ещё хотелось бы, что бы вы выкладывали также решение некоторых проблем с Play market.
но он нагружает батарею и телефон будет работать на 10-15% меньше(((
Обновите прошивку смартфона
Пользователи не всегда обновляют операционную систему своего телефона. А ведь зачастую там исправляются различные ошибки и проблемы, о которых вы могли даже не подозревать. Настоятельно рекомендуем всегда проверять прошивку своего телефона и регулярно обновляться до актуальной версии. Это обеспечит оптимальную работу вашего смартфона. Проверить версию ОС можно в пункте Настройки — > О телефоне.
Чтобы узнать, нет ли новых версий, достаточно в этом же разделе зайти в подменю Обновление ПО.
Сбросьте устройство на заводские настройки
Если устройство обновлено до последней версии операционной системы, но всё ещё тормозит, стоит сбросить его на заводские настройки. Конечно, это временная мера, и со временем, когда вы снова установите в него приложения, скачаете фильмы, музыку, фотографии, смартфон снова может начать тормозить. Но этот способ поможет однозначно определить, из-за чего ваш телефон медленно работал. Если после сброса устройства его быстродействие будет высоким, то вам стоит задуматься, а не перегрузили ли вы смартфон приложениями и другими данными.
Зайдите в Настройки — > Резервное копирование и сброс, и выберите там Общий сброс. Помните, что у вас удалятся все настройки, данные системы и приложений, загруженные программы, а также контакты, сохранённые смс и письма. Если вы не хотите терять какие-то данные, то сначала сделайте резервные копии.
Удалите ненужные приложения
В данном пункте даже добавить что-то сложно. Просто взгляните на свой список приложений. Уверены, что всеми вы пользуетесь достаточно часто, чтобы забивать ими память смартфона? Наверняка в вашем телефоне есть программы, которые вы поставили просто, чтобы посмотреть, а потом даже ни разу не запускали. Или скачали несколько однотипных приложений, затем выбрали одно для постоянного использования, а остальные так и валяются без дела.
Как ускорить смартфон на Android
К счастью, есть множество способов исправить ситуацию. Итак, наш первый совет: перезагрузите смартфон. Да, просто выключите его и снова включите.
Как ни странно, это часто помогает, и тому есть причина. Большинство пользователей очень редко выключают смартфон. Со временем его память заполняется остаточными данными приложений, которые вы закрыли. Телефон постепенно начинает захлебываться временными файлами. Представьте, что у вас куча дел, которые вы должны постоянно держать в голове. Вы просто не сможете ни на чем сосредоточиться. Перезагрузка освобождает память телефона, после нее он должен работать, как новый.
Если перезагрузка не сработает и устройство продолжит тормозить, попробуйте другие способы. В этой статье мы расскажем, почему со временем смартфон на Android начинает работать медленнее и как его можно ускорить.
Почему мой Android так тормозит?
Со временем смартфон на Android начинает работать медленнее по нескольким причинам.
Да, когда-то ваш телефон был новинкой, но в какой-то момент вам становится некомфортно им пользоваться. Вряд ли вы сейчас захотите пользоваться компьютером с DOS и монохромным монитором, а ведь в 80-е годы это были инновационные технологии. Если вы все же не хотите менять смартфон, рекомендации в этой статье помогут вам. Возможно, у вас получится ускорить ваше устройство и комфортно пользоваться им еще пару лет. Итак, рассказываем, как ускорить смартфон на Android.
Очистите главный экран
Откройте главный экран смартфона. Если там сразу можно посмотреть новости, погоду, ленту соцсетей, электронную почту и события в календаре, то стоит что-то удалить. Когда при пробуждении или переходе на главный экран устройству каждый раз приходится загружать множество виджетов, оно может работать медленнее. Убрав несколько виджетов, вы освободите ресурсы смартфона для других задач.
Чтобы удалить виджет:
Если вы пытаетесь ускорить планшет на Android, лучше начать именно с этого. Большинство пользователей обычно не загромождают главный экран смартфона, но на планшетах используют виджеты по максимуму – а ведь они съедают довольно много памяти.
Удалите лишние приложения
Иногда мы устанавливаем на смартфон новые приложения, которыми потом совсем не пользуемся, и со временем их становится больше. Они занимают место и, возможно, используют какие-то фоновые процессы, даже если вы не запускаете их. Удалите ненужные приложения и смартфон заработает быстрее.
Откройте настройки (значок шестеренки) и перейдите в раздел приложений. Вы увидите список всех приложений, установленных на вашем смартфоне (если они отображаются на вкладках, перейдите на вкладку «Все»). Чтобы удалить приложение:
На некоторых устройствах уже установлено несколько приложений от производителя. Часто они не особенно полезны, но при этом загружают память и занимают место в хранилище. Некоторые производители не позволяют удалять свои приложения с устройства, но зато их можно отключать. Файлы программы при этом остаются на устройстве, но она перестает работать и не будет загружать память.
Если вы используете ресурсоемкие приложения (например, Facebook или YouTube), возможно, стоит перейти на их облегченные версии. Такие версии есть у многих приложений: они созданы специально для малопроизводительных устройств, которые используют подключения с низкой скоростью, вроде 2G. Облегченные версии некоторых приложений доступны только в развивающихся странах, но многие можно скачать без ограничений.
Facebook потребляет много ресурсов? Попробуйте использовать Facebook Lite и Messenger Lite. У Twitter, Uber и YouTube тоже есть облегченные версии, хотя они могут быть доступны не во всех регионах. Также советуем пользоваться версиями приложений, которые оптимизированы для Android Go, облегченной версии ОС Android.
Кстати, раз уж речь зашла об облегченных версиях: заодно можно ускорить и Chrome. У этого браузера нет отдельного приложения, но есть упрощенный режим, который можно включить в настройках. В этом режиме серверы Google сжимают страницы, которые вы открываете, и они загружаются быстрее (так, количество обрабатываемых данных может снизиться на 60%). Качество изображений при этом может незначительно пострадать, но если для вас это некритично, ускорение загрузки вам точно не помешает.
Очистите хранилище данных
Следующий шаг для ускорения работы смартфона Android — чистка хранилища данных. Если на вашем телефоне слишком много файлов, операционная система может тормозить. Освободив место, вы ускорите устройство.
В этом поможет Google Files. Установите это приложение на смартфон: оно отыщет ненужные файлы, которые прячутся в укромных уголках, и избавится от дублей. Google Files можно настроить для себя, и им будет пользоваться еще удобнее. Если у вас всего 16 ГБ, это приложение вам очень пригодится. В первую очередь ищите ненужные и большие файлы – их можно спокойно удалить.
Также советуем переместить фотографии и другие личные файлы из внутренней памяти в облако – так вы сможете очистить галерею. Можно настроить автоматическое копирование изображений на Google Drive.
Очистите кеш. Это место для временных файлов, где приложения хранят часто используемые данные. Кеш помогает приложениям работать быстрее. Но часто они не удаляют из кеша старые данные, а только добавляют новые. Данные хранятся в виде небольших файлов, но со временем они накапливаются и занимают немало места. Чтобы очистить кеш:
Заодно можно отключить автоматическую синхронизацию для приложений, которыми вы редко пользуетесь, – это также поможет немного ускорить смартфон.
Параметры разработчика
Перейдем к более сложным шагам. Теперь нужно будет зайти в параметры разработчика. Для этого нужно активировать на устройстве соответствующий режим:
Должно появиться сообщение об активации режима разработчика. После этого в настройках появятся дополнительные опции. Перейдите в раздел «Параметры разработчика» (он может называться «Для разработчика») – там есть три параметра, которые помогут ускорить ваш смартфон.
Лимит фоновых процессов
Выберите этот параметр и установите значение «Без фоновых процессов» – смартфон будет работать гораздо быстрее. При этой настройке приложения не загружаются в фоновом режиме, если только вы активно не используете их, – ресурсы устройства не будут тратиться впустую.
Анимация окон
При отключенной анимации окон приложения запускаются быстрее и используется меньше памяти. Отключите анимацию окон в этом разделе.
GPU-ускорение
При включении этой настройки вместо программного рендеринга будет использоваться видеопроцессор устройства. Это позволит значительно ускорить рендеринг элементов интерфейса и использовать для этого меньше памяти.
Имейте в виду, что эта опция может сократить время работы от батареи примерно на 10% (аппаратное ускорение потребляет больше энергии, чем программное).
Стоит ли обновлять Android, чтобы повысить скорость работы?
Многие пользователи, желающие ускорить свои устройства, полагают, что обновление Android до последней версии точно в этом поможет. Однако это не всегда так.
В некоторых случаях обновление прошивки (сейчас самая свежая версия ОС – Android 10) действительно может значительно ускорить устройство благодаря тому, что в новой системе будет проходить множество оптимизаций.
Но если ваш смартфон старый и на нем мало памяти, то после обновления он может работать даже медленнее. Ему просто не будет хватать памяти или объема хранилища для эффективной работы новой версии ОС.
Вы можете откатить обновление и вернуться обратно к старой версии, но сделать это зачастую не так-то просто. Если вашему телефону уже больше трех лет и он работает на старой ОС, например на Android 4, то лучше ничего не трогать и оставить как есть.
Остерегайтесь зловредов
Часто планшеты и смартфоны Android работают медленно из-за вредоносных программ. Возможно, вы установили какое-то приложение со зловредом внутри (именно поэтому нужно загружать приложения только из официального магазина) или перешли по вредоносной ссылке в электронном письме. Также на активность вредоносных программ могут указывать частые сбои в работе, необъяснимые скачки использования данных, быстрый разряд батареи или перегрев устройства.
Если вы проделали рекомендованные нами действия, скорее всего, вы уже избавились от большей части вредоносных программ. Но важно защитить ваше устройство от будущих заражения. В этом вам поможет Антивирус на Андроид. Вы можете загрузить его из Google Play. Это приложение надежно защитит смартфон и планшет от любых заражений и атак.
Вычисления на GPU – зачем, когда и как. Плюс немного тестов
Всем давно известно, что на видеокартах можно не только в игрушки играть, но и выполнять вещи, никак не связанные с играми, например, нейронную сеть обучить, криптовалюту помайнить или же научные расчеты выполнить. Как так получилось, можно прочитать тут, а я хотел затронуть тему того, почему GPU может быть вообще интересен рядовому программисту (не связанному с GameDev), как подступиться к разработке на GPU, не тратя на это много времени, принять решение, нужно ли вообще в эту сторону смотреть, и «прикинуть на пальцах», какой профит можно получить.
Статья написана по мотивам моего выступления на HighLoad++. В ней рассматриваются в основном технологии, предлагаемые компанией NVIDIA. У меня нет цели рекламировать какие-либо продукты, я лишь привожу их в качестве примера, и наверняка что-то похожее можно найти у конкурирующих производителей.
Зачем что-то считать на GPU?
Два процессора можно сравнить по разным критериям, наверное, самые популярные — это частота и количество ядер, размер кэшей и прочее, но в конечном счете, нас интересует, сколько операций процессор может выполнить за единицу времени, что это за операции вопрос отдельный, но наиболее распространенной метрикой является количество операций с плавающей запятой в секунду — flops. И когда мы хотим сравнить теплое с мягким, а в нашем случае GPU с CPU, эта метрика приходится как нельзя кстати.
Ниже на графике изображены рост этих самых флопсов с течением времени для процессоров и для видеокарт.
(Данные собраны из открытых источников, нет данных за 2019-20 годы, т.к. там не все так красиво, но GPU все-таки выигрывают)
Что ж, заманчиво, не правда ли? Перекладываем все вычисления с CPU на GPU и получаем в восемь раз лучшую производительность!
Но, конечно же, не все так просто. Нельзя просто так взять и переложить все на GPU, о том почему, мы поговорим дальше.
Архитектура GPU и ее сравнение с CPU
Привожу многим знакомую картинку с архитектурой CPU и основными элементами:
Что здесь особенного? Одно ядро и куча вспомогательных блоков.
А теперь давайте посмотрим на архитектуру GPU:
У видеокарты множество вычислительных ядер, обычно несколько тысяч, но они объединены в блоки, для видеокарт NVIDIA обычно по 32, и имеют общие элементы, в т.ч. и регистры. Архитектура ядра GPU и логических элементов существенно проще, чем на CPU, а именно, нет префетчеров, бранч-предикторов и много чего еще.
Что же, это ключевые моменты отличия в архитектуре CPU и GPU, и, собственно, они и накладывают ограничения или, наоборот, открывают возможности к тому, что мы можем эффективно считать на GPU.
Я не упомянул еще один важный момент, обычно, видеокарта и процессор не «шарят» память между собой и записать данные на видеокарту и считать результат обратно — это отдельные операции и могут оказаться «бутылочным горлышком» в вашей системе, график зависимости времени перекачки от размера данных приведен далее в статье.
Ограничения и возможности при работе с GPU
Какие ограничения накладывает такая архитектура на выполняемые алгоритмы:
Приведение классических алгоритмов к SIMD-представлению
Трансформация
У нас есть два массива, A и B, и мы хотим к каждому элементу массива A добавить элемент из массива B. Ниже приведен пример на C, хотя, надеюсь, он будет понятен и тем, кто не владеет этим языком:
Классический обход элементов в цикле и линейное время выполнения.
А теперь посмотрим, как такой код будет выглядеть для GPU:
А вот здесь уже интересно, появилась переменная threadIdx, которую мы вроде бы нигде не объявляли. Да, нам предоставляет ее система. Представьте, что в предыдущем примере массив состоит из трех элементов, и вы хотите его запустить в трех параллельных потоках. Для этого вам бы понадобилось добавить еще один параметр – индекс или номер потока. Вот это и делает за нас видеокарта, правда она передает индекс как статическую переменную и может работать сразу с несколькими измерениями – x, y, z.
Еще один нюанс, если вы собираетесь запускать сразу большое количество параллельных потоков, то потоки придется разбить на блоки (архитектурная особенность видеокарт). Максимальный размер блока зависит от видеокарты, а индекс элемента, для которого выполняем вычисления, нужно будет получать так:
В итоге что мы имеем: множество параллельно работающих потоков, выполняющих один и тот же код, но с разными индексами, а соответственно, и данными, т.е. тот самый SIMD.
Это простейший пример, но, если вы хотите работать с GPU, вашу задачу нужно привести к такому же виду. К сожалению, это не всегда возможно и в некоторых случаях может стать темой докторской диссертации, но тем не менее классические алгоритмы все же можно привести к такому виду.
Агрегация
Давайте теперь посмотрим, как будет выглядеть агрегация, приведенная к SIMD представлению:
У нас есть массив из n элементов. На первом этапе мы запускаем n/2 потоков и каждый поток складывает по два элемента, т.е. за одну итерацию мы складываем между собой половину элементов в массиве. А дальше в цикле повторяем все тоже самое для вновь получившегося массива, пока не сагрегируем два последних элемента. Как видите, чем меньше размер массива, тем меньше параллельных потоков мы можем запустить, т.е. на GPU имеет смысл агрегировать массивы достаточно большого размера. Такой алгоритм можно применять для вычисления суммы элементов (кстати, не забывайте о возможном переполнении типа данных, с которым вы работаете), поиска максимума, минимума или просто поиска.
Сортировка
А вот с сортировкой уже все выглядит намного сложнее.
Два наиболее популярных алгоритма сортировки на GPU это:
Но идея в том, что даже такой нелинейный алгоритм, как сортировка, можно привести к SIMD-виду.
А теперь, прежде чем посмотреть на реальные цифры, которые можно получить от GPU, давайте разберемся, как же все-таки программировать под это чудо техники?
C чего начать
Наиболее распространены две технологии, которые можно использовать для программирования под GPU:
Использовать OpenCL можно из C/C++, есть биндинги к другим языкам.
По OpenCL мне больше всего понравилась книга «OpenCL in Action». В ней же описаны разные алгоритмы на GPU, в т.ч. Bitonic-sort и Radix-sort.
CUDA – это проприетарная технология и SDK от компании NVIDIA. Писать можно на C/C++ или использовать биндинги к другим языкам.
Сравнивать OpenCL и CUDA несколько не корректно, т.к. одно — стандарт, второе — целое SDK. Тем не менее многие выбирают CUDA для разработки под видеокарты несмотря на то, что технология проприетарная, хоть и бесплатная и работает только на картах NVIDIA. Тому есть несколько причин:
Наиболее полноценной книгой по CUDA, на которую я наткнулся, была «Professional CUDA C Programming», хоть уже и немного устарела, тем не менее в ней рассматривается много технических нюансов программирования для карт NVIDIA.
А что, если я не хочу тратить пару месяцев на чтение этих книг, написание собственной программы для видеокарты тестирование и отладку, а потом выяснить, что это все не для меня?
Как я уже сказал, есть большое количество библиотек, которые скрывают сложности разработки под GPU: XGBoost, cuBLAS, TensorFlow, PyTorch и другие, мы рассмотрим библиотеку thrust, так как она менее специализирована, чем другие вышеприведенные библиотеки, но при этом в ней реализованы базовые алгоритмы, например, сортировка, поиск, агрегация, и с большой вероятностью она может быть применима в ваших задачах.
Thrust – это С++ библиотека, которая ставит своей целью «подменить» стандартные STL алгоритмы на алгоритмы выполняемые на GPU. Например, сортировка массива чисел с помощью этой библиотеки на видеокарте будет выглядеть так:
(не забываем, что пример нужно компилировать компилятором от NVIDIA)
Как видите, thrust::sort очень похож на аналогичный алгоритм из STL. Эта библиотека скрывает много сложностей, в особенности разработку подпрограммы (точнее ядра), которая будет выполняться на видеокарте, но при этом лишает гибкости. Например, если мы хотим отсортировать несколько гигабайт данных, логично было бы отправить кусок данных на карту запустить сортировку, и пока выполняется сортировка, дослать еще данные на карту. Такой подход называется latency hiding и позволяет более эффективно использовать ресурсы серверной карты, но, к сожалению, когда мы используем высокоуровневые библиотеки, такие возможности остаются скрытыми. Но для прототипирования и замера производительности как раз таки подходят, в особенности с thrust можно замерить, какой оверхед дает пересылка данных.
Я написал небольшой бенчмарк с использованием этой библиотеки, который выполняет несколько популярных алгоритмов с разным объемом данных на GPU, давайте посмотрим, какие результаты получились.
Результаты выполнения алгоритмов на GPU
Для тестирования GPU я взял инстанс в AWS с видеокартой Tesla k80, это далеко не самая мощная серверная карта на сегодняшний день (самая мощная Tesla v100), но наиболее доступная и имеет на борту:
Трансформация
Время выполнения трансформации на GPU и CPU в мс
Как видите, обычная трансформация элементов массива выполняется по времени примерно одинаково, как на GPU, так и на CPU. А все почему? Потому что оверхед на пересылку данных на карту и обратно съедает весь performance boost (про оверхед мы поговорим отдельно), да и вычислений на карте выполняется относительно немного. К тому же не стоит забывать, что процессоры также поддерживают SIMD инструкции, и компиляторы в простых случаях могут эффективно их задействовать.
Давайте теперь посмотрим, насколько эффективно выполняется агрегация на GPU.
Агрегация
Время выполнения агрегации на GPU и CPU в мс
В примере с агрегацией мы уже видим существенный прирост производительности с увеличением объема данных. Стоит также обратить внимание на то, что в память карты мы перекачиваем большой объем данных, а назад забираем только одно агрегированное значение, т.е. оверхед на пересылку данных из карты в RAM минимален.
Перейдем к самому интересному примеру – сортировке.
Сортировка
Время выполнения сортировки на GPU и CPU в мс
Несмотря на то, что мы пересылаем на видеокарту и обратно весь массив данных, сортировка на GPU 800 MB данных выполняется примерно в 25 раз быстрее, чем на процессоре.
Оверхед на пересылку данных
Как видно из примера с трансформацией, не всегда очевидно, будет ли GPU эффективен даже в тех задачах, которые хорошо параллелятся. Причиной тому — оверхед на пересылку данных из оперативной памяти компьютера в память видеокарты (в игровых консолях, кстати, память расшарена между CPU и GPU, и нет необходимости пересылать данные). Одна из характеристик видеокарты это — memory bandwidth или пропускная способность памяти, которая определяет теоретическую пропускную способность карты. Для Tesla k80 это 480 GB/s, для Tesla v100 это уже 900 GB/s. Также на пропускную способность будет влиять версия PCI Express и имплементация того, как вы будете передавать данные на карту, например, это можно делать в несколько параллельных потоков.
Давайте посмотрим на практические результаты, которые удалось получить для видеокарты Tesla k80 в облаке Amazon:
Время пересылки данных на GPU, сортировки и пересылки данных обратно в RAM в мс
HtoD – передаем данные на видеокарту
GPU Execution – сортировка на видеокарте
DtoH – копирование данных из видеокарты в оперативную память
Первое, что можно отметить – считывать данные из видеокарты получается быстрее, чем записывать их туда.
Второе – при работе с видеокартой можно получить latency от 350 микросекунд, а этого уже может хватить для некоторых low latency приложений.
Ниже на графике приведен оверхед для большего объема данных:
Время пересылки данных на GPU, сортировки и пересылки данных обратно в RAM в мс
Серверное использование
Наиболее частый вопрос — чем отличается игровая видеокарта от серверной? По характеристикам они очень похожи, а цены отличаются в разы.
Основные отличия серверной (NVIDIA) и игровой карты:
Многопоточность
После того как мы разобрались, как запустить простейший алгоритм на видеокарте и каких результатов можно ожидать, следующий логичный вопрос, а как будет себя вести видеокарта при обработке нескольких параллельных запросов. В качестве ответа у меня есть два графика выполнения вычислений на GPU и процессоре с 4-мя и 32-мя ядрами:
Время выполнения математических расчетов на GPU и CPU c матрицами размером 1000 x 60 в мс
На этом графике выполняются расчеты с матрицами размером 1000 x 60 элементов. Запускаются вычисления из нескольких программных потоков, для GPU дополнительно создается отдельный stream для каждого CPU-потока (используется тот самый Hyper-Q).
Как видно, процессор справляется с такой нагрузкой очень хорошо, при этом latency для одного запроса на GPU существенно растет с увеличением числа параллельных запросов.
Время выполнения математических расчетов на GPU и CPU c матрицами 10 000 x 60 в мс
На втором графике те же самые вычисления, но с матрицами в 10 раз больше, и GPU под такой нагрузкой ведет себя существенно лучше. Эти графики очень показательны, и можно сделать вывод: поведение под нагрузкой зависит от характера самой нагрузки. Процессор может также довольно эффективно справляться с матричными вычислениями, но до определенных пределов. Для видеокарты характерно то, что для небольшой вычислительной нагрузки производительность падает примерно линейно. С увеличением нагрузки и количества параллельных потоков видеокарта справляется уже лучше.
Сложно строить гипотезы, как будет себя вести GPU в различных ситуациях, но, как видите, при определенных условиях серверная карта может достаточно эффективно обрабатывать запросы из нескольких параллельных потоков.
Обсудим еще несколько вопросов, которые могут возникнуть у вас, если вы все-таки решили использовать GPU в своих проектах.
Ограничение ресурсов
Как мы уже говорили, два основных ресурса видеокарты – это вычислительные ядра и память.
К примеру, у нас несколько процессов или контейнеров, использующих видеокарту, и хотелось бы иметь возможность поделить видеокарту между ними. К сожалению, простого API для этого нет. NVIDIA предлагает технологию vGPU, но карту Tesla k80 я не нашел в списке поддерживаемых, и насколько мне удалось понять из описания, технология больше заточена на виртуальные дисплеи, чем на вычисления. Возможно, AMD предлагает что-то более подходящее.
Поэтому, если планируете использовать GPU в своих проектах, стоит рассчитывать на то, что приложение будет использовать видеокарту монопольно, либо вы будете программно контролировать объем выделяемой памяти и количество ядер, используемых для вычислений.
Контейнеры и GPU
Если с ограничением ресурсов вы разобрались, то следующий логичный вопрос: а если в сервере несколько видеокарт?
Опять же, можно на уровне приложения решать, какой GPU оно будет использовать.
Другой более удобный способ – это Docker-контейнеры. Можно использовать и обычные контейнеры, но NVIDIA предлагает свои контейнеры NGC, с оптимизированными версиями различного софта, библиотек и драйверов. Для одного контейнера можно ограничить количество используемых GPU и их видимость для контейнера. Оверхед на использования контейнера около 3%.
Работа в кластере
Другой вопрос, что делать, если вы хотите выполнять одну задачу на нескольких GPU в рамках одного сервера или кластера?
Если вы выбрали библиотеку на подобии thrust или более низкоуровневое решение, то задачу придется решать вручную. Высокоуровневые фреймворки, например, для машинного обучения или нейронных сетей, обычно поддерживают возможность использования нескольких карт из коробки.
Дополнительно хотелось бы отметить то, что, например, NVIDIA предлагает интерфейс прямого обмена данными между картами – NVLINK, который существенно быстрее чем PCI Express. И есть технология прямого доступа к памяти карты из других PCI Express устройств – GPUDirect RDMA, в т.ч. и сетевых.
Рекомендации
Если вы размышляете об использовании GPU в своих проектах, то GPU, скорее всего, вам подойдет если: