X Код для використання на сайті:
Ширина px

Скопіюйте цей код і вставте його на свій сайт

X Для завантаження презентації, скористайтесь соціальною кнопкою для рекомендації сервісу SvitPPT Завантажити собі цю презентацію

Презентація на тему:
Кластери С++

Завантажити презентацію

Кластери С++

Завантажити презентацію

Презентація по слайдам:

Слайд 1

Програмування паралельних систем: кластери, багатоядерні та графічні процесори Канд. фіз.-мат. наук, доцент Єршов Сергій Володимирович Європейський Університет кафедра інформаційних систем та технологій Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 2

- * - Сучасні засоби програмування паралельних систем MPI (Message Passing Interface, інтерфейс передачі повідомлень) - стандарт програмного інтерфейсу для паралельних систем із розподіленою пам’яттю (мультикомп’ютери, кластери). Існують реалізації для мов C++, C, Fortran, Java. Open Multi-Processing (OpenMP) - стандарт програмного інтерфейсу для паралельних систем із спільною пам'яттю (багатоядерні системи). Підтримує мови C, C++, Fortran. CUDA (Compute Unified Device Architecture) – програмно-апаратна архітектура, що дозволяє здійснювати паралельні обчислення на спеціальному спрощеному діалекті мови програмування С з використанням графічних процесорів NVIDIA. Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 3

- * - Message Passing Interface (MPI) розподіляти обчислювальне навантаження, організувати інформаційну взаємодію (передачу даних) між процесорами. Вирішення всіх перерахованих питань забезпечує MPI-інтерфейс передачі даних (message passing interface) В обчислювальних системах з розподіленою пам'яттю процесори працюють незалежно один від одного. Для організації паралельних обчислень необхідно уміти: Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 4

- * - Розробка паралельних програм з використанням MPI Основи MPI Іниціализація та завершенння MPI програм структура паралельної програми, яка розроблена з використанням MPI, має наступний вигляд: #include "mpi.h" int main ( int argc, char *argv[] ) { MPI_Init ( &agrc, &argv ); MPI_Finalize(); return 0; } Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 5

- * - Область взаємодії описується спеціальною структурою - комунікатором Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 6

- * - Розробка паралельних програм з використанням MPI Основи MPI Визначення кількості та рангу процесів Як правило, виклик функцій MPI_Comm_size та MPI_Comm_rank виконується відразу після MPI_Init: #include "mpi.h" int main ( int argc, char *argv[] ) { int ProcNum, ProcRank; MPI_Init ( &agrc, &argv ); MPI_Comm_size ( MPI_COMM_WORLD, &ProcNum); MPI_Comm_rank ( MPI_COMM_WORLD, &ProcRank); MPI_Finalize(); return 0; } Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 7

- * - Розробка паралельних програм з використанням MPI Основи MPI Паралельна програма з використанням MPI #include " mpi.h " int main(int argc, char* argv[]) { int ProcNum, ProcRank, RecvRank; MPI_Status Status; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &ProcNum); MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank); if ( ProcRank == 0 ) { // Дії для процесу 0 printf ("\n Hello from process %3d", ProcRank); for ( int i=1; i < ProcNum; i++ ) { MPI_Recv(&RecvRank, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); printf("\n Hello from process %3d", RecvRank); } } else // Дії для всіх процесів, окрім процесу 0 MPI_Send(&ProcRank,1,MPI_INT,0,0,MPI_COMM_WORLD); // Завершення роботи MPI_Finalize(); return 0; } Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 8

- * - Форми обміну повідомленнями Двоточковий обмін (point-to-point) Односторонній обмін Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 9

- * - Блокуючий обмін повідомленнями процес 1 процес 2 БЛОКУВАННЯ БЛОКУВАННЯ “КВИТАНЦІЯ” Send(buf, 2) Recv(buf, 1) ЧАС Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 10

