SlideShare a Scribd company logo
1 of 27
Download to read offline
Семинар 5
Стандарт OpenMP (часть 5)
Михаил Курносов
E-mail: mkurnosov@gmail.com
WWW: www.mkurnosov.net
Цикл семинаров «Основы параллельного программирования»
Институт физики полупроводников им. А. В. Ржанова СО РАН
Новосибирск, 2015 CC-BY
Локальность ссылок в программах
 Локальность ссылок (locality of reference) –
свойство программ повторно (часто) обращаться
к одним и тем же адресам в памяти
 Временная локализация (temporal locality) –
повторное обращение к одному и тому же адресу
через короткий промежуток времени
 Пространственная локализация ссылок
(spatial locality) – свойство программ повторно
обращаться через короткий промежуток времени
к адресам близко расположенным в памяти друг
к другу
for (i = 0; i < n; i += 32)
v[i] += f(i);
for (i = 0; i < n; i += 32)
s += v[i];
for (i = 0; i < n; i++)
c[i] = x[i] + y[i];
int sumvec1(int v[N])
{
int i, sum = 0;
for (i = 0; i < N; i++)
sum += v[i];
return sum;
}
int sumvec2(int v[N])
{
int i, sum = 0;
for (i = 0; i < N; i += 6)
sum += v[i];
return sum;
}
Address 0 4 8 12 16 20
Value v[0] v[1] v[2] v[3] v[4] v[5]
Step 1 2 3 4 5 6
Структура (шаблон) доступа к массиву (Reference pattern)
stride-1 reference pattern (good locality)
Address 0 24 48 72 96 120
Value v[0] v[6] v[12] v[18] v[24] v[30]
Step 1 2 3 4 5 6
stride-6 reference pattern
Локальность ссылок в программах
Иерархическая организация памяти
Регистры процессора
(Processor registers)
Кэш-память
(Cache memory)
TLBs caches, paging-structure caches
Внешняя память (HDD, SSD, …)
Время
доступа
Размер
памяти
L1 Cache
L2 Cache
…
Оперативная память
(Random Memory Access)
Ln Cache
Страничная организация памяти
# Load from memory
movq (%rax), %rbx
Segmentation
Paging
MemoryManagementUnit
(MMU)
Logical address
Linear address
Physical address
TLBs
Paging-structure caches
Processor caches
DRAM
Logical processor
 Адресное пространство процесса
разбито на страницы (pages)
 За каждой используемой страницей
виртуальной памяти процесса
закреплена страница физической
памяти (page frame)
 Размер страницы 4 KiB
(зависит от архитектуры CPU и ОС)
 Программы оперируют линейными
адресами (linear address)
 Процессор работает с физическими
адресами (physical address)
Структурная организация кеш-памяти
Randal E. Bryant, David R. O'Hallaron. Computer Systems: A Programmer's Perspective. - Addison-Wesley, 2010
Phys. addr. Множественно-ассоциативная
кеш-память
 Кеш содержит S = 2s
множеств (sets)
 Каждое множество содержит
E строк/записей (cache lines)
 Каждая строка содержит поля
valid bit, tag (t бит) и блок данных
(B = 2b
байт)
 Данные между кеш-памятью
и оперативной памятью
передаются блоками по B байт
(cache lines)
 «Полезный» размер кеш-памяти
C = S * E * B
Tag
Tag
Tag
Tag
Tag
Tag
Загрузка данных из памяти (load/read)
Randal E. Bryant, David R. O'Hallaron. Computer Systems: A Programmer's Perspective. - Addison-Wesley, 2010
Phys. addr.
1. Выбирается одно из S множеств (по полю Set index)
2. Среди E записей множества отыскивается строка с требуемым полем Tag и установленным битом Valid
(нашли – cache hit, не нашли – cache miss)
3. Данные из блока считываются с заданным смещением Block offset
12 3
В случае промаха (cache miss)
из памяти в кеш загружается
строка (даже если требовался
всего один байт)
Замещение записей кеш-памяти
Размер кеш-памяти
значительно меньше
объема оперативной
памяти
Некоторые адреса
памяти отображаются
на одни и те же строки
кеш-памяти
Алгоритмы замещения записей кеш-памяти
 Алгоритмы замещения (Replacement policy) требуют хранения вместе с каждой
