Как видеокарта разгружает ЦП?

Обновлено: 03.07.2024

Вычисления на графическом процессоре – это использование графического процессора (графического процессора) в качестве сопроцессора для ускорения ЦП в научных и инженерных вычислениях общего назначения.

ГП ускоряет приложения, работающие на ЦП, разгружая часть кода, требующего больших вычислительных ресурсов и занимающего много времени. Остальная часть приложения по-прежнему работает на процессоре. С точки зрения пользователя, приложение работает быстрее, потому что оно использует вычислительную мощность графического процессора с массовым параллелизмом для повышения производительности. Это известно как "гетерогенные" или "гибридные" вычисления.

ЦП состоит из четырех-восьми ядер ЦП, а ГП — из сотен ядер меньшего размера. Вместе они обрабатывают данные в приложении. Эта массивно-параллельная архитектура обеспечивает высокую вычислительную производительность графического процессора. Существует ряд приложений с ускорением на GPU, которые обеспечивают простой доступ к высокопроизводительным вычислениям (HPC).

Сравнение ядер процессора и графического процессора

Разработчики приложений используют производительность параллельной архитектуры графического процессора, используя модель параллельного программирования, изобретенную NVIDIA, которая называется "CUDA". Все графические процессоры NVIDIA — GeForce®, Quadro® и Tesla® — поддерживают модель параллельного программирования NVIDIA® CUDA®.

Графические процессоры Tesla разработаны как ускорители вычислений или сопутствующие процессоры, оптимизированные для научных и технических вычислительных приложений. Последние графические процессоры Tesla 20-й серии основаны на последней реализации платформы CUDA, называемой «архитектурой Fermi». Fermi обладает ключевыми вычислительными функциями, такими как 500+ гигафлопс стандартной аппаратной поддержки операций с плавающей запятой двойной точности по стандарту IEEE, кэши L1 и L2, защита от ошибок памяти ECC, локальные кэши данных, управляемые пользователем, в виде общей памяти, распределенной по всему графическому процессору, объединенной доступ к памяти и многое другое.

Графические чипы начинались как графические конвейеры с фиксированными функциями. С годами эти графические чипы становились все более программируемыми, что привело к тому, что NVIDIA представила первый графический процессор. В период с 1999 по 2000 год ученые-компьютерщики вместе с исследователями в таких областях, как медицинская визуализация и электромагнетизм, начали использовать графические процессоры для ускорения ряда научных приложений. Так возникло движение под названием GPGPU, или вычисления на GPU общего назначения.

Проблема заключалась в том, что GPGPU требовало использования языков графического программирования, таких как OpenGL и Cg, для программирования графического процессора. Разработчики должны были сделать свои научные приложения похожими на графические приложения и сопоставить их с задачами, рисующими треугольники и многоугольники. Это ограничило доступ к огромной производительности графических процессоров для науки.

NVIDIA осознала потенциал предоставления этой производительности более широкому научному сообществу и вложила средства в модификацию графического процессора, чтобы сделать его полностью программируемым для научных приложений. Кроме того, добавлена ​​поддержка языков высокого уровня, таких как C, C++ и Fortran. Это привело к созданию платформы параллельных вычислений CUDA для графического процессора.

ЦП (центральный процессор) работает вместе с ГП (графическим процессором) для увеличения пропускной способности данных и количества одновременных вычислений в приложении. Изначально графические процессоры были предназначены для создания изображений для компьютерной графики и игровых приставок, но с начала 2010 года их также можно использовать для ускорения вычислений с большими объемами данных.

ЦП никогда не может быть полностью заменен графическим процессором: графический процессор дополняет архитектуру ЦП, позволяя выполнять повторяющиеся вычисления в приложении параллельно, в то время как основная программа продолжает выполняться на ЦП. Центральный процессор можно рассматривать как диспетчер задач всей системы, координирующий широкий спектр вычислительных задач общего назначения, а графический процессор выполняет более узкий набор более специализированных задач (обычно математических). Используя мощь параллелизма, GPU может выполнять больше работы за то же время, что и CPU.

Диаграмма показывает разницу между блоком управления/логикой ЦП и GPU

Разница между CPU и GPU

