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).

__ІНДЕКС__