строкой кеш-памяти специализированного поля флагов/истории
 LRU (Least Recently Used) – вытесняется строку, неиспользованную дольше всех
 MRU (Most Recently Used) – вытесняет последнюю использованную строку
 Алгоритм L. Belady – вытесняет запись, которая с большой вероятностью не
понадобиться в будущем
 RR (Random Replacement) – вытесняет случайную строку
 …
Cache memory
(fast)
Reg
file
Запись данных в кеш-память
CPU
Main memory
(slow)
32-bit
%eax
Data block
Data blockTag Flag
Cache line
(~64 bytes)
// Write from register to memory
movl %eax, (%rbx)
?
 Политики записи (write policy) определяют:
 Когда данные должны быть переданы из кеш-памяти в оперативную память
 Как должна вести себя кеш-память при событии «write miss» – запись отсутствует
в кеш-памяти
Алгоритмы записи в кеш-память (write policy)
11
Политика поведения кеш-памяти в ситуации
“write hit” (запись имеется в кеш-памяти)
 Политика write-through (сквозная запись) – каждая запись в кеш-память влечет за собой
обновление данных в кеш-памяти и оперативной памяти (кеш “отключается” для записи)
 Политика write-back (отложенная запись, copy-back) – первоначально данные записываются
только в кеш-память
 Все измененные строки кеш-памяти помечаются как “грязные” (dirty)
 Запись в память “грязных” строк осуществляется при их замещении или специальному
событию (lazy write)
 Внимание: чтение может повлечь за собой запись в память
 При чтении возник cache miss, данные загружаются из кеш-памяти верхнего уровня (либо DRAM)
 Нашли строку для замещения, если флаг dirty = 1, записываем её данные в память
 Записываем в строку новые данные
GNU/Linux CPU Cache Information (/proc)
$ cat /proc/cpuinfo
processor : 0
...
model name : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
stepping: 7
microcode : 0x29
cpu MHz : 2975.000
cache size : 3072 KB
physical id : 0
siblings: 4
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
...
bogomips: 4983.45
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
Вычислительный узел кластера Oak
$ cat /proc/cpuinfo
model name : Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
$ cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size
64
Анализ /sys/devices/system/cpu/cpuX/cache/
 L1 Data cache: 32K, set associative cache — sets 64, ways — 8
 L1 Instruction cache: 32K, set associative cache — sets 128, ways — 4
 L2 Unified cache: 256K, set associative cache — sets 512, ways — 8
 L3 Unified cache: 12288K, set associative cache — sets 12288, ways — 16
Умножение матриц (DGEMM)
int main(int argc, char **argv)
{
double gflop = 2.0 * N * Q * M * 1E-9;
double *a, *b, *c1, *c2;
// Launch naive verstion
a = malloc(sizeof(*a) * N * M);
b = malloc(sizeof(*b) * M * Q);
c1 = malloc(sizeof(*c1) * N * Q);
srand(0);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++)
a[i * M + j] = rand() % 100;
}
for (int i = 0; i < M; i++) {
for (int j = 0; j < Q; j++)
b[i * Q + j] = rand() % 100;
}
double tdef = wtime();
dgemm_def(a, b, c1, N, M, Q);
tdef = wtime() - tdef;
printf("Execution time (naive): %.6fn", tdef);
printf("Performance (naive): %.2f GFLOPSn", gflop / tdef);
free(b);
free(a);
return 0;
}
Умножение матриц (DGEMM Naive)
enum {
N = 100, M = 200, Q = 300
};
/*
* dgemm_def: Naive matrix multiplication C[n, q] = A[n, m] * B[m, q].
* FP ops = 2*n*q*m.
*/
void dgemm_def(double *a, double *b, double *c, int n, int m, int q)
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < q; j++) {
double s = 0.0;
for (int k = 0; k < m; k++)
s += a[i * m + k] * b[k * q + j];
c[i * q + j] = s;
}
}
}
Число операций над числами
с плавающей запятой (FLOP)
2 * N * Q * M
Умножение матриц (DGEMM Naive)
enum {
N = 100, M = 200, Q = 300
};
/*
* dgemm_def: Naive matrix multiplication C[n, q] = A[n, m] * B[m, q].
* FP ops = 2*n*q*m.
*/
void dgemm_def(double *a, double *b, double *c, int n, int m, int q)
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < q; j++) {
double s = 0.0;
for (int k = 0; k < m; k++)
s += a[i * m + k] * b[k * q + j];
c[i * q + j] = s;
}
}
}
a[n, m] b[m, q]
Прыжки через строку
Cache miss!
Load a[0][0] — cache miss
Load b[0][0] — cache miss
Load a[0][1] — cache hit
Load b[1][0] — cache miss
Load a[0][1] — cache hit
Load b[2][0] — cache miss
Load a[0][2] — cache hit
Load b[2][0] — cache miss
...
Умножение матриц (DGEMM Opt.)
/*
* dgemm_opt: Matrix multiplication C[n, q] = A[n, m] * B[m, q].
*
*/
void dgemm_opt(double *a, double *b, double *c, int n, int m, int q)
{
for (int i = 0; i < n * q; i++)
c[i] = 0;
for (int i = 0; i < n; i++) {
for (int k = 0; k < m; k++) {
for (int j = 0; j < q; j++)
c[i * q + j] += a[i * m + k] * b[k * q + j];
}
}
}
a[n, m] b[m, q]
Обращение
по смежным адресам
Load a[0][0] — cache miss
Load b[0][0] — cache miss
Load a[0][1] — cache hit
Load b[0][1] — cache hit
Load a[0][1] — cache hit
Load b[0][1] — cache hit
Load a[0][2] — cache hit
Load b[0][2] — cache hit
...
Анализ производительности DGEMM (Naive vs Opt.)
Вычислительный узел кластера Oak
 8 ядер (два Intel Quad Xeon E5620)
 24 GiB RAM (6 x 4GB DDR3 1067 MHz)
 CentOS 6.5 x86_64