Основное различие между архитектурой ЦП и ГП заключается в том, что ЦП предназначен для быстрого выполнения широкого круга задач (измеряемых по тактовой частоте ЦП), но ограничен в параллельности задач, которые могут выполняться. Графический процессор предназначен для быстрой одновременной обработки изображений и видео высокого разрешения.

Поскольку графические процессоры могут выполнять параллельные операции с несколькими наборами данных, они также часто используются для неграфических задач, таких как машинное обучение и научные вычисления. Разработанные с тысячами процессорных ядер, работающих одновременно, графические процессоры обеспечивают массовый параллелизм, когда каждое ядро ​​сосредоточено на выполнении эффективных вычислений.

ЦП и обработка GPU

Хотя графические процессоры могут обрабатывать данные на несколько порядков быстрее, чем ЦП, благодаря массовому параллелизму, графические процессоры не так универсальны, как ЦП. ЦП имеют большие и широкие наборы инструкций, управляя каждым вводом и выводом компьютера, чего не может сделать графический процессор. В серверной среде может быть от 24 до 48 очень быстрых ядер ЦП. Добавление от 4 до 8 графических процессоров на тот же сервер может обеспечить до 40 000 дополнительных ядер. Хотя отдельные ядра ЦП быстрее (измеряется по тактовой частоте ЦП) и умнее, чем отдельные ядра ГП (измеряется по доступным наборам инструкций), само количество ядер ГП и огромный объем параллелизма, который они предлагают, не ограничиваются одним -Разница в тактовой частоте ядра и ограниченный набор инструкций.

ГП лучше всего подходят для повторяющихся и высокопараллельных вычислительных задач. Помимо рендеринга видео, графические процессоры преуспевают в машинном обучении, финансовом моделировании и моделировании рисков, а также во многих других типах научных вычислений. В то время как в прошлые годы графические процессоры использовались для майнинга криптовалют, таких как Биткойн или Эфириум, графические процессоры, как правило, больше не используются в больших масштабах, уступая место специализированному оборудованию, такому как программируемые сетевые массивы (FPGA), а затем специализированные интегральные схемы (ASIC). .

Примеры вычислений CPU-GPU

Визуализация видео с помощью ЦП и ГП. Видеокарта помогает перекодировать видео из одного графического формата в другой быстрее, чем при использовании ЦП.

Ускорение данных. Графический процессор обладает расширенными вычислительными возможностями, которые ускоряют объем данных, которые ЦП может обработать за заданный промежуток времени. Когда есть специализированные программы, требующие сложных математических вычислений, таких как глубокое обучение или машинное обучение, эти вычисления могут быть разгружены графическим процессором. Это высвобождает время и ресурсы ЦП для более эффективного выполнения других задач.

Майнинг криптовалюты. Получение виртуальных валют, таких как биткойн, включает использование компьютера в качестве ретранслятора для обработки транзакций. В то время как центральный процессор может справиться с этой задачей, графический процессор на видеокарте может помочь компьютеру генерировать валюту намного быстрее.

Поддерживает ли HEAVY.AI CPU и GPU?

Да. Инициатива GPU Open Analytics (GOAI) и ее первый проект, GPU Data Frame (GDF, теперь cudf), стали первым общеотраслевым шагом к открытой экосистеме для сквозных вычислений на GPU. Теперь известный как проект RAPIDS, основная цель которого — обеспечить эффективную связь внутри графического процессора между различными процессами, работающими на графическом процессоре.

По мере распространения cudf в экосистеме обработки данных пользователи смогут беспрепятственно переносить процесс, работающий на графическом процессоре, в другой процесс, не копируя данные в центральный процессор. Благодаря удалению промежуточных сериализаций данных между инструментами обработки данных на GPU время обработки значительно сокращается. Более того, поскольку cudf использует функции межпроцессного взаимодействия (IPC) в API программирования Nvidia CUDA, процессы могут передавать дескриптор данных вместо копирования самих данных, обеспечивая передачу практически без дополнительных затрат. Конечным результатом является то, что GPU становится первоклассным вычислительным гражданином, а процессы могут взаимодействовать так же легко, как и процессы, работающие на CPU.

