April 20, 2020, 9:12 p.m.
Vladimir Sergeevich

Краткое содержание доклада "GPGPU: что это такое и для чего".

reference to the source

Автор доклада: Александр Титов, конференция: CoreHard Spring 2019.

2:25 - GPGPU - это исполнение программ общего назначение на графическом процессоре (вместо их исполнения на центральном процессоре).

5:00 Есть ряд мифов про GPGPU: (1) может заменить процессор; (2) может выполнять программы в 1000 раз быстрее; (3) сильно отличается от CPU; (4) можно без особых усилий писать высокопроизводительный код.

6:11 Также есть верные утверждения, но нужно обратить внимание на слова, выделенные жирным:

1) GPU потенциально может исполнять некоторые приложения гораздо быстрее чем CPU.

2) GPU есть везде - встроенные графические сопроцессоры в ноутбуках, телефонах и т.д. Почти во всех процессорах встроен GPU, причем он занимает половину или большую часть чипа. Глупо его не использовать.

9:20 Краткое описание эволюции CPU (в картинках):

1) Процессоры были простыми и исполняли одну инструкцию за такт. Однако, во многих алгоритмах есть параллелизм данных (один и тот же алгоритм исполняется над разными данными).
2) Решение — добавили векторные команды. Команда стала длинной, исполняется параллельно на нескольких Execution Unit. Архитектура SIMD. Однако, не все алгоритмы имеют параллелизм данных, но бывает, что следующая инструкция не зависит от текущей — ее можно исполнять параллельно.
3) Решение — добавили еще один АЛУ (Суперскалярная архитектура). Процессоры становятся в 2, 4, .. раз быстрее. Память перестает успевать за процессором.

4) Решение — добавили кэши (смотри этот прекрасный доклад ), но память все равно не успевает.

5) Решение — разрабатывается очень сложное устройство, которое извлекает параллелизм на уровне инструкций очень глубоко, т.е. если суперскалярный процессор проверял на счет возможности параллельного исполнения 2-3 соседних инструкции, то тут проверяется 100 таких инструкций. Затем эта архитектура долго развивалась — менялся планировщик, предсказатель ветвлений, добавлялись уровни кэшей, … В какой-то момент сложность системы стала слишком высокой, а повышать производительность уже не получалось.
6) Решение — добавили многопоточность, при этом потоки разделяли ресурсы процессора. Однако, это может приводить к замедлению работы.

7) Решение — добавили много ядер (не зависимых друг от друга — кроме кэша L3).

18:55 - На графиках показано как менялись: количество транзисторов, производительность и количество ядер. Однако, большинство приложений не обладают высоким параллелизмом и не могут эффективно использовать более 4-8 ядер. Однако, 5-10% приложений могут эффективно распараллеливаться. Хорошим параллелизмом обладают серверные приложения. Вышло так, что приложения предъявили разные требования к железу - одним нужно очень много очень простых ядер (не ищущих параллелизм инструкций), так как задачи и так хорошо параллелятся; другим же нужны большие ядра. Следовательно, нужны новые устройства, но оказалось что они уже есть — это GPU. Тут рушится миф о том, что GPU может заменить CPU — они ориентированы на разные типы задач.

24.00 — Изначально GPU представляли собой специализированные устройства для рендеринга картинок. Особенности этой задачи:

1) одинаковые операции выполняются над множеством элементов (SIMD).

2) неважно как быстро работает один процессор (обработается 1 пиксель) — важно как быстро они работают вместе (обработается вся картинка).

Выше мы рассмотрели SIMD — его проблемой (в CPU) становилась недостаточная скорость памяти. Однако в GPU мы можем поставить очень много потоков (на практике ставится 8-16), если один из них простаивает — быстро переключаемся на другой. Ставится очень большой регистровый файл для быстрого переключения между потоками. Получился один вычислительный узел, состоящий из 8-16 АЛУ. Дальше ставим очень много таких узлов, которые разделяют между собой одну задачу (картинку).

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