Дальнейшие оптимизации:
● Блочное умножение матриц
● TLB-оптимизация
● Векторизация (SSE/AVX)
● Распараллеливание (OpenMP)
● ...
1.48 GFLOPS
Анализ производительности (OpenMP-версия)
Ускорение больше линейного:
За ускорение принято отношение времени
выполнения двух разных алгоритмов
— dgemm_naive и OpenMP-версии с эффективным
доступом к элементам матрицы B
9 GFLOPS
N = Q = M = 2000
N = Q = M = 2000
Численное интегрирование (метод прямоугольников)
f(x)
x
x0
ba
x1
x2
x3
xn − 1
Формула средних прямоугольников const double a = -4.0; /* [a, b] */
const double b = 4.0;
const int nsteps = 40000000; /* n */
double func(double x)
{
return exp(-x * x);
}
double integrate(double a, double b, int n)
{
double h = (b - a) / n;
double sum = 0.0;
for (int i = 0; i < n; i++)
sum += func(a + h * (i + 0.5));
sum *= h;
return sum;
}
Численное интегрирование (метод прямоугольников)
double integrate_omp(double (*func)(double), double a, double b, int n)
{
double h = (b - a) / n;
double sum = 0.0;
double thread_sum[32];
#pragma omp parallel
{
int tid = omp_get_thread_num();
thread_sum[tid] = 0;
#pragma omp for
for (int i = 0; i < n; i++)
thread_sum[tid] += func(a + h * (i + 0.5));
#pragma omp atomic
sum += thread_sum[tid];
}
sum *= h;
return sum;
}
Локальное хранилище
для каждого потока
Численное интегрирование (метод прямоугольников)
double integrate_omp(double (*func)(double), double a, double b, int n)
{
double h = (b - a) / n;
double sum = 0.0;
double thread_sum[32];
#pragma omp parallel
{
int tid = omp_get_thread_num();
thread_sum[tid] = 0;
#pragma omp for
for (int i = 0; i < n; i++)
thread_sum[tid] +=
func(a + h * (i + 0.5));
#pragma omp atomic
sum += thread_sum[tid];
}
sum *= h;
return sum;
}
thread_sum[32]
Cache Cache
Shared memory
Протокол обеспечения когерентности кешей
MESI (Intel MESIF)
 Поток обновляет свою строку в кеш-памяти и аннулирует
строку в других кешах
 Другие кеши загружают актуальную версию строки из
оперативной памяти
 Происходит постоянное обновление строк из памяти
