Программирование процессора Cell Киреев С.Е. Летняя школа по параллельному программированию, Новосибирск, 28 августа 2009.

Презентация:



Advertisements
Похожие презентации
Процессор Cell Киреев Сергей ИВМиМГ. План Общая информация о процессоре Cell Архитектура процессора Cell Программирование процессора Cell Реализации систем.
Advertisements

Процессор Cell Киреев Сергей ИВМиМГ.
Введение в параллельную обработку. Уровни параллелизма в процессорах Параллелизм данных (DLP – Data Level Parallelism) Параллелизм команд (ILP – Instruction.
Архитектура микропроцессоров И ее эволюция. Процессор и память: Команды и данные.
Многопоточное программирование в OpenMP Киреев Сергей ИВМиМГ.
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Томский политехнический университет.
Современные микропроцессоры Тенденции развития. Рассматриваемые процессоры Intel Itanium 2 Intel Core 2 Duo IBM Cell.
Параллельные аппаратные архитектуры и модели программирования Традиционная архитектура фон Неймана Расширение традиционной архитектуры Сопроцессоры Многоядерные.
Архитектуры с параллелизмом на уровне команд. Два класса Суперскалярные процессоры Процессоры с длинным командным словом.
Характеристики ядра процессора Регистры –Количество –Типы регистров Общего назначения Адресные Регистры флагов Вычислительные устройства –ALU: Fixed-point.
Организация ЭВМ и систем Кафедра Параллельных вычислений (ИВМиМГ) Маркова Валентина Петровна, Киреев Сергей Евгеньевич,
Программирование многоядерных архитектур (слайды для лекции 2013/04/20) Киреев С.Е., Маркова В.П., Остапкевич М.Б., Перепелкин В.А. МО ВВС ИВМиМГ СО РАН.
Параллельное программирование с использованием технологии MPI Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 4 Томский политехнический университет.
RISC-архитектуры ( Reduced Instruction Set Computer)
МультиТредовые архитектуры.
Многопоточное программирование. Виды параллелизма. Общая память Распределенная память.
Лекция 6 Множественное распараллеливание на Linux кластере с помощью библиотеки MPI 1. Компиляция и запуск программы на кластере. 2. SIMD модель параллельного.
Разработка параллельных приложений для многоядерных систем С.В. Ковальчук НИИ Наукоемких компьютерных технологий, СПбГУ ИТМО.
Архитектуры с параллелизмом на уровне команд. Два класса Суперскалярные процессоры Процессоры с длинным командным словом.
POSIX Threads МО ВВС ИВМ и МГ СО РАН Городничев Максим Александрович.
Транксрипт:

Программирование процессора Cell Киреев С.Е. Летняя школа по параллельному программированию, Новосибирск, 28 августа 2009

Сравнение современных процессоров

Реализации систем на базе Cell Roadrunner – самый мощный суперкомпьютер в мире на базе процессоров Opteron и Cell

Реализации систем на базе Cell Системы на базе Cell – самые «зеленые»

Реализации систем на базе Cell 1. Продукты IBM IBM BladeCenter QS 21 2 × Cell B.E. 3.2 GHz IBM BladeCenter QS 22 2 × PowerXCell 8i 3.2 GHz 2 × PowerXCell 8i 4.0 GHz 2. Продукты Mercury Computer Systems Mercury Dual Cell Based System 2 2 × Cell B.E. 3.2 GHz Mercury Dual Cell Based Blade 2 2 × Cell B.E. 3.2 GHz Mercury PCI Express Cell Accelerator Board 2 1 × Cell B.E. 2.8 GHz 3. Продукты Fixstars Fixstars GagaAccell 180 Accelerator Board 1 × PowerXCell 8i 2.8 GHz 4. Продукты Т-Платформы PeakCell S 2 × PowerXCell 8i 3.2 GHz PeakCell W 2 × PowerXCell 8i 3.2 GHz PeakCell YPS 4 × PowerXCell 8i 3.2 GHz

Sony PlayStation3 в ИВМиМГ в отделе МО ВВС 1 процессор CELL B.E. 3.2 GHz 1 ядро PPE 6 ядер SPE 256 MB оперативной памяти

План Архитектура процессора Cell Принципы программирования Базовые средства программирования Создание и компиляция простых программ Механизмы передачи данных и сообщений Программирование вычислений на SPE Библиотеки

Структура обычного многоядерного узла Все ядра в узле равноправные Кластер МВС-100К (Москва) Кластер НКС-30Т (Новосибирск)

Структура процессора Cell Многоядерный процессор Cell Power Processor Element – ядро общего назначения (главное) Synergistic Processor Element – векторные ядра (дополнительные) Element Interconnect Bus – быстрая шина

Структура процессора Cell 1 ядро PPE ядро общего назначения (PowerPC, 2 потока) выполняет код операционной системы управляет ходом вычислений 8 ядер SPE специализированные векторные ядра (особый набор команд) обеспечивают вычислительную мощность процессора работают с ограниченной локальной памятью: 256 KB имеют много регистров: 128 Шина EIB асинхронная имеет высокую пропускную способность обеспечивает большое число одновременных запросов

Виды параллелизма в процессоре Cell 1. Многоядерность. Независимые задачи, которые могут быть выполнены одновременно на разных ядрах: 2 аппаратных потока PPE 8 программ SPE SPE PPE Данные и вычисления необходимо разрезать на фрагменты и распределять между ядрами

Виды параллелизма в процессоре Cell 1. Многоядерность. Независимые задачи, которые могут быть выполнены одновременно на разных ядрах: 2 аппаратных потока PPE 8 программ SPE 2. Векторизация. Регулярные векторные данные, обработка которых может быть векторизована: SPE SIMD PPE VMX SPE PPE Данные необходимо группировать в вектора и следить за выравниванием

Виды параллелизма в процессоре Cell 1. Многоядерность. Независимые задачи, которые могут быть выполнены одновременно на разных ядрах: 2 аппаратных потока PPE 8 программ SPE 2. Векторизация. Регулярные векторные данные, обработка которых может быть векторизована: SPE SIMD PPE VMX 3. Асинхронная передача данных SPE PPE Необходимо использовать специальные алгоритмы для совмещения передач данных и вычислений

Модель памяти Общее адресное пространство PPE … Обычные операции чтения и записи данных (read / write) Отображение локальной памяти SPE Локальная память SPE Явные операции передачи данных (put / get) SPE … Обычные операции чтения и записи данных (read / write) Отображение локальной памяти SPE Локальная память SPE SPE

Сравнение подсистем памяти Обычная иерархия памяти Иерархия памяти ядра SPE

Сравнение подсистем памяти Обычная иерархия памяти Ядро может обращаться к данным в оперативной памяти После запроса данные из памяти придут неизвестно когда Гарантировать приход данных вовремя можно с помощью: Правильного порядка обращений к данным Предвыборки Кэш Оперативная память Данные Запрос данных Обычное процессорное ядро Запрос данных Данные

Сравнение подсистем памяти Иерархия памяти ядра SPE Ядро SPE может обращаться к данным в локальной памяти Ядро может отправлять запрос на перемещение данных из оперативной в локальную память (или обратно) и проверять его завершение Данные из локальной памяти доступны за константное время LS Оперативная память Данные Запрос на копирование данных Запрос данных Данные Ядро SPE локальная память SPE

Выполнение обменов на фоне вычислений время Load 1Count 1Store 1Load 2Count 2Store 2 время Load 1Count 1Store 1 Load 2Count 2Store 2 Count 3Load 3 Load 4Count 4 Store 3 Вычисления с одним буфером на SPE Вычисления с двумя буферами на SPE Load – копирование данных в память SPE Count – выполнение вычислений Store – копирование результата из памяти SPE

План Архитектура процессора Cell Принципы программирования Базовые средства программирования Создание и компиляция простых программ Механизмы передачи данных и сообщений Программирование вычислений на SPE Библиотеки

Программирование Cell Для организации вычислений на Cell необходимо: Разделить задачу на независимые фрагменты для обработки на ядрах SPE Организовать передачу данных между ядрами на одновременно с вычислениями Выполнить векторизацию вычислений на ядрах SPE

Сравнение параллельных вычислений на Cell с «традиционными» подходами SMP-узел + потоки (OpenMP, PThreads, …) Кластер + библиотека MPI Узел на базе процессоров Cell

Сравнение параллельных вычислений на Cell с «традиционными» подходами SMP-узел + потоки (OpenMP, PThreads, …) На одном узле работают несколько потоков исполнения Данные одинаково доступны всем потокам Каждый поток выполняет свою часть работы над общими данными Данные обрабатываются в том месте, где они хранятся 4-core SMP

Кластер + библиотека MPI На каждом узле работает один или несколько процессов Данные распределены по процессам Каждый процесс выполняет свою часть работы над своими данными Процессы обмениваются сообщениями Сравнение параллельных вычислений на Cell с «традиционными» подходами Данные обрабатываются в том месте, где они хранятся CLUSTERCLUSTER

Сравнение параллельных вычислений на Cell с «традиционными» подходами Узел на базе процессоров Cell На ядре PPE работает главный поток На ядрах SPE работают вычислительные потоки копируют блоки данных из общей памяти в локальную память ядра производят вычисления над данными в локальной памяти копируют результаты в общую память PPE SPE Для обработки данные необходимо скопировать в локальную память ядер SPE

PPE Function offload model {… matrix a, b, c; multiply(a, b, c); } SPE multiply() { … } mul() { … } SPE mul() { … } SPE mul() { … } Статическое или динамическое распределение подзадач Модели программирования процессора Cell

SPE PPE Портфель задач work() { … } Task main() { … AddTask(); … } Task Очередь задач Модели программирования процессора Cell

SPE PPE Потоковый конвейер step1() { … } step2() { … } step4() { … } step3() { … } Input data Output data main() { … make_input(); … get_output(); … } Модели программирования процессора Cell

Взаимодействующие процессы с общей памятью SPE PPE SPE Общая память Модели программирования процессора Cell

Взаимодействующие процессы с распределенной памятью SPE PPE SPE Память PPE Модели программирования процессора Cell

План Архитектура процессора Cell Принципы программирования Базовые средства программирования Создание и компиляция простых программ Механизмы передачи данных и сообщений Программирование вычислений на SPE Библиотеки

Библиотека libspe2 LibSPE предоставляет интерфейс к базовым средствам программирования процессора Cell, реализованным аппаратно. Разработка программы: Создается отдельная программа для PPE, Создается отдельная программа для SPE, PPE-программа запускает SPE-программу, SPE-программа может вызвать callback-функцию вызвавшей ее PPE-программы. PPESPE Callback function Run SPE program main() { count(); printf(Hello!); } SPE-program main() { run(); } int printf(…) PPE-program

Библиотека libspe2: Программа «Hello, World!» Программа для PPE (ppu_prog.c) #include extern spe_program_handle_t spu_hello; int main () { unsigned int entry = SPE_DEFAULT_ENTRY; spe_context_ptr_t spe; spe = spe_context_create (0, NULL); spe_program_load (spe, &spu_hello); spe_context_run (spe, &entry, 0, (void *) 10, (void *) 20, NULL); spe_context_destroy (spe); return 0; } Программа для SPE (spu_prog.c) #include int main (unsigned long long spe, unsigned long long argp, unsigned long long envp) { printf("Hello, World! (%llu,%llu)\n", argp, envp); return 0; }

Библиотека libspe2: Программа «Hello, World!» main() { … } main() { … } spu_prog.c spu-gcc -o spu_prog spu_prog.c spu_prog Компиляция программы для Cell: ppu_prog.c spu_hello ppu-embedspu spu_hello spu_prog spu_prog.o ppu-gcc -o prog ppu_prog.c spu_prog.o -lspe2 spu_prog.o prog Исполняемый файл для SPE Исполняемый файл для PPE+SPE

Создание параллельной программы для Cell: В программе на PPE создать несколько параллельных потоков, В потоках запустить программы на SPE. main() { … … } thread_func() { … } pthread_create() main() { … } SPE run() PPE Библиотека libspe2: Многопоточная программа «Hello, World!»

Программа для PPE многопоточная #include #define NTHREADS 40 extern spe_program_handle_t spu_hello; void *thread_func (void *data) { unsigned int entry = SPE_DEFAULT_ENTRY; spe_context_ptr_t spe; spe = spe_context_create (0,NULL); spe_program_load (spe, &spu_hello); spe_context_run (spe, &entry, 0, (void *)data, (void *)NTHREADS, NULL); spe_context_destroy (spe); return 0; } int main () { pthread_t tid [NTHREADS]; unsigned long i; for (i=0;i

План Архитектура процессора Cell Принципы программирования Базовые средства программирования Создание и компиляция простых программ Механизмы передачи данных и сообщений Программирование вычислений на SPE Библиотеки

DMA-передача – блок данных до 16 KB: Операция Get:общая память память SPE Операция Put:память SPE общая память Mailbox-ы – очереди 32-битных сообщений: SPE in (4) SPE out (1) SPE out interrupt (1) Сигналы – 32-битные сообщения: Только к SPE Механизмы передачи данных и сообщений

DMA-передача данных Может запускаться и на PPE, и на SPE Общее адресное пространство SPE get put Механизмы передачи данных и сообщений

DMA-передача данных Может запускаться и на PPE, и на SPE Общее адресное пространство SPE get put get list Механизмы передачи данных и сообщений

DMA-передача данных Может запускаться и на PPE, и на SPE Общее адресное пространство SPE get put get list put list Механизмы передачи данных и сообщений

DMA-передача данных Блоки данных должны быть выровнены в памяти по границе 16 байт. Размер передаваемых данных может быть 1,2,4,8,16 или 16*N байтов. Для идентификации группы DMA-передач используются 5-битные DMA-тэги. Тэг позволяет проверить статус или дождаться завершения соответствующей группы DMA- передач. Механизмы передачи данных и сообщений

DMA-передача данных Чтобы упорядочить выполнение передач, используются специальные варианты команд get и put: Barrier:getb, putb Fence:getf, putf Механизмы передачи данных и сообщений время

Программа для SPE // GET: Передача данных из PPE в SPE void get (void *dest_lsa, unsigned long long sour_ea, unsigned long size) { int tag=mfc_tag_reserve(), mask=1

Mailbox: передача 4-байтовых сообщений PPE SPE spe_in_mbox_write()spu_read_in_mbox() spe_out_mbox_read()spu_write_out_mbox() spe_out_mbox_status() spe_in_mbox_status() spu_stat_in_mbox() spu_stat_out_mbox() блокированные передачи неблокированные передачи in out Механизмы передачи данных и сообщений

Mailbox: передача 4-байтовых сообщений Signal: передача 4-байтовых сообщений PPE SPE spe_in_mbox_write()spu_read_in_mbox() spe_out_mbox_read()spu_write_out_mbox() spe_out_mbox_status() spe_in_mbox_status() spu_stat_in_mbox() spu_stat_out_mbox() PPE SPE spe_signal_write()spu_read_signal1() spu_stat_signal1() spu_stat_signal2() spe_signal_write() spu_read_signal2() блокированные передачи неблокированные передачи in out sig1 sig2 Механизмы передачи данных и сообщений

Фрагмент программы для PPE … while ( spe_out_mbox_status(spe) == 0 );// ожидание данных в очереди spe_out_mbox_read(spe,&data,1);// чтение одного элемента из очереди data++;// изменение данных spe_signal_write(spe, SPE_SIG_NOTIFY_REG_1, data); // запись в регистр сигнала 1 … Фрагмент программы для SPE … spu_write_out_mbox(data);// запись элемента данных в очередь data=spu_read_signal1();// чтение данных из регистра сигнала 1 … PPE SPE signal mailbox Библиотека libspe 2.0: Программа «Ping-pong»

Локальная память SPE отображается в общее адресное пространство. Обращение SPE к заданному участку адресного пространства позволяет обращаться к памяти другого SPE. Адресное пространство SPE put spe_ls_area_get() Передача данных между SPE

Регистры mailbox-ов и сигналов SPE отображаются в общее адресное пространство. Запись/чтение заданного элемента адресного пространства позволяет одному SPE отправлять и получать сообщения другого SPE. Адресное пространство SPE spe_ps_area_get() put get Передача сообщений между SPE

План Архитектура процессора Cell Принципы программирования Базовые средства программирования Создание и компиляция простых программ Механизмы передачи данных и сообщений Программирование вычислений на SPE Библиотеки

Все регистры SPE векторные длиной 16 байт. Все арифметические инструкции являются параллельными по данным и работают с векторами. Скалярные операции выполняются путем соответствующего использования векторных команд. Скалярные аргументы, необходимые некоторым инструкциям, располагаются в «предпочтительных» позициях вектора: Программирование вычислений на SPE

Локальная память SPE Объем локальной памяти для данных и кода: 256 KB Чтение и запись локальной памяти всегда выполняется выровненными блоками размером 16 байт: Если адрес не выровнен, он автоматически округляется до 16 байт Защита памяти отсутствует Можно свободно читать и писать в области данных, кода и стека

Векторные типы данных

Элементы векторных типов данных выравниваются автоматически. Элементы других типов можно выравнивать явно: unsigned char buffer[1024] __attribute__ ((aligned(16))); Пример инициализации векторной переменной: vector float vf1 = { 1.0, 2.0, 3.0, 4.0 }; vector float vf2[2] = {{1.0, 2.0, 3.0, 4.0}, {5.0, 6.0, 7.0, 8.0}}; vector float vf3[2] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0};