Здесь вы можете увидеть скриншот небольшой программы на C++ под названием Triangle.exe с вращающимся треугольником на основе OpenGL API.

введите здесь описание изображения

По общему признанию, это очень простой пример, но я думаю, что он применим и к другим операциям с графическими картами.

Мне было просто любопытно, и я хотел узнать весь процесс, начиная с двойного щелчка на файле Triangle.exe в Windows XP и заканчивая тем, что на мониторе появляется вращающийся треугольник. Что происходит, как взаимодействуют CPU (который сначала обрабатывает .exe) и GPU (который в итоге выводит треугольник на экран)?

Я предполагаю, что в отображении этого вращающегося треугольника в первую очередь участвуют следующие аппаратные и программные средства:

  • Жесткий диск
  • Системная память (RAM)
  • ЦП
  • Видеопамять
  • Графический процессор
  • ЖК-дисплей
  • Операционная система
  • API DirectX/OpenGL
  • Драйвер Nvidia

Кто-нибудь может объяснить процесс, может быть, с какой-нибудь блок-схемой для иллюстрации?

Это не должно быть сложное объяснение, охватывающее каждый шаг (думаю, это выходит за рамки), но объяснение, которому может следовать ИТ-специалист среднего уровня.

Я почти уверен, что многие люди, которые даже называют себя ИТ-специалистами, не смогли бы правильно описать этот процесс.

7 ответов 7

Я решил немного написать об аспекте программирования и о том, как компоненты взаимодействуют друг с другом. Возможно, это прольет свет на некоторые области.

Презентация

Что нужно для того, чтобы на экране появилось то единственное изображение, которое вы разместили в своем вопросе?

Есть много способов нарисовать треугольник на экране. Для простоты предположим, что буферы вершин не использовались. (буфер вершин — это область памяти, в которой вы храните координаты.) Предположим, что программа просто сообщает конвейеру обработки графики о каждой отдельной вершине (вершина — это просто координата в пространстве) в строке.

Но прежде чем мы сможем что-либо нарисовать, нам сначала нужно запустить строительные леса. Мы увидим почему позже:

Так что же это сделало?

В этом примере мы будем использовать OpenGL. Теперь ваш интерфейс к драйверу — это то, что дает вам все инструменты, необходимые для того, чтобы заставить вашу программу общаться с видеокартой (или драйвером, который затем общается с на карточку).

Этот интерфейс должен предоставить вам определенные инструменты. Эти инструменты имеют форму API, который вы можете вызывать из своей программы.

Этот API используется в приведенном выше примере. Давайте посмотрим поближе.

Строительные леса

Прежде чем вы действительно сможете рисовать, вам нужно выполнить настройку. Вы должны определить свое окно просмотра (область, которая фактически будет визуализирована), вашу перспективу (камера в ваш мир), какое сглаживание вы будете использовать (чтобы сгладить края вашего треугольника). ).

Но мы не будем на это смотреть. Мы просто взглянем на то, что вам придется делать в каждом кадре. Нравится:

Очистка экрана

Графический конвейер не будет очищать экран для вас каждый кадр. Вы должны будете сказать это. Почему? Вот почему:

введите здесь описание изображения

Если вы не очистите экран, вы будете просто рисовать поверх него в каждом кадре. Вот почему мы вызываем glClear с установленным битом GL_COLOR_BUFFER_BIT. Другой бит ( GL_DEPTH_BUFFER_BIT ) указывает OpenGL очистить буфер depth. Этот буфер используется для определения того, какие пиксели находятся впереди (или позади) других пикселей.

Трансформация

введите здесь описание изображения


Источник изображения

Преобразование — это часть, в которой мы берем все входные координаты (вершины нашего треугольника) и применяем нашу матрицу ModelView. Это матрица, которая объясняет, как наша модель (вершины) поворачивается, масштабируется и перемещается (перемещается).

Далее мы применяем нашу матрицу проекции. Это перемещает все координаты так, чтобы они правильно смотрели на нашу камеру.

Теперь мы снова трансформируем нашу матрицу Viewport. Мы делаем это, чтобы масштабировать нашу модель до размера нашего монитора. Теперь у нас есть набор вершин, готовых к рендерингу!