(кеширование «отключается»)
Ложное разделение
(false sharing)
Численное интегрирование (метод прямоугольников)
double integrate_omp_opt(double (*func)(double), double a, double b, int n)
{
double h = (b - a) / n;
double sum = 0.0;
/* Each struct occupied one cache line (64 bytes) */
struct thread_param {
double sum; /* 8 bytes */
double padding[7]; /* 56 bytes */
};
struct thread_param thread_sum[32] __attribute__ ((aligned(64)));
#pragma omp parallel
{
int tid = omp_get_thread_num();
thread_sum[tid].sum = 0;
#pragma omp for
for (int i = 0; i < n; i++)
thread_sum[tid].sum += func(a + h * (i + 0.5));
#pragma omp atomic
sum += thread_sum[tid].sum;
}
sum *= h;
return sum;
}
Каждый элемент массива будет занимать
одну строку кеш-памяти
Анализ производительности (integrate)
Вычислительный узел кластера Oak (NUMA)
 8 ядер (два Intel Quad Xeon E5620)
 24 GiB RAM (6 x 4GB DDR3 1067 MHz)
 CentOS 6.5 x86_64
Вычислительный узел кластера Jet (SMP)
 8 ядер (два Intel Quad Xeon E5420)
 8 GiB RAM
 Fedora 20 x86_64
OpenMP-версия
хуже последовательной
программы использует
кеш-память
Задание
 Разработать на OpenMP параллельную версию функции dgemm_opt —
написать код функции dgemm_opt_omp
 Провести анализ масштабируемости параллельной программы
 Шаблон программы находится в каталоге _task
 Как реализовать параллельную инициализацию матриц?
Суммирование элементов массива
int sumarray3d_def(int a[N][N][N])
{
int i, j, k, sum = 0;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
for (k = 0; k < N; k++) {
sum += a[k][i][j];
}
}
}
return sum;
}
a[0][0][0] a[0][0][1] a[0][0][2] a[0][1][0] a[0][1][1] a[0][1][2] a[0][2][0] a[0][2][1] a[0][2][2]
a[1][0][0] a[1][0][1] a[1][0][2] a[1][1][0] a[1][1][1] a[1][1][2] a[1][2][0] a[1][2][1] a[1][2][2]
a[2][0][0] a[2][0][1] a[2][0][2] a[2][1][0] a[2][1][1] a[2][1][2] a[2][2][0] a[2][2][1] a[2][2][2]
Массив a[3][3][3] хранится в памяти строка за строкой (row-major order)
Reference pattern: stride-(N*N)
Address 0
36
72
int sumarray3d_def(int a[N][N][N])
{
int i, j, k, sum = 0;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
for (k = 0; k < N; k++) {
sum += a[i][j][k];
}
}
}
return sum;
}
a[0][0][0] a[0][0][1] a[0][0][2] a[0][1][0] a[0][1][1] a[0][1][2] a[0][2][0] a[0][2][1] a[0][2][2]
a[1][0][0] a[1][0][1] a[1][0][2] a[1][1][0] a[1][1][1] a[1][1][2] a[1][2][0] a[1][2][1] a[1][2][2]
a[2][0][0] a[2][0][1] a[2][0][2] a[2][1][0] a[2][1][1] a[2][1][2] a[2][2][0] a[2][2][1] a[2][2][2]
Массив a[3][3][3] хранится в памяти строка за строкой (row-major order)
Reference pattern: stride-1
Address 0
36
72
Суммирование элементов массива

More Related Content

What's hot

Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail Kurnosov
 
Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusMikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 

What's hot (20)

Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk Plus
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 

Similar to Семинар 5. Многопоточное программирование на OpenMP (часть 5)

20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)Smolensk Computer Science Club
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2Technopark
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Ontico
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012Alex Tutubalin
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelMikhail Kurnosov
 
Язык параллельного программирования Cray Chapel
Язык параллельного программирования Cray ChapelЯзык параллельного программирования Cray Chapel
Язык параллельного программирования Cray ChapelMikhail Kurnosov
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Alex Tutubalin
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...Ontico
 