- * - Неблокуючий обмін повідомленнями процес 1 процес 2 Send(buf, 2) Recv(buf, 1) ЧАС Test(1)->false Test(1)->false Test(1)->false Test(1)->true Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 11

- * - Розробка паралельних програм з використанням MPI Знайомство з колективними операціями передачі даних Передача даних від одного процесу всім процесам програми Функція MPI_Bcast здійснює розсилку даних з буфера buf, що містить count елементів типу type з процесу, який має номер root, всім процесам, що входять в комунікатор comm Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 12

- * - Розробка паралельних програм з використанням MPI Знайомство з колективними операціями передачі даних Передача даних від всіх процесів одному процесу Процедура збору і подальшого підсумовування даних - приклад часто виконуваної колективної операції передачі даних від всіх процесів одному процесу, у якій над збираними значеннями здійснюється обробка даних. Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 13

- * - Приклад: Обчислення числа Значення числа може бути отримано за допомогою інтеграла Для чисельного інтегрування застосуємо метод прямокутників Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 14

- * - Розподілимо обчислення між p процесорами (циклічна схема) Отримувані на окремих процесорах часткові суми мають бути підсумовані Приклад: Обчислення числа - Процесор 0 - Процесор 1 - Процесор 2 Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 15

- * - #include "mpi.h" #include double f(double a) { return (4.0 / (1.0 + a*a)); } int main(int argc, char *argv) { int ProcRank, ProcNum, done = 0, n = 0, i; double PI25DT = 3.141592653589793238462643; double mypi, pi, h, sum, x, t1, t2; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&ProcNum); MPI_Comm_rank(MPI_COMM_WORLD,&ProcRank); while (!done ) { // основний цикл обчислень if ( ProcRank == 0) { printf("Enter the number of intervals: "); scanf("%d",&n); t1 = MPI_Wtime(); } Приклад: Обчислення числа Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 16

