Слайд 2
Сравнение современных процессоров
Слайд 3
Реализации систем на базе Cell
Roadrunner – самый мощный
суперкомпьютер в мире на базе процессоров Opteron и Cell
Слайд 4
Реализации систем на базе Cell
Системы на базе Cell
– самые «зеленые»
Слайд 5
Реализации систем на базе 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
Слайд 7
Sony PlayStation3 в ИВМиМГ
в отделе МО ВВС
1 процессор
CELL B.E. 3.2 GHz
1 ядро PPE
6 ядер SPE
256 MB
оперативной памяти
Слайд 8
План
Архитектура процессора Cell
Принципы программирования
Базовые средства программирования
Создание и компиляция
простых программ
Механизмы передачи данных и сообщений
Программирование вычислений на SPE
Библиотеки
Слайд 9
Структура обычного многоядерного узла
Все ядра в узле равноправные
Кластер
МВС-100К (Москва)
Кластер НКС-30Т (Новосибирск)
Слайд 10
Структура процессора Cell
Многоядерный процессор Cell
Power Processor Element –
ядро общего назначения (главное)
Synergistic Processor Element – векторные ядра
(дополнительные)
Element Interconnect Bus – быстрая шина
Слайд 11
Структура процессора Cell
1 ядро PPE
ядро общего назначения (PowerPC,
2 потока)
выполняет код операционной системы
управляет ходом вычислений
8 ядер SPE
специализированные
векторные ядра
(особый набор команд)
обеспечивают вычислительную мощность процессора
работают с ограниченной локальной памятью: 256 KB
имеют много регистров: 128
Шина EIB
асинхронная
имеет высокую пропускную способность
обеспечивает большое число одновременных запросов
Слайд 12
Виды параллелизма
в процессоре Cell
Многоядерность. Независимые задачи, которые могут
быть выполнены одновременно на разных ядрах:
2 аппаратных потока PPE
8
программ SPE
Данные и вычисления необходимо разрезать на фрагменты и распределять между ядрами
Слайд 13
Виды параллелизма
в процессоре Cell
Многоядерность. Независимые задачи, которые могут
быть выполнены одновременно на разных ядрах:
2 аппаратных потока PPE
8
программ SPE
Векторизация. Регулярные векторные данные, обработка которых может быть векторизована:
SPE SIMD
PPE VMX
Данные необходимо группировать в вектора и следить за выравниванием
Слайд 14
Виды параллелизма
в процессоре Cell
Многоядерность. Независимые задачи, которые могут
быть выполнены одновременно на разных ядрах:
2 аппаратных потока PPE
8
программ SPE
Векторизация. Регулярные векторные данные, обработка которых может быть векторизована:
SPE SIMD
PPE VMX
Асинхронная передача данных
Необходимо использовать специальные алгоритмы для совмещения передач данных и вычислений
Слайд 15
Модель памяти
Общее адресное пространство
PPE
…
Обычные операции чтения и записи
данных
(read / write)
Отображение локальной памяти SPE
Локальная память SPE
Явные операции
передачи данных
(put / get)
SPE
…
Обычные операции чтения и записи данных (read / write)
Отображение локальной памяти SPE
Локальная память SPE
SPE
Слайд 16
Сравнение подсистем памяти
Обычная иерархия памяти
Иерархия памяти ядра SPE
Слайд 17
Сравнение подсистем памяти
Обычная иерархия памяти
Ядро может обращаться к
данным в оперативной памяти
После запроса данные из памяти придут
неизвестно когда
Гарантировать приход данных вовремя можно с помощью:
Правильного порядка обращений к данным
Предвыборки
Кэш
Оперативная
память
Данные
Запрос данных
Обычное
процессорное ядро
Запрос данных
Данные
Слайд 18
Сравнение подсистем памяти
Иерархия памяти ядра SPE
Ядро SPE может
обращаться к данным в локальной памяти
Ядро может отправлять запрос
на перемещение данных из оперативной в локальную память (или обратно) и проверять его завершение
Данные из локальной памяти доступны за константное время
LS
Оперативная
память
Данные
Запрос на копирование данных
Запрос данных
Данные
Ядро SPE
локальная
память
SPE
Слайд 19
Выполнение обменов на фоне вычислений
время
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
Слайд 20
План
Архитектура процессора Cell
Принципы программирования
Базовые средства программирования
Создание и компиляция
простых программ
Механизмы передачи данных и сообщений
Программирование вычислений на SPE
Библиотеки
Слайд 21
Программирование Cell
Для организации вычислений на Cell необходимо:
Разделить задачу
на независимые фрагменты для обработки на ядрах SPE
Организовать передачу
данных между ядрами на одновременно с вычислениями
Выполнить векторизацию вычислений на ядрах SPE
Слайд 22
Сравнение параллельных вычислений на Cell с «традиционными» подходами
SMP-узел
+ потоки (OpenMP, PThreads, …)
Кластер + библиотека MPI
Узел на
базе процессоров Cell
Слайд 23
Сравнение параллельных вычислений на Cell с «традиционными» подходами
SMP-узел
+ потоки (OpenMP, PThreads, …)
На одном узле работают несколько
потоков исполнения
Данные одинаково доступны всем потокам
Каждый поток выполняет свою часть работы над общими данными
0
1
2
3
Данные обрабатываются в том месте, где они хранятся
4-core SMP
Слайд 24
Кластер + библиотека MPI
На каждом узле работает один
или несколько процессов
Данные распределены по процессам
Каждый процесс выполняет свою
часть работы над своими данными
Процессы обмениваются сообщениями
Сравнение параллельных вычислений на Cell с «традиционными» подходами
Данные обрабатываются в том месте, где они хранятся
C
L
U
S
T
E
R
Слайд 25
Сравнение параллельных вычислений на Cell с «традиционными» подходами
Узел
на базе процессоров Cell
На ядре PPE работает главный поток
На
ядрах SPE работают вычислительные потоки
копируют блоки данных из общей памяти в локальную память ядра
производят вычисления над данными в локальной памяти
копируют результаты в общую память
PPE
SPE
Для обработки данные необходимо скопировать в локальную память ядер SPE
Слайд 26
PPE
Function offload model
{…
matrix a, b, c;
multiply(a, b, c);
}
SPE
multiply()
{
…
}
mul()
{ … }
Статическое или динамическое распределение подзадач
Модели программирования процессора
Cell
Слайд 27
SPE
SPE
SPE
SPE
PPE
Портфель задач
work() { … }
work() { … }
work()
{ … }
work() { … }
Task
Task
Task
Task
Task
Task
main()
{ …
AddTask();
…
}
Task
Очередь
задач
Модели программирования процессора Cell
Слайд 28
SPE
SPE
SPE
SPE
PPE
Потоковый конвейер
step1() { … }
step2() { … }
step4()
{ … }
step3() { … }
Input
data
Output
data
main()
{ …
make_input();
…
get_output();
…
}
Модели программирования процессора Cell
Слайд 29
Взаимодействующие процессы с общей памятью
SPE
PPE
SPE
SPE
SPE
SPE
SPE
SPE
SPE
Общая память
Модели программирования процессора
Cell
Слайд 30
Взаимодействующие процессы с распределенной памятью
SPE
PPE
SPE
SPE
SPE
SPE
SPE
SPE
SPE
Память PPE
Модели программирования процессора
Cell
Слайд 31
План
Архитектура процессора Cell
Принципы программирования
Базовые средства программирования
Создание и компиляция
простых программ
Механизмы передачи данных и сообщений
Программирование вычислений на SPE
Библиотеки
Слайд 32
Библиотека libspe2
LibSPE предоставляет интерфейс к базовым средствам программирования
процессора Cell, реализованным аппаратно.
Разработка программы:
Создается отдельная программа для PPE,
Создается
отдельная программа для SPE,
PPE-программа запускает SPE-программу,
SPE-программа может вызвать callback-функцию вызвавшей ее PPE-программы.
Слайд 33
Библиотека 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;
}
Слайд 34
Библиотека 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
Слайд 35
Создание параллельной программы для Cell:
В программе на PPE
создать несколько параллельных потоков,
В потоках запустить программы на SPE.
main()
{
…
…
…
…
}
thread_func() { … }
thread_func() { … }
thread_func() { … }
pthread_create()
main() { … }
main() { … }
main() { … }
SPE
SPE
SPE
run()
PPE
Библиотека libspe2:
Многопоточная программа «Hello, World!»
Слайд 36
Программа для 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
// Параллельная часть
for (i=0;i return 0;
}
Библиотека libspe2:
Многопоточная программа «Hello, World!»
Слайд 37
План
Архитектура процессора Cell
Принципы программирования
Базовые средства программирования
Создание и компиляция
простых программ
Механизмы передачи данных и сообщений
Программирование вычислений на SPE
Библиотеки
Слайд 38
DMA-передача – блок данных до 16 KB:
Операция Get: общая
память ? память SPE
Операция Put: память SPE ? общая память
Mailbox-ы
– очереди 32-битных сообщений:
SPE in (4)
SPE out (1)
SPE out interrupt (1)
Сигналы – 32-битные сообщения:
Только к SPE
Механизмы передачи данных и сообщений
Слайд 39
DMA-передача данных
Может запускаться и на PPE, и на
SPE
Общее адресное пространство
SPE
SPE
SPE
SPE
Механизмы передачи данных и сообщений
Слайд 40
DMA-передача данных
Может запускаться и на PPE, и на
SPE
Общее адресное пространство
SPE
SPE
SPE
SPE
Механизмы передачи данных и сообщений
Слайд 41
DMA-передача данных
Может запускаться и на PPE, и на
SPE
Общее адресное пространство
SPE
SPE
SPE
SPE
Механизмы передачи данных и сообщений
Слайд 42
DMA-передача данных
Блоки данных должны быть выровнены в памяти
по границе 16 байт.
Размер передаваемых данных может быть 1,2,4,8,16
или 16*N байтов.
Для идентификации группы DMA-передач используются 5-битные DMA-тэги.
Тэг позволяет проверить статус или дождаться завершения соответствующей группы DMA-передач.
Механизмы передачи данных и сообщений
Слайд 43
DMA-передача данных
Чтобы упорядочить выполнение передач, используются специальные варианты
команд get и put:
Barrier: getb, putb
Fence: getf, putf
Механизмы передачи данных и
сообщений
время
Слайд 44
Программа для SPE
// GET: Передача данных из PPE
в SPE
void get (void *dest_lsa, unsigned long long sour_ea,
unsigned long size)
{
int tag=mfc_tag_reserve(), mask=1<
mfc_get (dest_lsa, sour_ea, size, tag, 0, 0); // запуск передачи данных
mfc_write_tag_mask (mask);
mfc_read_tag_status_any(); // ожидание завершения передачи
mfc_tag_release(tag);
}
// PUT: Передача данных из SPE в PPE
void put (void *sour_lsa, unsigned long long dest_ea, unsigned long size)
{
int tag=mfc_tag_reserve(), mask=1<
mfc_put (sour_lsa, dest_ea, size, tag, 0, 0); // запуск передачи данных
mfc_write_tag_mask (mask);
mfc_read_tag_status_any(); // ожидание завершения передачи
mfc_tag_release();
}
Библиотека libspe 2.0:
Пример передачи данных DMA
Слайд 45
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
Механизмы передачи данных
и сообщений
Слайд 46
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
Механизмы передачи данных и сообщений
Слайд 47
Фрагмент программы для 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
…
Библиотека libspe 2.0:
Программа «Ping-pong»
Слайд 48
Локальная память SPE отображается в общее адресное пространство.
Обращение
SPE к заданному участку адресного пространства позволяет обращаться к
памяти другого SPE.
Адресное пространство
SPE
SPE
spe_ls_area_get()
Передача данных между SPE
Слайд 49
Регистры mailbox-ов и сигналов SPE отображаются в общее
адресное пространство.
Запись/чтение заданного элемента адресного пространства позволяет одному SPE
отправлять и получать сообщения другого SPE.
Адресное пространство
SPE
SPE
spe_ps_area_get()
put
get
Передача сообщений между SPE
Слайд 50
План
Архитектура процессора Cell
Принципы программирования
Базовые средства программирования
Создание и компиляция
простых программ
Механизмы передачи данных и сообщений
Программирование вычислений на SPE
Библиотеки
Слайд 51
Все регистры SPE векторные длиной 16 байт.
Все арифметические
инструкции являются параллельными по данным и работают с векторами.
Скалярные
операции выполняются путем соответствующего использования векторных команд.
Скалярные аргументы, необходимые некоторым инструкциям, располагаются в «предпочтительных» позициях вектора:
Программирование вычислений на SPE
Слайд 52
Локальная память SPE
Объем локальной памяти для данных и
кода: 256 KB
Чтение и запись локальной памяти всегда выполняется
выровненными блоками размером 16 байт:
Если адрес не выровнен, он автоматически округляется до 16 байт
Защита памяти отсутствует
Можно свободно читать и писать в области данных, кода и стека
Слайд 54
Векторные типы данных
Элементы векторных типов данных выравниваются автоматически.
Элементы
других типов можно выравнивать явно:
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};
Слайд 55
Команды уровня компилятора
Для манипуляции векторными данными используются intrinsics
– встроенные в компилятор команды:
Специальные (specific) – отображаются в
одну инструкцию процессора,
Например: d = si_to_int(a);
Обобщенные (generic) – отображаются в одну или несколько инструкций процессора в зависимости от входных параметров,
Например: c = spu_add (a, b);
Составные (built-ins) – последовательности обобщенных и специальных intrinsics (объединенные для удобства).
Например, команды DMA-передачи.
Слайд 56
Операции над векторами
Арифметические операции над элементами векторов:
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.
Слайд 57
Операции над векторами
Операции преобразования скалярных и векторных данных:
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);
…
Слайд 58
Операции над векторами
Операции для манипулирования элементами векторов:
Сдвиг, вращение
элементов
d = spu_rl(a, count);
d = spu_sl(a, count);
…
Перестановка элементов векторов
d
= spu_sel(a, b, pattern);
d = spu_shuffle(a, b, pattern);
…
Слайд 59
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 for (k=0; k {
s = spu_splats ( a[i*n+k] );
for (j=0; j { t = spu_mul (s, bv[k*n/4+j] );
cv[i*n/4+j] = spu_add ( cv[i*n/4+j], t );
}
}
}
Пример:
векторное умножение матриц
Слайд 60
Особенности векторизации вычислений
Простой пример:
for (i=0; i
Слайд 61
Особенности векторизации вычислений
Операнды должны быть приведены к одному
типу
Пример:
int a[n];
short int b[n];
for (i=0; i
a[i] + b[i];
Слайд 62
Особенности векторизации вычислений
Операнды должны быть выровнены друг относительно
друга
Слайд 63
Особенности реализации скалярных вычислений
При выполнении операции над скалярными
переменными в памяти происходит следующее:
Чтение векторов, содержащих операнды, в
регистры,
Относительное выравнивание операндов в векторах,
Выполнение операции над векторами,
Чтение вектора, содержащего результат,
Помещение результата в нужную позицию результирующего вектора,
Запись результирующего вектора в память.
Это очень долго!
Слайд 64
Оптимизация целочисленной арифметики
На SPE отсутствует 32-битное умножение.
Используйте short
int вместо int, где это возможно.
short int i,k;
for (i=0;
i for (k=0; k x[i*N+k]=i + k;
Слайд 65
Оптимизация условных переходов
Устранение условных переходов
Подсказка компилятору
Слайд 66
План
Архитектура процессора Cell
Принципы программирования
Базовые средства программирования
Создание и компиляция
простых программ
Механизмы передачи данных и сообщений
Программирование вычислений на SPE
Библиотеки
Слайд 67
Средства программирования процессоров 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
Слайд 68
Ссылки
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