CUDA Course 2010 at MSU
CUDA Course 2010 at MSUCUDA Course 2010 at MSU
CUDA Course 2010 at MSUlarhat
 
Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)
Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)
Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)Mikhail Kurnosov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Поговорим про память
Поговорим про памятьПоговорим про память
Поговорим про памятьAndrey Akinshin
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPUMikhail Kurnosov
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
pgday17. How shared memory works in modern PostgreSQL
pgday17. How shared memory works in modern PostgreSQLpgday17. How shared memory works in modern PostgreSQL
pgday17. How shared memory works in modern PostgreSQLDmitry Kremer
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with JavaAndrei Pangin
 
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Ontico
 

Similar to Семинар 5. Многопоточное программирование на OpenMP (часть 5) (20)

20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
 
Язык параллельного программирования Cray Chapel
Язык параллельного программирования Cray ChapelЯзык параллельного программирования Cray Chapel
Язык параллельного программирования Cray Chapel
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
 
введение в Gpu
введение в Gpuвведение в Gpu
введение в Gpu
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
 
CUDA Course 2010 at MSU
CUDA Course 2010 at MSUCUDA Course 2010 at MSU
CUDA Course 2010 at MSU
 
Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)
Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)
Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Поговорим про память
Поговорим про памятьПоговорим про память
Поговорим про память
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPU
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
pgday17. How shared memory works in modern PostgreSQL
pgday17. How shared memory works in modern PostgreSQLpgday17. How shared memory works in modern PostgreSQL
pgday17. How shared memory works in modern PostgreSQL
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
 

More from Mikhail Kurnosov

Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Mikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыMikhail Kurnosov
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаMikhail Kurnosov
 

More from Mikhail Kurnosov (16)

Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 