- * - Приклад: Обчислення числа MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); if (n > 0) { // обчислення локальних сум h = 1.0 / (double) n; sum = 0.0; for (i = ProcRank + 1; i

Слайд 17

- * - Час Тенденції розвитку сучасних процесорів О П О П О П О П О П О П Потік Потік Час О П О П О П Потік 1 О П О П О П О П О П О П О П О П О П Потік 2 Потік 3 Потік 4 В - обчислення П - доступ до пам’яті Chip MultiThreading збільшили продуктивність процесора в 2 рази Потік (“thread”) – це легковагий процес, що має з іншими потоками спільні ресурси, в тому числі спільну оперативну пам'ять. Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 18

- * - Intel Xeon серії 5600 (Nehalem) X5680 6 ядер @ 3,33 ГГц, 12 потоків, 12 МБ L3 Cache X5677 4 ядра @ 3,46 ГГц, 8 потоків, 12 МБ L3 Cache Intel® Turbo Boost Intel® Hyper-Threading Intel® QuickPath Intel® Intelligent Power Тенденції розвитку сучасних процесорів Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 19

- * - Переваги використання OpenMP замість MPI для багатоядерних процесорів Можливість інкрементального розпаралелювання Спрощення програмування і ефективність на нерегулярних обчисленнях, що проводяться над спільними даними Ліквідація дублювання даних в пам'яті, що властиве MPI-програмам Останніми роками спостерігається тенденція до скорочення обсягу оперативної пам'яті, що виділяється на одне ядро. Властива OpenMP економія пам’яті стає дуже важливою. Наявність локальних КЕШів (і/або таких, що розділяються ядрами) враховуватиметься при оптимізації OpenMP-програм компіляторами, що не можуть робити компілятори послідовних мов для MPI-процесів. Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 20

- * - Виконання OpenMP-програми Fork-Join паралелізм: Головний (master) потік породжує групу (team) потоків за мірою необхідності. Паралелізм додається інкрементально. Паралельні області Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 21

- * - 001 Модель пам’яті в OpenMP Потік 001 Потік 001 Потік Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 22

- * - 001 Модель пам’яті в OpenMP Потік 0 001 Потік 1 static int i = 0; … = i + 1; i = i + 1; i = 0 i = 1 … = i + 2; // ? #pragma omp flush (i) #pragma omp flush (i) i = 1 i = 1 Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 23

- * - Класи перемінних double Array1[100]; int main() { int Array2[100]; #pragma omp parallel { int iam = omp_get_thread_num(); work(Array2, iam); printf(“%d\n”, Array2[0]); } } extern double Array1[100]; void work(int *Array, int iam) { double TempArray[100]; static int count; ... } TempArray,iam TempArray,iam TempArray, iam Array1, Array2, count Array1, Array2, count Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 24

- * - #include int main () { int n =100000, i; double pi, h, sum, x; h = 1.0 / (double) n; sum = 0.0; #pragma omp parallel for reduction(+:sum) private(x) for (i = 1; i

Слайд 25

- * - Використання директиви task typedef struct node node; struct node { int data; node * next; }; void increment_list_items(node * head) { #pragma omp parallel { #pragma omp single { node * p = head; while (p) { #pragma omp task process(p); p = p->next; } } } } Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 26

- * - Програмна модель CUDA Масштабованість на десятки ядер, сотні паралельних потоків Дозволяє сфокусуватися на розробці паралельних алгоритмів – А не внутрішніх засобах мови програмування Підтримує гетерогенні обчислення –CPU для послідовного коду, GPU – для паралельного Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 27

- * - Масивно-паралельні системи на основі архітектури CUDA Мультипроцесор Tesla 10 Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 28

- * - Масивно-паралельні системи на основі архітектури CUDA Interconnection Network ROP L2 ROP L2 ROP L2 ROP L2 ROP L2 ROP L2 ROP L2 ROP L2 DRAM DRAM DRAM DRAM DRAM DRAM DRAM DRAM CPU Bridge Host Memory Архітектура Tesla 10 Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 29

- * - Програмна модель CUDA GPU (device) - це обчислювальний пристрій, який: Є співпроцесором до CPU (host) Має власну пам'ять (DRAM) Виконує одночасно дуже багато ниток Паралельна частина коду виконується як велика кількість потоків Потоки групуються в блоки фіксованого розміру Блоки об'єднуються в сітку блоків Ядро виконується на сітці з блоків Кожний потік і блок мають свій ідентифікатор Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 30

- * - Програмна модель CUDA Десятки тисяч потоків for (int ix = 0; ix < nx; ix++) { pData[ix] = f(ix); } for (int ix = 0; ix < nx; ix++) for (int iy = 0; iy < ny; iy++) { pData[ix + iy * nx] = f(ix) * g(iy); } for (int ix = 0; ix < nx; ix++) for (int iy = 0; iy < ny; iy++) for (int iz = 0; iz < nz; iz++) { pData[ix + (iy + iz * ny) * nx] = f(ix) * g(iy) * h(iz); } Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 31

- * - Програмна модель CUDA Потоки в CUDA об’єднуються в блоки: Можлива 1D, 2D, 3D топологія блоку Загальна кількість потоків в блоці є обмежена У сучасному HW це 512 потоків Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 32

- * - Програмна модель CUDA Потоки в одному блоці можуть розділяти ресурси зі своїми сусідами float g_Data[gN]; for (int ix = 0; ix < nx; ix++) { pData[ix] = f(ix, g_Data[ix / n]); } Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 33

- * - Програмна модель CUDA Блоки потоків об’єднуються в сітку (grid) потоків Можлива 1D, 2D топологія сітки блоків потоків Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 34

- * - Синтаксис CUDA CUDA – це розширення мови C [+] специфікатори для функцій та перемінних [+] нові вбудовані типи [+] вбудовані перемінні (усередині ядра) [+] директива для запуску ядра з C коду Як скомпілювати CUDA код [+] nvcc компілятор [+] .cu розширення файлу Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 35

- * - Синтаксис CUDA Порівняємо код для CPU з кодом CUDA kernel: __global__ void incKernel ( float * pData ) { int idx = blockIdx.x * blockDim.x + threadIdx.x; pData [idx] = pData [idx] + 1.0f; } float * pData; for (int ix = 0; ix < nx; ix++) { pData[ix] = pData[ix] + 1.0f; } nx = 2048 У блоці 256 потоків кількість блоків = 2048 / 256 = 8 [ 0 .. 7 ] [ == 256] [ 0 .. 255 ] Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 36

- * - Синтаксис CUDA. Директиви запуску ядра Як запустити ядро із загальною кількістю потоків, що дорівнює nx? incKernel ( pData ); dim3 threads(256, 1, 1); dim3 blocks(nx / 256, 1); float * pData; > кутові дужки, усередині яких задаються параметри запуску ядра: Кількість блоків в сітці Кількість потоків у блоці … Неявно припускаємо, що nx кратне 256 Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 37

- * - Типи пам’яті в CUDA Тип пам’яті Доступ Рівень виділення Швидкість роботи Регістри R/W Per-thread Висока (on-chip) Локальна R/W Per-thread Низька (DRAM) Shared R/W Per-block Висока (on-chip) Глобальна R/W Per-grid Низька (DRAM) Constant R/O Per-grid Висока (L1 cache) Texture R/O Per-grid Висока (L1 cache) Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 38

- * - Множення матриць в CUDA #define BLOCK_SIZE 16 __global__ void matMult (float* a, float* b, int n, float* c) { int bx = blockIdx.x; int by = blockIdx.y; int tx = threadIdx.x; int ty = threadIdx.y; float sum = 0.0f; int ia = n * BLOCK_SIZE * by + n * ty; int ib = BLOCK_SIZE * bx + tx; int ic = n * BLOCK_SIZE * by + BLOCK_SIZE * bx; for ( int k = 0; k < n; k++ ) sum += a [ia + k] * b [ib + k*n]; c [ic + n * ty + tx] = sum; } Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 39

- * - Множення матриць в CUDA int numBytes = N * N * sizeof ( float ); float * adev, * bdev, * cdev ; dim3 threads ( BLOCK_SIZE, BLOCK_SIZE ); dim3 blocks ( N / threads.x, N / threads.y); cudaMalloc ( (void**)&adev, numBytes ); // allocate DRAM cudaMalloc ( (void**)&bdev, numBytes ); // allocate DRAM cudaMalloc ( (void**)&cdev, numBytes ); // allocate DRAM // copy from CPU to DRAM cudaMemcpy ( adev, a, numBytes, cudaMemcpyHostToDevice ); cudaMemcpy ( bdev, b, numBytes, cudaMemcpyHostToDevice ); matMult ( adev, bdev, N, cdev ); cudaThreadSynchronize(); cudaMemcpy ( c, cdev, numBytes, cudaMemcpyDeviceToHost ); // free GPU memory cudaFree ( adev ); cudaFree ( bdev ); cudaFree ( cdev ); Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 40

- * - Актуальні засоби програмування паралельних систем MPI (Message Passing Interface, інтерфейс передачі повідомлень) - стандарт програмного інтерфейсу для паралельних систем із розподіленою пам’яттю (мультикомп’ютери, кластери). Open Multi-Processing (OpenMP) - стандарт програмного інтерфейсу для паралельних систем із спільною пам'яттю (багатоядерні системи). CUDA (Compute Unified Device Architecture) – програмно-апаратна архітектура, що дозволяє здійснювати паралельні обчислення з використанням графічних процесорів NVIDIA. Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Слайд 41

- * - Запитання? Єршов С.В. Online лекція заняття курсів з підвищення кваліфікації © 2011 ЄУ

Завантажити презентацію

Презентації по предмету Інформатика