Команды уровня компилятора Для манипуляции векторными данными используются intrinsics – встроенные в компилятор команды: Специальные (specific) – отображаются в одну инструкцию процессора, Например: d = si_to_int(a); Обобщенные (generic) – отображаются в одну или несколько инструкций процессора в зависимости от входных параметров, Например: c = spu_add (a, b); Составные (built-ins) – последовательности обобщенных и специальных intrinsics (объединенные для удобства). Например, команды DMA-передачи.

Операции над векторами Арифметические операции над элементами векторов: d = spu_add(a,b); d = spu_sub(a, b); d = spu_madd(a, b, c); d = spu_mul(a, b); … Логические операции над битами векторов: d = spu_and(a, b); d = spu_or(a, b); d = spu_eqv(a, b); … Более сложные операции: библиотека simdmath.

Операции над векторами Операции преобразования скалярных и векторных данных: d = spu_insert(s, v, n); d = spu_splats(s); d = spu_promote(s, n); s = spu_extract(v, n); Операции преобразования типов: d = spu_convtf(a, scale); d = spu_convts(a, scale); d = spu_extend(a); …

Операции над векторами Операции для манипулирования элементами векторов: Сдвиг, вращение элементов d = spu_rl(a, count); d = spu_sl(a, count); … Перестановка элементов векторов d = spu_sel(a, b, pattern); d = spu_shuffle(a, b, pattern); …