Семинар 5. Многопоточное программирование на OpenMP (часть 5)

  • 1. Семинар 5 Стандарт OpenMP (часть 5) Михаил Курносов E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Цикл семинаров «Основы параллельного программирования» Институт физики полупроводников им. А. В. Ржанова СО РАН Новосибирск, 2015 CC-BY
  • 2. Локальность ссылок в программах  Локальность ссылок (locality of reference) – свойство программ повторно (часто) обращаться к одним и тем же адресам в памяти  Временная локализация (temporal locality) – повторное обращение к одному и тому же адресу через короткий промежуток времени  Пространственная локализация ссылок (spatial locality) – свойство программ повторно обращаться через короткий промежуток времени к адресам близко расположенным в памяти друг к другу for (i = 0; i < n; i += 32) v[i] += f(i); for (i = 0; i < n; i += 32) s += v[i]; for (i = 0; i < n; i++) c[i] = x[i] + y[i];
  • 3. int sumvec1(int v[N]) { int i, sum = 0; for (i = 0; i < N; i++) sum += v[i]; return sum; } int sumvec2(int v[N]) { int i, sum = 0; for (i = 0; i < N; i += 6) sum += v[i]; return sum; } Address 0 4 8 12 16 20 Value v[0] v[1] v[2] v[3] v[4] v[5] Step 1 2 3 4 5 6 Структура (шаблон) доступа к массиву (Reference pattern) stride-1 reference pattern (good locality) Address 0 24 48 72 96 120 Value v[0] v[6] v[12] v[18] v[24] v[30] Step 1 2 3 4 5 6 stride-6 reference pattern Локальность ссылок в программах
  • 4. Иерархическая организация памяти Регистры процессора (Processor registers) Кэш-память (Cache memory) TLBs caches, paging-structure caches Внешняя память (HDD, SSD, …) Время доступа Размер памяти L1 Cache L2 Cache … Оперативная память (Random Memory Access) Ln Cache
  • 5. Страничная организация памяти # Load from memory movq (%rax), %rbx Segmentation Paging MemoryManagementUnit (MMU) Logical address Linear address Physical address TLBs Paging-structure caches Processor caches DRAM Logical processor  Адресное пространство процесса разбито на страницы (pages)  За каждой используемой страницей виртуальной памяти процесса закреплена страница физической памяти (page frame)  Размер страницы 4 KiB (зависит от архитектуры CPU и ОС)  Программы оперируют линейными адресами (linear address)  Процессор работает с физическими адресами (physical address)
  • 6. Структурная организация кеш-памяти Randal E. Bryant, David R. O'Hallaron. Computer Systems: A Programmer's Perspective. - Addison-Wesley, 2010 Phys. addr. Множественно-ассоциативная кеш-память  Кеш содержит S = 2s множеств (sets)  Каждое множество содержит E строк/записей (cache lines)  Каждая строка содержит поля valid bit, tag (t бит) и блок данных (B = 2b байт)  Данные между кеш-памятью и оперативной памятью передаются блоками по B байт (cache lines)  «Полезный» размер кеш-памяти C = S * E * B Tag Tag Tag Tag Tag Tag
  • 7. Загрузка данных из памяти (load/read) Randal E. Bryant, David R. O'Hallaron. Computer Systems: A Programmer's Perspective. - Addison-Wesley, 2010 Phys. addr. 1. Выбирается одно из S множеств (по полю Set index) 2. Среди E записей множества отыскивается строка с требуемым полем Tag и установленным битом Valid (нашли – cache hit, не нашли – cache miss) 3. Данные из блока считываются с заданным смещением Block offset 12 3 В случае промаха (cache miss) из памяти в кеш загружается строка (даже если требовался всего один байт)
  • 8. Замещение записей кеш-памяти Размер кеш-памяти значительно меньше объема оперативной памяти Некоторые адреса памяти отображаются на одни и те же строки кеш-памяти
  • 9. Алгоритмы замещения записей кеш-памяти  Алгоритмы замещения (Replacement policy) требуют хранения вместе с каждой строкой кеш-памяти специализированного поля флагов/истории  LRU (Least Recently Used) – вытесняется строку, неиспользованную дольше всех  MRU (Most Recently Used) – вытесняет последнюю использованную строку  Алгоритм L. Belady – вытесняет запись, которая с большой вероятностью не понадобиться в будущем  RR (Random Replacement) – вытесняет случайную строку  …
  • 10. Cache memory (fast) Reg file Запись данных в кеш-память CPU Main memory (slow) 32-bit %eax Data block Data blockTag Flag Cache line (~64 bytes) // Write from register to memory movl %eax, (%rbx) ?  Политики записи (write policy) определяют:  Когда данные должны быть переданы из кеш-памяти в оперативную память  Как должна вести себя кеш-память при событии «write miss» – запись отсутствует в кеш-памяти
  • 11. Алгоритмы записи в кеш-память (write policy) 11 Политика поведения кеш-памяти в ситуации “write hit” (запись имеется в кеш-памяти)  Политика write-through (сквозная запись) – каждая запись в кеш-память влечет за собой обновление данных в кеш-памяти и оперативной памяти (кеш “отключается” для записи)  Политика write-back (отложенная запись, copy-back) – первоначально данные записываются только в кеш-память  Все измененные строки кеш-памяти помечаются как “грязные” (dirty)  Запись в память “грязных” строк осуществляется при их замещении или специальному событию (lazy write)  Внимание: чтение может повлечь за собой запись в память  При чтении возник cache miss, данные загружаются из кеш-памяти верхнего уровня (либо DRAM)  Нашли строку для замещения, если флаг dirty = 1, записываем её данные в память  Записываем в строку новые данные
  • 12. GNU/Linux CPU Cache Information (/proc) $ cat /proc/cpuinfo processor : 0 ... model name : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz stepping: 7 microcode : 0x29 cpu MHz : 2975.000 cache size : 3072 KB physical id : 0 siblings: 4 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 ... bogomips: 4983.45 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual
  • 13. Вычислительный узел кластера Oak $ cat /proc/cpuinfo model name : Intel(R) Xeon(R) CPU E5620 @ 2.40GHz cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual $ cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size 64 Анализ /sys/devices/system/cpu/cpuX/cache/  L1 Data cache: 32K, set associative cache — sets 64, ways — 8  L1 Instruction cache: 32K, set associative cache — sets 128, ways — 4  L2 Unified cache: 256K, set associative cache — sets 512, ways — 8  L3 Unified cache: 12288K, set associative cache — sets 12288, ways — 16
  • 14. Умножение матриц (DGEMM) int main(int argc, char **argv) { double gflop = 2.0 * N * Q * M * 1E-9; double *a, *b, *c1, *c2; // Launch naive verstion a = malloc(sizeof(*a) * N * M); b = malloc(sizeof(*b) * M * Q); c1 = malloc(sizeof(*c1) * N * Q); srand(0); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) a[i * M + j] = rand() % 100; } for (int i = 0; i < M; i++) { for (int j = 0; j < Q; j++) b[i * Q + j] = rand() % 100; } double tdef = wtime(); dgemm_def(a, b, c1, N, M, Q); tdef = wtime() - tdef; printf("Execution time (naive): %.6fn", tdef); printf("Performance (naive): %.2f GFLOPSn", gflop / tdef); free(b); free(a); return 0; }
  • 15. Умножение матриц (DGEMM Naive) enum { N = 100, M = 200, Q = 300 }; /* * dgemm_def: Naive matrix multiplication C[n, q] = A[n, m] * B[m, q]. * FP ops = 2*n*q*m. */ void dgemm_def(double *a, double *b, double *c, int n, int m, int q) { for (int i = 0; i < n; i++) { for (int j = 0; j < q; j++) { double s = 0.0; for (int k = 0; k < m; k++) s += a[i * m + k] * b[k * q + j]; c[i * q + j] = s; } } } Число операций над числами с плавающей запятой (FLOP) 2 * N * Q * M
  • 16. Умножение матриц (DGEMM Naive) enum { N = 100, M = 200, Q = 300 }; /* * dgemm_def: Naive matrix multiplication C[n, q] = A[n, m] * B[m, q]. * FP ops = 2*n*q*m. */ void dgemm_def(double *a, double *b, double *c, int n, int m, int q) { for (int i = 0; i < n; i++) { for (int j = 0; j < q; j++) { double s = 0.0; for (int k = 0; k < m; k++) s += a[i * m + k] * b[k * q + j]; c[i * q + j] = s; } } } a[n, m] b[m, q] Прыжки через строку Cache miss! Load a[0][0] — cache miss Load b[0][0] — cache miss Load a[0][1] — cache hit Load b[1][0] — cache miss Load a[0][1] — cache hit Load b[2][0] — cache miss Load a[0][2] — cache hit Load b[2][0] — cache miss ...
  • 17. Умножение матриц (DGEMM Opt.) /* * dgemm_opt: Matrix multiplication C[n, q] = A[n, m] * B[m, q]. * */ void dgemm_opt(double *a, double *b, double *c, int n, int m, int q) { for (int i = 0; i < n * q; i++) c[i] = 0; for (int i = 0; i < n; i++) { for (int k = 0; k < m; k++) { for (int j = 0; j < q; j++) c[i * q + j] += a[i * m + k] * b[k * q + j]; } } } a[n, m] b[m, q] Обращение по смежным адресам Load a[0][0] — cache miss Load b[0][0] — cache miss Load a[0][1] — cache hit Load b[0][1] — cache hit Load a[0][1] — cache hit Load b[0][1] — cache hit Load a[0][2] — cache hit Load b[0][2] — cache hit ...
  • 18. Анализ производительности DGEMM (Naive vs Opt.) Вычислительный узел кластера Oak  8 ядер (два Intel Quad Xeon E5620)  24 GiB RAM (6 x 4GB DDR3 1067 MHz)  CentOS 6.5 x86_64 Дальнейшие оптимизации: ● Блочное умножение матриц ● TLB-оптимизация ● Векторизация (SSE/AVX) ● Распараллеливание (OpenMP) ● ... 1.48 GFLOPS
  • 19. Анализ производительности (OpenMP-версия) Ускорение больше линейного: За ускорение принято отношение времени выполнения двух разных алгоритмов — dgemm_naive и OpenMP-версии с эффективным доступом к элементам матрицы B 9 GFLOPS N = Q = M = 2000 N = Q = M = 2000
  • 20. Численное интегрирование (метод прямоугольников) f(x) x x0 ba x1 x2 x3 xn − 1 Формула средних прямоугольников const double a = -4.0; /* [a, b] */ const double b = 4.0; const int nsteps = 40000000; /* n */ double func(double x) { return exp(-x * x); } double integrate(double a, double b, int n) { double h = (b - a) / n; double sum = 0.0; for (int i = 0; i < n; i++) sum += func(a + h * (i + 0.5)); sum *= h; return sum; }
  • 21. Численное интегрирование (метод прямоугольников) double integrate_omp(double (*func)(double), double a, double b, int n) { double h = (b - a) / n; double sum = 0.0; double thread_sum[32]; #pragma omp parallel { int tid = omp_get_thread_num(); thread_sum[tid] = 0; #pragma omp for for (int i = 0; i < n; i++) thread_sum[tid] += func(a + h * (i + 0.5)); #pragma omp atomic sum += thread_sum[tid]; } sum *= h; return sum; } Локальное хранилище для каждого потока
  • 22. Численное интегрирование (метод прямоугольников) double integrate_omp(double (*func)(double), double a, double b, int n) { double h = (b - a) / n; double sum = 0.0; double thread_sum[32]; #pragma omp parallel { int tid = omp_get_thread_num(); thread_sum[tid] = 0; #pragma omp for for (int i = 0; i < n; i++) thread_sum[tid] += func(a + h * (i + 0.5)); #pragma omp atomic sum += thread_sum[tid]; } sum *= h; return sum; } thread_sum[32] Cache Cache Shared memory Протокол обеспечения когерентности кешей MESI (Intel MESIF)  Поток обновляет свою строку в кеш-памяти и аннулирует строку в других кешах  Другие кеши загружают актуальную версию строки из оперативной памяти  Происходит постоянное обновление строк из памяти (кеширование «отключается») Ложное разделение (false sharing)
  • 23. Численное интегрирование (метод прямоугольников) double integrate_omp_opt(double (*func)(double), double a, double b, int n) { double h = (b - a) / n; double sum = 0.0; /* Each struct occupied one cache line (64 bytes) */ struct thread_param { double sum; /* 8 bytes */ double padding[7]; /* 56 bytes */ }; struct thread_param thread_sum[32] __attribute__ ((aligned(64))); #pragma omp parallel { int tid = omp_get_thread_num(); thread_sum[tid].sum = 0; #pragma omp for for (int i = 0; i < n; i++) thread_sum[tid].sum += func(a + h * (i + 0.5)); #pragma omp atomic sum += thread_sum[tid].sum; } sum *= h; return sum; } Каждый элемент массива будет занимать одну строку кеш-памяти
  • 24. Анализ производительности (integrate) Вычислительный узел кластера Oak (NUMA)  8 ядер (два Intel Quad Xeon E5620)  24 GiB RAM (6 x 4GB DDR3 1067 MHz)  CentOS 6.5 x86_64 Вычислительный узел кластера Jet (SMP)  8 ядер (два Intel Quad Xeon E5420)  8 GiB RAM  Fedora 20 x86_64 OpenMP-версия хуже последовательной программы использует кеш-память
  • 25. Задание  Разработать на OpenMP параллельную версию функции dgemm_opt — написать код функции dgemm_opt_omp  Провести анализ масштабируемости параллельной программы  Шаблон программы находится в каталоге _task  Как реализовать параллельную инициализацию матриц?
  • 26. Суммирование элементов массива int sumarray3d_def(int a[N][N][N]) { int i, j, k, sum = 0; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { for (k = 0; k < N; k++) { sum += a[k][i][j]; } } } return sum; } a[0][0][0] a[0][0][1] a[0][0][2] a[0][1][0] a[0][1][1] a[0][1][2] a[0][2][0] a[0][2][1] a[0][2][2] a[1][0][0] a[1][0][1] a[1][0][2] a[1][1][0] a[1][1][1] a[1][1][2] a[1][2][0] a[1][2][1] a[1][2][2] a[2][0][0] a[2][0][1] a[2][0][2] a[2][1][0] a[2][1][1] a[2][1][2] a[2][2][0] a[2][2][1] a[2][2][2] Массив a[3][3][3] хранится в памяти строка за строкой (row-major order) Reference pattern: stride-(N*N) Address 0 36 72
  • 27. int sumarray3d_def(int a[N][N][N]) { int i, j, k, sum = 0; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { for (k = 0; k < N; k++) { sum += a[i][j][k]; } } } return sum; } a[0][0][0] a[0][0][1] a[0][0][2] a[0][1][0] a[0][1][1] a[0][1][2] a[0][2][0] a[0][2][1] a[0][2][2] a[1][0][0] a[1][0][1] a[1][0][2] a[1][1][0] a[1][1][1] a[1][1][2] a[1][2][0] a[1][2][1] a[1][2][2] a[2][0][0] a[2][0][1] a[2][0][2] a[2][1][0] a[2][1][1] a[2][1][2] a[2][2][0] a[2][2][1] a[2][2][2] Массив a[3][3][3] хранится в памяти строка за строкой (row-major order) Reference pattern: stride-1 Address 0 36 72 Суммирование элементов массива