Мы вернемся к преобразованию чуть позже.

Рисование

Чтобы нарисовать треугольник, мы можем просто указать OpenGL начать новый список треугольников, вызвав glBegin с константой GL_TRIANGLES.
Есть и другие формы, которые вы можете рисовать. Как треугольная полоса или треугольный веер. В первую очередь это оптимизация, так как для отрисовки одинакового количества треугольников требуется меньше связи между ЦП и ГП.

После этого мы можем предоставить список наборов из 3 вершин, которые должны составлять каждый треугольник. Каждый треугольник использует 3 координаты (поскольку мы находимся в 3D-пространстве). Кроме того, я также задаю цвет для каждой вершины, вызывая glColor3f перед вызовом glVertex3f .

Оттенок между тремя вершинами (тремя углами треугольника) вычисляется OpenGL автоматически. Он будет интерполировать цвет по всей поверхности многоугольника.

Взаимодействие

Теперь, когда вы нажимаете на окно. Приложение должно только захватить оконное сообщение, сигнализирующее о щелчке. Затем вы можете выполнить любое действие в своей программе, какое захотите.

Это становится намного сложнее, когда вы хотите начать взаимодействовать со своей 3D-сценой.

Сначала вы должны четко знать, на каком пикселе пользователь щелкнул окно. Затем, принимая во внимание вашу перспективу, вы можете рассчитать направление луча от точки щелчка мыши до вашей сцены. Затем вы можете рассчитать, пересекается ли какой-либо объект в вашей сцене с этим лучом. Теперь вы знаете, щелкнул ли пользователь объект.

Итак, как заставить его вращаться?

Преобразование

Мне известны два типа трансформаций, которые обычно применяются:

  • Матричное преобразование
  • Преобразование на основе костей

Разница в том, что кости влияют на отдельные вершины. Матрицы всегда влияют на все нарисованные вершины одинаково. Давайте рассмотрим пример.

Пример

Ранее мы загружали нашу идентификационную матрицу перед рисованием нашего треугольника. Матрица идентичности просто не обеспечивает никаких преобразований. Итак, все, что я рисую, зависит только от моей точки зрения. Таким образом, треугольник вообще не будет вращаться.

Если я хочу повернуть его сейчас, я могу либо сам посчитать (на процессоре), либо просто вызвать glVertex3f с другими координатами (которые повернуты). Или я мог бы позволить графическому процессору сделать всю работу, вызвав glRotatef перед рисованием:

количество, конечно, просто фиксированное значение. Если вы хотите анимировать, вам придется отслеживать объем и увеличивать его с каждым кадром.

Итак, подождите, что случилось со всеми разговорами о матрицах ранее?

В этом простом примере нам не нужно заботиться о матрицах. Мы просто вызываем glRotatef, и он обо всем позаботится за нас.

glRotate производит поворот на угол в градусах вокруг вектора x y z . Текущая матрица (см. glMatrixMode) умножается на матрицу вращения с произведением, заменяющим текущую матрицу, как если бы glMultMatrix вызывалась со следующей матрицей в качестве аргумента:

x 2 ⁡ 1 - c + cx ⁢ y ⁡ 1 - c - z ⁢ sx ⁢ z ⁡ 1 - c + y ⁢ s 0 y ⁢ x ⁡ 1 - c + z ⁢ sy 2 ⁡ 1 - c + cy ⁢ z ⁡ 1 - c - x ⁢ s 0 x ⁢ z ⁡ 1 - c - y ⁢ sy ⁢ z ⁡ 1 - c + x ⁢ sz 2 ⁡ 1 - c + c 0 0 0 0 1

Ну, спасибо за это!

Заключение

Очевидным становится то, что об OpenGL много говорят. Но это ничего нам не говорит. Где связь?

Единственное, что OpenGL сообщает нам в этом примере, это когда это будет сделано. Каждая операция займет определенное время. Некоторые операции занимают невероятно много времени, другие выполняются невероятно быстро.

Отправка вершины в GPU будет такой быстрой, что я даже не знаю, как это выразить. Отправка тысяч вершин из CPU в GPU в каждом кадре, скорее всего, вообще не проблема.