void mulv (float *a, float *b, float *c, int n) { int i, j, k; vector float *bv = (vector float *) b; vector float *cv = (vector float *) c; vector float s, t; s = spu_splats(0.0); for (i=0; i

Особенности векторизации вычислений Простой пример: for (i=0; i

Особенности векторизации вычислений Операнды должны быть приведены к одному типу Пример: int a[n]; short int b[n]; for (i=0; i

Особенности векторизации вычислений Операнды должны быть выровнены друг относительно друга

Особенности реализации скалярных вычислений При выполнении операции над скалярными переменными в памяти происходит следующее: Чтение векторов, содержащих операнды, в регистры, Относительное выравнивание операндов в векторах, Выполнение операции над векторами, Чтение вектора, содержащего результат, Помещение результата в нужную позицию результирующего вектора, Запись результирующего вектора в память. Это очень долго!

Оптимизация целочисленной арифметики На SPE отсутствует 32-битное умножение. Используйте short int вместо int, где это возможно. short int i,k; for (i=0; i

Оптимизация условных переходов Устранение условных переходов Подсказка компилятору... if (a > b) c += 1; else d = a + b;... select = spu_cmpgt(a, b); c_plus_1 = spu_add(c, 1); a_plus_b = spu_add(a, b); c = spu_sel (c, c_plus_1, select); d = spu_sel (a_plus_b, d, select);... if (a > b) c += 1; else d = a + b;... if ( __builtin_expect(a>b, 1) ) c += 1; else d = a + b;...

План Архитектура процессора Cell Принципы программирования Базовые средства программирования Создание и компиляция простых программ Механизмы передачи данных и сообщений Программирование вычислений на SPE Библиотеки

Средства программирования процессоров Cell Средства от IBM (IBM Cell SDK) Библиотека libspe 2.0 Библиотеки векторизованых операций: SIMD Math Library, MASS Library, FFT, Game math, Image Processing, Matrix, Vector, Multi-precision math, BLAS, LAPACK, Monte-Carlo Sync Library: атомарные операции, мьютексы, условные переменные, … Software managed cache Распараллеливающие векторизующие компиляторы (OpenMP): xlc, xlf DaCS – Data Communication and Synchronization library ALF – Accelerated Library Framework Другие средства BSC Cell Superscalar Mercury Computer Systems: MultiCore Framework RapidMind Gedae

Ссылки IBM Cell Broadband Engine resource center, Cell Developer's Corner, STI Center of Competence for the Cell Broadband Engine Processor, Barcelona Supercomputing Center: Cell Superscalar, RapidMind Development Platform, Mercury Computer Systems: MultiCore Framework,