32:25 — Сравнение производительность CPU и GPU на очень интересных примерах.

37:40 — Есть несколько хороших способов написать код для GPU: CUDA (только NVidia), OpenCL (открытый стандарт, отстает от CUDA), SYCL (новое виденье OpenCL, более С++ -ориентированный).

Все эти API разделены на host (обычный CPU, занимается подготовкой запуска приложения) и device (исполнитель). Программа делится на device-часть (kernel, пишется на подмножестве С++) и код хоста (пишется на обычном С++).

40:20 — Как программировать kernel. Архитектура SIMD, напишем программу для обработки 1 элемента, применим ее ко всем элементам. Приводится hello world — поэлементное умножение векторов на OpenCL. В реальной жизни все гораздо сложнее, пара проблем:
1) что мы делаем с потоком управления (что если четные и нечетные элементы вектора надо обрабатывать по-разному).
2) реально GPU несколько сложнее, со сложной иерархией кэшей. Все это надо знать чтобы получить нормальный код.

Выводы:

1) с помощью GPU можно получить хорошее ускорение (5-10 раз) и у юзера уже есть эта железка;

2) есть хорошие инструменты для разработчика;

3) под GPU можно программировать (это не сильно сложно).

Comments

Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting Timeweb
June 5, 2020, 11:20 p.m.
Aleksej

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:60points,
  • Rating points-1
June 5, 2020, 11:15 p.m.
Aleksej

C++ - Test 001. The first program and data types

  • Result:53points,
  • Rating points-4
V
June 5, 2020, 4:47 p.m.
Vladzo

C++ - Test 005. Structures and Classes

  • Result:83points,
  • Rating points4
Last comments
June 5, 2020, 10:52 a.m.
progammist

Распознавание изображений на Python с помощью TensorFlow и Keras

Огромное спасибо за метериал, по-больше бы подобных статей (с подробным описанием работы и примерами применения) на тему современных технологий. Вопрос поразмышлять. На текущий момент реал…
June 5, 2020, 1:39 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

По-моему, смысла в этом нет особого. Если делегат будет игнорировать настройки таблицы, то это приведёт ещё к большему непониманию, что вообще происходит, для программиста, который после вас буд…
June 5, 2020, 1:34 a.m.
IscanderChe

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Сижу, размышляю: можно ли переписать делегата так, чтобы независимо от настроек строк выделялись строки?
June 5, 2020, 1:31 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Понятно. Я не обратил внимания на то, что там было в старом коде по настройкам строк :)
Now discuss on the forum
s
June 6, 2020, 1:54 a.m.
shuric

Qt/C++ Определение положения курсора над действие(кнопкой) в QToolBar

Доброго дня. Возник вопрос - как можно определить что курсор находится над определенным действием(кнопкой) в qtoolbar ? mainwindow.cpp MainWindow::MainWi…
s
June 6, 2020, 12:45 a.m.
shuric

Qt/C++ особенности QProxyStyle

Да, Вы правы. Код был скопирован с сайта (уже не помню с какого), но решил пойти по пути более легком. Пришлось переписать - кому интересно: использовал stackedWidget для пе…
June 5, 2020, 11:08 p.m.
Aleksej

Посоветуйте новичку (базы данных и Qt, что учить)

Блин, а я недавно купил Шлее Qt 5.10 :( С детства хотел стать программистом, баловался Паскалем, писал простенькие программки на Delphi, создавал движок на php, изучал C (забросил и перешел на п…
June 5, 2020, 1:09 p.m.
IscanderChe

QPlainTextEdit настройка цвета фона

Вечер добрый. Пытаюсь настроить цвет фона QPlainTextEdit следующим образом: CodeEditor::CodeEditor(QWidget *parent) : QPlainTextEdit(parent){ ... QPalette::ColorRole role = bac…
June 5, 2020, 6:13 a.m.
IscanderChe

Фильтр для QtableView sql

Добрый день. Для такой фильтрации необходимо использовать QSortFilterProxyModel. В оффдоках есть хороший пример.
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB