Многоядерность – следующий «Закон Мура» Эра микропроцессоров Эра многоядерных / гетерогенных систем 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 – Наличие дополнительных определителей, типов и встроенных функций • Наличие инфраструктуры управления потоками – Возможность синхронизации на уровнях приложения и потока