Unified Parallel C (UPC) - розширення мови програмування С, призначене для високопродуктивних обчислень на масштабних паралельних комп'ютерах, в тому числі на SMP/NUMA системах з загальною пам'яттю (єдиним адресним простором) і з розподіленою пам'яттю (наприклад, на кластерах). Програмісту надається доступ до всього глобального розділеного адресного простору (PGAS), збережені в ньому змінні можуть читатися і змінюватися будь-яким процесором. При цьому кожне значення зберігається у фізичній пам'яті одного з процесорів. UPC використовує модель SPMD (Single Program Multiple Data) в якій ступінь паралелізму фіксується при запуску програми, зазвичай на рівні один потік виконання на ядро процесора.
Для вираження паралелізму UPC додає до ISO C 99 конструкції: Явну паралельну модель виконання; Загальний (поділений) адресний простір; Примітиви синхронізації і модель консистентності пам'яті; Примітиви управління пам'яттю. На UPC значно вплинули три більш ранніх паралельних розширення: ISO C 99: AC, , і Parallel C Preprocessor (PCP). UPC не є їхньою надбудовою, а скоріше спробою об'єднати кращі їх сторони. UPC комбінує зручність програмування в парадигмі загальної пам'яті, рівень контролю за розподілом даних і продуктивності парадигми передачі повідомлень. Підтримується на різних HPC платформах.
UPC доволі простий в програмуванні, особливо для С-програмістів та порівнянні с іншими парадигмами паралельного програмування (MPI, Charm++). Продуктивність UPC схожа з MPI.
Вручну оптимізований код с блоковими пересилками даних, все ж значно простіше, ніж MPI. Мова і середовище виконання (runtime) беруть на себе рутинну роботу по комунікації.
Особливості UPC
Філософія Філософія мови схожа на С: Багато можливостей; Потребує акуратності.
Реалізації Існують різні реалізації стандарту UPC: UPC @ GWU - розробляють стандарт http://upc.gwu.edu ; Berkeley UPC; UPC @ MTU; UPC @ Florida; GCC UPC. Доступні засоби розробки і налагодження: TotalView; Eclipse Parallel Tools Platform.
Основні елементи 1) Два типи змінних: Private (за замовчуванням ); Shared (спеціальна директива). 2) Shared масиви і розподіл даних по процесорам;
3) Розподіл обчислень по процесорам;
4) Синхронізація і забезпечення консистентності пам'яті; Бар'єри; М'ютекси (locks).
Модель виконання Декілька потоків виконують одну і ту ж програму, але обробляють різні дані (SPMD): Подібно MPI; Немає неявної синхронізації; MYTHREAD - номер даного потоку, THREADS - загальна кількість потоків; Число потоків може задаватися під час компіляції, так і під час виконання (подібно mpirun - np N) Синхронізація застосовується тільки тоді, коли це необхідно: Бар'єри; Блокування (Locks); Контроль консистентності пам'яті.
Модель представлення пам'яті Пам'ять розподілена між потоками, частина цієї пам'яті є локальною і доступна тільки потоку - власнику, інша частина пам'яті — глобальна (доступна для всіх потоків).
Управління розподілом даних
Приклади:shared int x; /* will have affinity to thread 0 */ shared int y[THREADS]; int z;
THREADS = 3 /* нехай буде 3 потоки */ sharedintA[THREADS];
Блоковий розподіл даних (за замовчуванням розмір блоку 1) shared [block - size ] type array[N];
Приклад: shared int A [THREADS]; THREADS = 4;
Матричне множення // vect_mat_mult.c #include<upc_relaxed.h> shared[THREADS] int a[THREADS][THREADS]; shared int b[THREADS], c[THREADS]; void main (void){ nt i, j; upc_forall( i = 0 ; i < THREADS ; i++; i){ c[i] = 0; for( j=0 ; j< THREADS ; j++) c[i] += a[i][j]*b[j];
Приклад паралельного скалярного множення Приклад:http://upc.gwu.edu/tutorials/UPC-SC05.pdf slide 21# include <upc_relaxed.h> # define N 1000 * THREADS
shared float A[N], B[N]; shared float MUL[N];
void scalar_mul_a_b() { int i; upc_forall(i = 0; i < N; i++; i) MUL[i] = A[i] * B[i]; }
Розпаралелювання циклів
Синтаксис upc_forall (init; test; loop; affinity)
statyment
Семантика Ітерації циклу виконуються в потоках відповідно до локалізації параметра "affinity"; affinity - цілочисельний вираз або посилання на загальний об'єкт.
Приклад shared int a , b, c; int i; upc_forall (i = 0; i<100; i++; a[i]) a[i] = b[i] * c[i];
Службові операції Отримання розміру локальної частини глобального об'єкта:upc_localsizeof (type-name or expression);Отримання розміру блока глобального об'єкта:upc_blocksizeof ( type - name or expression); Отримання розміру елемента глобального об'єкта:upc_elemsizeof ( type - name or expression);
Операції копіювання і ініціалізації Копіювання з загальної пам'ять в загальнуupc_memcpy (dst, src, size)Копіювання з локальної пам'яті в загальнуupc_memput (dst, src, size)Копіювання з загальної пам'яті в локальнуupc_memget (dst, src, size)Ініціалізація загальної пам'ятіupc_memset (dst, src, size)Використовуваний блок загальної пам'яті повинен бути безперервним і належати одному і тому ж потоку!
Динамічний розподіл пам'яті Динамічний розподіл пам'яті можливий для загальної пам'яті; Операції виділення пам'яті можуть бути, як колективними, так і локальними для потоків ( префікс колективних операцій - all ).
Синтаксис shared void *upc_all_alloc ( size_t nblocks, size_t nbytes );
Семантика Виділення загальної (глобальної) пам'яті; block_size - розмір блока, nblocks - кількість блоків; Результат виділення пам'яті відповідає дійсності:shared[nbytes] char[nblocks* nbytes] Дана операція виділення пам'яті є колективною. Виділення загальної пам'яті тільки для поточного потоку, виконується за допомогою функції upc_global_alloc.
Джерела
Посилання upc.gwu.edu — офіційний сайт Unified Parallel C; http://upc.gwu.edu/tutorials/tutorials_sc2003.pdf - Programming in the Partitioned Global Address Space Model; www.hpcc.unn.ru/file.php?id=316 - мова паралельного програмування UPC; https://web.archive.org/web/20161201080207/http://school-2010.hpc-russia.ru/files/lectures/lecture_120710_fedulova.pdf - паралельне програмування з використанням Unified Parallel C; http://upc.gwu.edu/tutorials/UPC-SC05.pdf - High Performance Parallel Programming with Unified Parallel C (UPC).
__ІНДЕКС__