Содержание
-
Программирование процессора Cell
Киреев С.Е. Летняя школа по параллельному программированию, Новосибирск, 28 августа 2009
-
Сравнение современных процессоров
-
Реализации систем на базе Cell
Roadrunner – самый мощный суперкомпьютерв мире на базе процессоров Opteron и Cell
-
Системы на базе Cell – самые «зеленые»
-
Продукты 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 Продукты 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 Продукты Fixstars Fixstars GagaAccell 180 Accelerator Board 1 × PowerXCell 8i 2.8 GHz Продукты Т-Платформы 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 – быстрая шина
-
1 ядро PPE ядро общего назначения (PowerPC, 2 потока) выполняет код операционной системы управляет ходом вычислений 8 ядер SPE специализированные векторные ядра (особый набор команд) обеспечивают вычислительную мощность процессора работают с ограниченной локальной памятью: 256 KB имеют много регистров: 128 Шина EIB асинхронная имеет высокую пропускную способность обеспечивает большое число одновременных запросов
-
Виды параллелизмав процессоре Cell
Многоядерность. Независимые задачи, которые могут быть выполнены одновременно на разных ядрах: 2 аппаратных потока PPE 8 программ SPE SPE SPE SPE SPE SPE SPE SPE SPE PPE Данные и вычисления необходимо разрезать на фрагментыи распределять между ядрами
-
Многоядерность. Независимые задачи, которые могут быть выполнены одновременно на разных ядрах: 2 аппаратных потока PPE 8 программ SPE Векторизация. Регулярные векторные данные, обработка которых может быть векторизована: SPE SIMD PPE VMX SPE SPE SPE SPE SPE SPE SPE SPE PPE Данные необходимо группировать в вектора и следить за выравниванием
-
Многоядерность. Независимые задачи, которые могут быть выполнены одновременно на разных ядрах: 2 аппаратных потока PPE 8 программ SPE Векторизация. Регулярные векторные данные, обработка которых может быть векторизована: SPE SIMD PPE VMX Асинхронная передача данных SPE SPE SPE SPE SPE SPE SPE SPE PPE Необходимо использовать специальные алгоритмы для совмещения передач данных и вычислений
-
Модель памяти
Общее адресное пространство PPE … Обычные операции чтения и записи данных (read / write) Отображениелокальной памяти SPE Локальная память SPE Явные операции передачи данных (put / get) SPE … Обычные операции чтения и записи данных (read / write) Отображениелокальной памяти SPE Локальная память SPE SPE
-
Сравнение подсистем памяти
Обычная иерархия памяти Иерархия памяти ядра SPE
-
Обычная иерархия памяти Ядро может обращаться к данным в оперативной памяти После запроса данные из памяти придут неизвестно когда Гарантировать приход данных вовремя можно с помощью: Правильного порядка обращений к данным Предвыборки Кэш Оперативная память Данные Запрос данных Обычное процессорное ядро Запрос данных Данные
-
Иерархия памяти ядра SPE Ядро SPE может обращаться к данным в локальной памяти Ядро может отправлять запрос на перемещение данных из оперативной в локальную память (или обратно) и проверять его завершение Данные из локальной памяти доступны за константное время LS Оперативная память Данные Запрос на копирование данных Запрос данных Данные Ядро SPE локальная память SPE
-
Выполнение обменов на фоне вычислений
время Load 1 Count 1 Store 1 Load 2 Count 2 Store 2 время Load 1 Count 1 Store 1 Load 2 Count 2 Store 2 Count 3 Load 3 Load 4 Count 4 Store 3 Вычисления с одним буфером на SPE Вычисления с двумя буферамина SPE Load – копирование данных в память SPE Count – выполнение вычислений Store – копирование результата из памяти SPE
-
План
Архитектура процессора Cell Принципы программирования Базовые средства программирования Создание и компиляция простых программ Механизмы передачи данных и сообщений Программирование вычислений на SPE Библиотеки
-
Программирование Cell
Для организации вычислений на Cell необходимо: Разделить задачу на независимые фрагменты для обработки на ядрах SPE Организовать передачу данных между ядрами на одновременно с вычислениями Выполнить векторизацию вычислений на ядрах SPE
-
Сравнение параллельных вычислений на Cell с «традиционными» подходами
SMP-узел +потоки (OpenMP, PThreads, …) Кластер + библиотека MPI Узел на базе процессоров Cell
-
SMP-узел +потоки (OpenMP, PThreads, …) На одном узле работают несколько потоков исполнения Данные одинаково доступны всем потокам Каждый поток выполняет свою часть работы над общими данными 0 1 2 3 Данные обрабатываются в том месте, где они хранятся 4-core SMP
-
Кластер + библиотека MPI На каждом узле работает один или несколько процессов Данные распределены по процессам Каждый процесс выполняет свою часть работы над своими данными Процессы обмениваются сообщениями Данные обрабатываются в том месте, где они хранятся C L U S T E R
-
Узел на базе процессоров Cell Наядре PPE работает главный поток На ядрах SPE работают вычислительные потоки копируют блоки данных из общей памяти в локальную память ядра производят вычисления над данными в локальной памяти копируют результаты в общую память PPE SPE Для обработки данные необходимо скопировать в локальную память ядер SPE
-
Модели программирования процессора Cell
PPE Function offload model {… matrix a, b, c; multiply(a, b, c); } SPE multiply() { … } mul() { … } SPE mul() { … } SPE mul() { … } Статическое или динамическое распределение подзадач
-
SPE SPE SPE SPE PPE Портфель задач work() { … } work() { … } work() { … } work() { … } Task Task Task Task Task Task main() { … AddTask(); … } Task Очередь задач
-
SPE SPE SPE SPE PPE Потоковый конвейер step1() { … } step2() { … } step4() { … } step3() { … } Input data Output data main() { … make_input(); … get_output(); … }
-
Взаимодействующие процессы с общей памятью SPE PPE SPE SPE SPE SPE SPE SPE SPE Общая память
-
Взаимодействующие процессы с распределенной памятью SPE PPE SPE SPE SPE SPE SPE SPE SPE Память PPE
-
План
Архитектура процессора Cell Принципы программирования Базовые средства программирования Создание и компиляция простых программ Механизмы передачи данных и сообщений Программирование вычислений на SPE Библиотеки
-
Библиотека libspe2
LibSPE предоставляет интерфейс к базовым средствам программирования процессора Cell, реализованным аппаратно. Разработка программы: Создается отдельная программа для PPE, Создается отдельная программа для SPE, PPE-программа запускает SPE-программу, SPE-программа может вызвать callback-функцию вызвавшей ее PPE-программы. PPE SPE 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; }
-
main() { … } main() { … } spu_prog.c spu-gcc -o spu_prog spu_prog.c spu_prog Компиляция программы для Cell: ppu_prog.c spu_hello ppu-embedspuspu_hello spu_prog spu_prog.o ppu-gcc -o progppu_prog.c spu_prog.o -lspe2 spu_prog.o prog Исполняемый файл для SPE Исполняемый файл для PPE+SPE
-
Библиотека libspe2:Многопоточная программа «Hello, World!»
Создание параллельной программы для Cell: В программе на PPE создать несколько параллельных потоков, В потоках запустить программы на SPE. main() { … … … … } thread_func() { … } thread_func() { … } thread_func() { … } pthread_create() main() { … } main() { … } main() { … } SPE SPE SPE run() PPE
-
Программа для PPE многопоточная #include #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 SPE SPE SPE get put
-
DMA-передача данных Может запускаться и на PPE, и на SPE Общее адресное пространство SPE SPE SPE SPE get put get list
-
DMA-передача данных Может запускаться и на PPE, и на SPE Общее адресное пространство SPE SPE 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 время
-
Библиотека libspe 2.0:Пример передачи данных DMA
Программа для 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
-
Библиотека libspe 2.0:Программа «Ping-pong»
Фрагмент программы для 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
-
Передача данных между SPE
Локальная память SPE отображается в общее адресное пространство. Обращение SPE к заданному участку адресного пространства позволяет обращаться к памяти другого SPE. Адресное пространство SPE SPE put spe_ls_area_get()
-
Передача сообщениймежду SPE
Регистры mailbox-ов и сигналов SPE отображаются в общее адресное пространство. Запись/чтение заданного элемента адресного пространства позволяет одному SPE отправлять и получать сообщения другого SPE. Адресное пространство SPE SPE spe_ps_area_get() put get
-
План
Архитектура процессора Cell Принципы программирования Базовые средства программирования Создание и компиляция простых программ Механизмы передачи данных и сообщений Программирование вычислений на SPE Библиотеки
-
Программирование вычислений на SPE
Все регистры SPE векторные длиной 16 байт. Все арифметические инструкции являются параллельными по данным и работают с векторами. Скалярные операции выполняются путем соответствующего использования векторных команд. Скалярные аргументы, необходимые некоторым инструкциям, располагаются в «предпочтительных» позициях вектора:
-
Локальная память 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-битное умножение. Используйте shortint вместо int, где это возможно. short int i,k; for (i=0; i
-
Оптимизация условных переходов
Устранение условных переходов Подсказка компилятору
-
План
Архитектура процессора 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, http://www.ibm.com/developerworks/power/cell/documents.html Cell Developer's Corner, http://www.power.org/resources/devcorner/cellcorner STI Center of Competence for the Cell Broadband Engine Processor, http://sti.cc.gatech.edu Barcelona Supercomputing Center: Cell Superscalar, www.bsc.es/cellsuperscalar RapidMind Development Platform, www.rapidmind.net Mercury Computer Systems: MultiCore Framework, http://www.mc.com/software/multicore_framework.aspx
-
Нет комментариев для данной презентации
Помогите другим пользователям — будьте первым, кто поделится своим мнением об этой презентации.