Очистка экрана может занять миллисекунду или даже больше (имейте в виду, что обычно у вас есть только около 16 миллисекунд времени на отрисовку каждого кадра), в зависимости от размера вашего окна просмотра. Чтобы очистить его, OpenGL должен отрисовать каждый пиксель цветом, который вы хотите очистить, а это могут быть миллионы пикселей.

Кроме этого, мы можем спросить OpenGL только о возможностях нашего графического адаптера (максимальное разрешение, максимальное сглаживание, максимальная глубина цвета и т. д.).

Но мы также можем заполнить текстуру пикселями, каждый из которых имеет определенный цвет. Таким образом, каждый пиксель содержит значение, а текстура представляет собой гигантский «файл», заполненный данными. Мы можем загрузить это в видеокарту (создав буфер текстуры), затем загрузить шейдер, указать этому шейдеру использовать нашу текстуру в качестве входных данных и выполнить чрезвычайно сложные вычисления в нашем «файле».

Затем мы можем "рендерить" результат наших вычислений (в виде новых цветов) в новую текстуру.

Вот как вы можете заставить GPU работать на вас другими способами. Я предполагаю, что CUDA работает аналогично этому аспекту, но у меня никогда не было возможности поработать с ним.

Мы действительно лишь слегка коснулись всей темы. Программирование 3D-графики — адский зверь.

Трудно понять, чего именно вы не понимаете.

Графический процессор имеет ряд регистров, отображаемых BIOS. Они позволяют ЦП получать доступ к памяти графического процессора и дают указание графическому процессору выполнять операции. ЦП вставляет значения в эти регистры, чтобы отобразить часть памяти графического процессора, чтобы ЦП мог получить к ней доступ. Затем он загружает инструкции в эту память. Затем он записывает значение в регистр, который указывает графическому процессору выполнять инструкции, загруженные процессором в его память.

Информация состоит из программного обеспечения, необходимого для работы графического процессора. Это программное обеспечение связано с драйвером, после чего драйвер распределяет обязанности между процессором и графическим процессором (запуская части своего кода на обоих устройствах).

Затем драйвер управляет серией «окон» в памяти графического процессора, из которых ЦП может считывать и записывать данные. Как правило, схема доступа включает в себя запись ЦП инструкций или информации в сопоставленную память графического процессора, а затем указание графическому процессору через регистр выполнить эти инструкции или обработать эту информацию. Информация включает логику шейдеров, текстуры и т. д.

Спасибо за объяснение. По сути, я не понял, как набор инструкций ЦП взаимодействует с набором инструкций графического процессора, но, очевидно, эту часть выполняет драйвер. Именно это я имел в виду под слоями абстракции.

Набор инструкций процессора не задействован. Драйвер и среда выполнения компилируют ваши CUDA, OpenGL, Direct3D и т. д. в собственные программы/ядра графического процессора, которые затем также загружаются в память устройства. Затем буфер команд ссылается на них, как и на любой другой ресурс.

Я не уверен, о каких программах вы говорите (которые работают на графическом процессоре и входят в состав драйверов). Графический процессор в значительной степени является аппаратным обеспечением с фиксированными функциями, и единственные программы, которые он будет запускать, — это шейдеры, которые предоставляются приложением, а не драйвером. Драйвер только компилирует эти программы, а затем загружает их в память графического процессора.

@sidran32: Например, в архитектуре nVidia Kepler ядра, потоки и события создаются программным обеспечением, работающим на графическом процессоре, а не (обычно) на центральном процессоре. Программное обеспечение на стороне графического процессора также управляет RDMA. Все это программное обеспечение загружается в память графического процессора драйвером и работает как «мини-ОС» на графическом процессоре, который обрабатывает сторону графического процессора взаимодействующей пары ЦП/ГП.

@DavidSchwartz Я забыл о вычислительных задачах графического процессора. Тем не менее, во всяком случае, в реализации они по-прежнему ведут себя аналогично шейдерам. Однако я бы не назвал ее «мини-ОС», поскольку она не имеет той же функциональности, которая обычно ассоциируется с ОС. Это по-прежнему очень специализированное программное обеспечение, поскольку графический процессор не похож на центральный процессор (по уважительной причине).

