Многоядерность – следующий «Закон Мура» Эра микропроцессоров Эра многоядерных / гетерогенных систем

advertisement
Многоядерность – следующий «Закон Мура»
Эра микропроцессоров
Эра многоядерных / гетерогенных систем
1 зеттафлопс
1 эксафлопс
1 петафлопс
1 терафлопс
1 гигафлопс
100 мегафлопс
1993
2007
2040
Многоядерность крупнейших ЦОД
109
Количество вычислительных ядер
170 миллионов ядер
108
107
106
105
104
103
102
1996
2000
2004
2008
2012
2016
2020
Многопоточность крупнейших ЦОД
1010
Суммарная многопоточность
Миллиарды параллельных потоков
109
108
107
Миллионы параллельных потоков
106
105
104
Тысячи параллельных потоков
103
1996
2000
2004
2008
2012
2016
2020
1 эксафлопс
• 4 FPU (6 гигафлопс на частоте 1,5 ГГц)
• 1 чип = 742 ядра (4,5 терафлопс)
• 213 Мб кэш L1; 93 Мб кэш L2
• 1 узел = 1 выч. чип + 16 DRAM (16 Гб)
• 1 группа = 12 узлов (54 терафлопс)
• 1 стойка = 32 группы (1,7 петафлопс)
• 384 узла в стойке
• 3,6 Пб дискового пространства
• 1 System = 583 стойки (1 эксафлопс)
• 166 млн. ядер
• 680 млн. FPU
• 3,6 Пб = 0,0036 байт/флопс
• 68 МВт
Грубо
Грид-вычисления
MPI/OpenMPI
OpenMP/pthreads
Детально
Крупность разбиения
Разбиение параллельной задачи
SIMD
Традиционная классификация
вычислительных систем (М. Флинн)
• SISD (Single Instruction Single Data) –
единственный поток команд и единственный
поток данных.
• SIMD (Single Instruction Multiple Data) –
единственный поток команд и множественный
поток данных.
• MISD (Multiple Instruction Single Date) –
множественный поток команд и единственный
поток данных.
• MIMD (Multiple Instruction Multiple Date) –
множественный поток команд и множественный
поток данных.
CUDA
Архитектура параллельных
вычислений на графических
процессорах nVidia
Модель программирования CUDA
• Десятки и сотни вычислительных ядер
– Сотни и тысячи параллельных потоков
• Использование стандартных языков
программирования
– Фокусирование на параллельных алгоритмах
• Возможность одновременного использования
CPU и GPU
– Использование разной оперативной памяти
(DRAM) – работа в гетерогенной среде (CPU + GPU)
Основные термины CUDA
• Устройство (Device) – Графический
процессор (GPU)
• Хост (Host) – Центральный процессор (CPU)
• Ядро (Kernel) – подпрограмма (функция
языка программирования), выполняемая
на устройстве
Ядра и потоки CUDA
• Параллельные части кода программы
(kernels) выполняются на устройстве
(device) – остальной код выполняется на
хосте (host)
– В любой момент времени на устройстве может
выполняться только одно ядро
– Каждое ядро запускает множество потоков
Различия потоков CUDA и CPU
• Потоки CUDA очень лёгкие (несколько
строк программного кода)
– Быстрое время создания
– Мгновенное переключение
• Потоков CUDA очень много (сотни и тысячи)
– Число потоков многоядерных CPU ограничено
Массивы параллельных потоков
• Ядро CUDA запускает массив потоков
– Все потоки выполняют один и тот же код
– Каждый поток имеет свой уникальный
идентификатор (ID), который используется для
вычисления соответствующего адреса памяти и
контроля за ходом выполнения ядра
(управления потоками)
Массивы параллельных потоков
0
1
2
3
4
5
6
7
…
float x = input[threadID];
float y = function(x);
output[threadID] = y;
…
Взаимодействие потоков
• Алгоритм может потребовать организации
взаимодействия между потоками
• Взаимодействие потоков увеличивает
производительность
– Обмен промежуточными результатами
исключает лишние (повторные) вычисления
– Использование общих данных уменьшает
объём выделяемой памяти
Взаимодействие потоков
• Взаимодействие потоков – мощный
инструмент разработчика
• Взаимодействие между всеми потоками в
массиве плохо масштабируется
– Взаимодействие между потоками в небольших
группах хорошо масштабируется
Группировка потоков
• Ядро CUDA запускает сетку (grid) из блоков
потоков (thread blocks)
– Потоки внутри блока общаются через
разделяемую память
– Потоки внутри блока могут
синхронизироваться между собой
– Потоки из разных блоков не могут
взаимодействовать
Группировка потоков
• Группировка потоков позволяет
приложениям автоматически (прозрачно)
масштабировать себя на разные GPU
Сетка
Блок потоков 0
Блок потоков 1
Блок потоков N-1
…
Разделяемая
память
Разделяемая
память
Разделяемая
память
Прозрачное масштабирование
• Оборудование самостоятельно определяет
процессор, на котором будет выполняться
блок потоков
– Ядро масштабируется на все параллельные
мультипроцессоры
Прозрачное масштабирование
Устройство A
Блок 0
Блок 1
Блок 2
Блок 3
Блок 4
Блок 5
Блок 6
Блок 7
Сетка ядра
Блок 0
Блок 1
Блок 2
Блок 3
Блок 4
Блок 5
Блок 6
Блок 7
Устройство Б
Блок 0
Блок 1
Блок 2
Блок 3
Блок 4
Блок 5
Блок 6
Блок 7
Архитектура CUDA GPU
• 32 – 240 потоковых процессоров (thread
processors) или «ядер» (cores)
• 4 – 30 мультипроцессоров (multiprocessors),
каждый из которых содержит:
– 8 потоковых процессоров
– модуль двойной точности (только на серии 10)
– разделяемую память для совместной работы
потоков
Архитектура CUDA GPU
Мультипроцессор
типа SIMT
Потоковые
процессоры
Двойная точность
Разделяемая
память
Доступ ядра к памяти
• Ядру доступны разные типы памяти,
отличающиеся друг от друга размером,
временем жизни и быстродействием:
– в каждом потоке
– в каждом блоке
– на устройстве
Память в каждом потоке
• Регистровая память
– встроенная (на кристалле)
• Локальная память
– внешняя (на DRAM)
– некэшируемая
Регистровая память
Поток
Локальная память
Память в каждом блоке
• Разделяемая память
– встроенная (на кристалле)
– малого размера
– быстрая
Блок
Разделяемая память
Память на устройстве
• Глобальная память
Время
– внешняя (на DRAM)
– некэшируемая
– сохраняется при запуске нового ядра
– используется для взаимодействия с хостом
Ядро 1
…
Глобальная
память
Ядро 2
…
Схема работы памяти
• Локальная память расположена на DRAM
устройства
– Чтобы минимизировать использование локальной
памяти необходимо использовать регистровую и
разделяемую память
• Хост может обращаться к глобальной памяти
(выполнять команды чтения и записи)
• Хост не может обращаться к разделяемой
памяти потоков
Схема работы памяти
Хост
Устройство
GPU
CPU
Системный
контроллер
DRAM
Мультипроцессор
DRAM
Локальная
память
Глобальная
память
Мультипроцессор
Регистровая память
Мультипроцессор
Регистровая
память
Разделяемая
память
Регистровая
память
Разделяемая
память
Разделяемая память
Схема работы приложения
• Потоки запускаются потоковыми
процессорами
Поток
Потоковый
процессор
Thread
(Software )
Thread Processor
(Hardware)
Схема работы приложения
• Блоки потоков работают на
мультипроцессорах
• Блоки не могут быть переданы другому
мультипроцессору
• Несколько блоков могут работать на одном
мультипроцессоре
– ограничено доступными ресурсами
(регистровая и разделяемая память)
Схема работы приложения
• Блоки работают на мультипроцессорах
Блок
Потоковый
процессор
Thread Block
(Software )
Multiprocessor
(Hardware)
Схема работы приложения
• Ядро запускается как сетка блоков
• На устройстве может единовременно
работать только одно ядро
Схема работы приложения
• Ядро запускается как сетка блоков
…
Сетка
Устройство
Grid
(Software )
Device
(Hardware)
CUDA как технология GPGPU
• Возможность произвольного побайтового
доступа к адресному пространству памяти
– Поток может получить доступ к любой части
разделяемой памяти
• Неограниченный доступ к памяти
– Поток может обращаться к памяти любое
количество раз
CUDA как технология GPGPU
• Наличие разделяемой памяти (для каждого
блока) и возможность синхронизации
потоков
– Потоки совместно загружают данные в
разделяемую память
– Любой поток имеет доступ к любой части
разделяемой памяти
CUDA как технология GPGPU
• Возможность быстрого освоения
– CUDA с точки зрения программиста – это
небольшое расширение языка Си
– Не требует знаний в области компьютерной
графики
Основные идеи CUDA
• Триллионы простых и быстрых потоков
– Простая схема декомпозиции данных
• Двухуровневая иерархия потоков
– Простая схема работы приложения
• Наличие барьерной синхронизации
– Простая схема синхронизации
• Наличие разделяемой памяти
– Простая схема взаимодействия потоков
OpenCL
Открытый стандарт параллельных
вычислений в гетерогенных
системах
Основные понятия OpenCL
• OpenCL – Open Computing Language
• Основан на открытой спецификации
• Разрабатывается содружеством ведущих
производителей информационных
технологий (Apple, nVidia, AMD, Intel и др.)
• Требует программной реализации
– Реализация может быть сделана «кем угодно»
– Допускает множественные реализации
– Реализация должна соответствовать стандарту
Предпосылки для появления OpenCL
• Использование вычислительных ядер для
повышения производительности
– Тактовая частота больше не играет ключевую роль
• Наличие (нескольких) многоядерных CPU и
программируемых GPU
• Отсутствие единого интерфейса для
использования всех вычислительных ресурсов
системы
• Отсутствие поддержки универсальных
параллельных вычислений
OpenCL как стандарт
• Не зависит от аппаратного обеспечения
• Открытый стандарт
– Программный код должен работать на любой
реализации OpenCL
• Совместный контроль производителей
информационных технологий над
спецификацией
– Не зависит от одного производителя
Аппаратное обеспечение OpenCL
• CPU ведущих производителей
• GPU ведущих производителей
• Любое устройство, поддерживаемое
конкретной реализацией
– Специализированные микропроцессоры
– ППВМ
– Встроенные процессоры
Особенности OpenCL
• Простая модель параллельных вычислений
– Понятный интерфейс программирования
приложений (API)
• Поддержка стандарта ANSI-C99
– Наличие дополнительных определителей, типов и
встроенных функций
• Наличие инфраструктуры управления
потоками
– Возможность синхронизации на уровнях
приложения и потока
Download