Мне было просто любопытно, и я хотел узнать весь процесс, начиная с двойного щелчка по файлу Triangle.exe в Windows XP и заканчивая тем, что я вижу вращающийся треугольник на мониторе. Что происходит, как взаимодействуют CPU (который сначала обрабатывает .exe) и GPU (который в итоге выводит треугольник на экран)?

Давайте предположим, что вы действительно знаете, как исполняемый файл работает в операционной системе и как этот исполняемый файл отправляется с вашего графического процессора на монитор, но не знаете, что происходит между ними. Итак, давайте взглянем на аппаратный аспект и расширим ответ на вопрос программиста.

Какой интерфейс между CPU и GPU?

С помощью драйвера ЦП может обмениваться данными с графической картой через функции материнской платы, такие как PCI, и отправлять ей команды для выполнения некоторых инструкций графического процессора, доступа/обновления памяти графического процессора, загрузки кода для выполнения на графическом процессоре и т. д. .

Но вы не можете напрямую обращаться к оборудованию или драйверу из кода; поэтому это должно происходить через такие API, как OpenGL, Direct3D, CUDA, HLSL, Cg. В то время как первые выполняют инструкции графического процессора и/или обновляют память графического процессора, вторые фактически будут выполнять код на графическом процессоре, поскольку они являются языками физики/шейдеров.

Зачем запускать код на GPU, а не на CPU?

Хотя центральный процессор хорошо справляется с нашими повседневными программами для рабочих станций и серверов, никто особенно не задумывался о всей этой блестящей графике, которую вы видите в современных играх. В те времена существовали программные рендереры, которые делали трюки с некоторыми 2D и 3D вещами, но они были очень ограниченными. Итак, вот где GPU вступил в игру.

Графический процессор оптимизирован для одного из самых важных вычислений в графике — манипуляций с матрицами. В то время как центральный процессор должен вычислять каждое умножение в матричных манипуляциях одно за другим (позже такие вещи, как 3DNow! и SSE, догнали его), графический процессор может выполнять все эти умножения одновременно! Параллелизм.

Но параллельные вычисления — не единственная причина. Другая причина заключается в том, что графический процессор гораздо ближе к видеопамяти, что делает его намного быстрее, чем обход ЦП и т. д.

Как эти инструкции GPU/память/код отображают графику?

Для того, чтобы все это заработало, не хватает одного элемента: нам нужно что-то, что мы можем записать, а затем прочитать и отправить на экран. Мы можем сделать это, создав фреймбуфер. Какую бы операцию вы ни выполняли, в конечном итоге вы обновите пиксели в буфере кадра; которые помимо местоположения также содержат информацию о цвете и глубине.

Давайте приведем пример, когда вы хотели где-то нарисовать спрайт крови (изображение); во-первых, сама текстура дерева загружается в память графического процессора, что позволяет легко перерисовывать ее по желанию. Затем, чтобы действительно нарисовать спрайт где-то, мы можем транслировать спрайт, используя вершины (помещая его в правильное положение), растрировать его (превращая его из 3D-объекта в пиксели) и обновлять буфер кадра. Чтобы получить лучшее представление, вот блок-схема конвейера OpenGL из Википедии:


Это основной смысл всей графической идеи, дополнительные исследования — это домашнее задание для читателя.

Renana Dar

Автор: Ренана Дар Дата публикации: 2 сентября 2021 г. Расчетное время чтения: 6 минут

Сегодня мы обсудим различия между CPU и GPU. Хотя оба предназначены для выполнения одинаковых задач, приложения для каждого помещают их в разные категории. В то время как ЦП может использоваться для традиционной обработки рабочего стола, мощность графического процессора все больше используется в других областях. Давайте рассмотрим некоторые из этих областей и некоторые ключевые различия между процессором и графическим процессором.

Зачем вообще два разных типа процессоров?

Все в некоторой степени знакомы с процессорами. Известные как «мозг» компьютера, они состоят из миллионов и миллионов крошечных транзисторов с несколькими «ядрами». Это имеет решающее значение для обработки основных функций обработки компьютера. Без него были бы невозможны такие действия, как запуск операционной системы и приложений. Процессор также определяет общую скорость компьютера.

Графические процессоры более специализированы по своей природе. Первоначально разработанные для помощи в 3D-рендеринге, они могут выполнять больше обработки параллельно. Это идеально подходит для использования в приложениях с интенсивным использованием графики, которые полагаются на отображение динамического контента для игр или сжатие/распаковку потокового видео. Графические процессоры также используются во многих других областях, помимо рендеринга и обработки изображений, таких как искусственный интеллект и добыча биткойнов.

Основное различие между ЦП и ГП заключается в том, как они обрабатывают данные им инструкции. Говоря человеческим языком, можно сказать, что ЦП является мастером выполнения одной задачи за раз, тогда как ГП может выполнять несколько задач одновременно. В то время как некоторые работают лучше, выполняя действия в последовательном порядке, другие могут работать в многозадачном режиме.

ЦП получает набор данных для обработки и делает это последовательно. Все обрабатывается по порядку. Графические процессоры могут распределять данные между несколькими процессорами, предназначенными для конкретных задач. Этот метод распределения рабочей нагрузки на параллельные процессы является основной причиной по возможности переносить задачи на GPU.

Чтобы продемонстрировать мощь ЦП и ГП, NVIDIA обратилась за помощью к дуэту фанатиков, которые снялись в популярном сериале «Разрушители мифов». Адам Сэвидж и Джейми Хайнеман взяли очень узнаваемое произведение искусства и воспроизвели его, используя комбинацию робототехники и пейнтбольных шаров. В видеоролике «Разрушители мифов, демо GPU и ЦП» показана красочная игра с использованием как ЦП, так и ГП.

Как и следовало ожидать, первая демонстрация, иллюстрирующая поведение ЦП, показывает медленное, но точное последовательное выполнение выстрелов с краской, создающих знаменитую улыбку объекта. Увеличение скорости показывает, что у него есть возможность быстро стрелять, но это не то же самое, что следующая демонстрация.

Leonardo 2.0 – это машина-шедевр из Разрушителей мифов, которая иллюстрирует поведение графического процессора для выполнения параллельной обработки. При этом они могут воссоздавать гораздо более подробные произведения искусства, в частности, Мону Лизу. С обратным отсчетом и блестящей кнопкой машина создавала искусство почти мгновенно. Хотя может показаться, что все происходит одновременно, замедленный повтор подтверждает, что все происходит организованно.

Симбиотическая взаимосвязь процессора и графического процессора

Симбиоз CPU и GPU

То, что они разные, не означает, что одно лучше другого. Больше похоже на то, что каждый из них имеет конкретное применение в современных технологиях. Вы бы не хотели пытаться визуализировать высокодетализированную 3D-графику без графического процессора, чтобы сделать процесс более эффективным. С другой стороны, вы не будете использовать графический процессор для вычислительной мощности, необходимой для серверов баз данных, веб-браузеров и офисных приложений.

ЦП может выполнять те же вычисления, что и ГП. Однако производители оборудования признали, что разгрузка некоторых наиболее распространенных мультимедийных задач может снизить нагрузку на ЦП и повысить производительность. Такое увеличение производительности возможно только при правильном уровне координации ЦП и ГП.

ГП не предназначен для замены ЦП: ЦП по-прежнему является основным процессором вычислительного оборудования. Это тот, кто принимает решение обрабатывать пакет данных для обработки или передавать их в графический процессор.

Например, центральный процессор может выполнять те же вычисления для приложения, а графический процессор часто используется из-за особенностей его конструкции. Внутри графического процессора есть несколько инструкций, которые можно использовать повторно. Эти инструкции предназначены для параллельного выполнения.

Взаимодействие происходит, когда программист использует различные процедуры программирования, чтобы извлечь выгоду из существования графического процессора. Когда передача данных происходит на «уровне шины», полезная нагрузка и возвращаемые результаты быстро обмениваются. Сегодня необходимость определить, какие задачи обработки лучше передать графическому процессору, лежит на программисте; тем не менее, изучается идея «автоматической» разгрузки на GPU (см. эту статью и эту), но на данный момент это все только на академическом уровне.

Расширенное использование графических процессоров

Способы использования графических процессоров в современных приложениях постоянно расширяются. Это не только для рабочих нагрузок, таких как графический рендеринг для видеоигр. Он используется для развития передовых технологий: искусственный интеллект используется при моделировании приложений ИИ, которые выполняют такие операции, как анализ настроений, финансовое прогнозирование и обработка изображений.

В сфере искусственного интеллекта графические процессоры обеспечивают более масштабируемый подход к глубокому обучению, требующему обработки больших объемов данных, которые можно эффективно обрабатывать с помощью графических процессоров. Именно сложность обработки данных и делает использование графического процессора предпочтительным методом.

Сравнение глубокого обучения с использованием ЦП и ГП см., например, в этом тесте и в этой статье.

NVIDIA — ведущий производитель графического оборудования.Они предоставляют HPC SDK, поэтому разработчики могут использовать преимущества параллельной обработки с использованием одного или нескольких графических или центральных процессоров. Таким образом, разработчики могут использовать набор инструментов CUDA для обеспечения параллельной обработки в приложениях.

Для тех, кто ищет платформу, которая сможет начать пользоваться преимуществами графических процессоров NVIDIA, доступно много информации. Внедрение параллельной обработки становится менее хлопотным, когда у вас есть правильные инструменты. NVIDIA предоставляет CUDA для Windows и Linux. Обе версии бесплатны и просты в установке. Узнайте больше о CUDA и о том, как начать работу с C, C++ и Fortran.

Измени мир там, где это важно

Разговоры о теории ЦП и ГП — это одно; увидеть его в действии - другое. Два примера компаний, которые предприняли непосредственные действия к лучшему, теперь оценили преимущества, которые может предложить C++/CUDA. Эти компании решили сотрудничать с Incredibuild и решать проблемы, которые напрямую повлияли на их способность продвигаться вперед с их CI/CD.

MEDIAPRO повышает производительность с помощью CUDA

Организаторы спортивных мероприятий должны благодарить МЕДИАПРО за создание видео без участия большой команды, которая обычно необходима. Их продукт AutomaticTV, возглавляющий цепочку поставок для AV-групп, обеспечивает профессионально созданное видео с использованием искусственного интеллекта. Что-то такого масштаба требует ресурсов для эффективной компиляции. В противном случае разработчики могут просто сидеть сложа руки, вместо того чтобы работать над следующей задачей.

Текущий рабочий процесс не поддерживает то, что им нужно. От отсутствия умственной концентрации из-за переключения между ветками до зависимостей, которые по-прежнему требуют слишком много времени для эффективного управления. Комбинация была вызовом. Решение было результатом совместных усилий Incredibuild и их партнерства с NVIDIA.

Подробнее о том, как Incredibuild сократил время компиляции на 85 %, установив Incredibuild на компьютеры разработчиков, предназначенные для приложений C++/CUDA.

GeoTeric ® повышает качество и скорость

GeoTeric® кое-что знает об экономии, когда речь идет о времени компиляции. Для их настольного приложения требуются тысячи файлов C++ и миллионы строк кода. Это приложение фокусируется на отображении геологических элементов для 3D-моделирования. Даже при таком высоком уровне технологии, поддерживающей приложение, стало сложно использовать некоторые из современных передовых методологий. Гибкая разработка, включающая автоматическое тестирование, может быть затруднена медленными сборками.

Включение Incredibuild в их рабочий процесс позволило GeoTeric® сократить время компиляции для CUDA с 15 до 3 минут, а общее время сборки сократилось до 11 минут по сравнению с ошеломляющими 2 часами. Как вы можете себе представить, такое увеличение производительности компиляции привело к увеличению скорости, в которой они нуждались.

Узнайте, как они использовали эту возможность, чтобы прекратить ручное тестирование, сократить время сборки и доставки.

ускорить C++

Ренана Дар

Ренана, менеджер по контент-маркетингу Incredibuild, является специалистом по маркетингу, ориентированному на данные, с более чем 12-летним опытом работы в области высоких технологий, маркетинга и коммуникаций. Ренана специализируется на создании контента с нуля.

Читайте также: