Введение Базовые способы...
TRANSCRIPT
![Page 1: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/1.jpg)
Эффективное программирование современных микропроцессоров
и мультипроцессоров
Введение. Базовые способы оптимизации
Новосибирский государственный университетФакультет информационных технологий
Кафедра параллельных вычислений
Преподаватели:Киреев С.Е.Калгин К.В.
![Page 2: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/2.jpg)
Обзор курса
• Введение• Базовые способы оптимизации• Оптимизация работы с данными• Оптимизация использования многоядерных систем с
общей памятью• Оптимизация управляющих конструкций• Векторизация вычислений• Возможности компиляторов по оптимизации программ• Профилирование программ• Модели производительности программ• Оценочное тестирование программ и оборудования
![Page 3: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/3.jpg)
ВВЕДЕНИЕ
![Page 4: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/4.jpg)
Оптимизация программ
• Оптимизация – модификация системы для улучшения её эффективности.
• Цели оптимизации программ:1. Ускорение работы программы
2. Уменьшение объёма ресурсов, требующейся для работы программы или потребляющихся в ходе работы программы (память, эл.энергия, пропускная способность сети, …)
3. Уменьшение побочных явлений (тепловыделение, …)
4. Уменьшение размера кода программы
![Page 5: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/5.jpg)
Оптимизация программ
Спецификация задачи
Алгоритм
Программа
Машинный код
Выполнение
Человек
Человек Компилятор
Процессор
Алгоритмическая оптимизация
Аппаратная оптимизацияПрограммная оптимизация
void F77_FUNC_(file_open_read,FILE_OPEN_READ)
(int *fd,char *fn,char *gz)
{ char filename[256],gzip[256];
int i,j;
for (i=0;i<256 && (fn[i]<33 || fn[i]>127);i++);
for (j=0;i<256 && fn[i]>=33 && fn[i]<=127;i++,j++) filename[j]=fn[i];
filename[j]=0;
if (gz)
{ for (i=0;i<256 && gz[i] && (gz[i]<33 || gz[i]>127);i++);
for (j=0;i<256 && gz[i]>=33 && gz[i]<=127;i++,j++) gzip[j]=gz[i];
gzip[j]=0;
}
else *gzip=0;
*fd=gzopen_read(filename,gzip);
}
xorl %edx, %edx
xorl %eax, %eax
pxor %xmm1, %xmm1
L1:
movaps a(%rax), %xmm0
incq %rdx
mulpd b(%rax), %xmm0
addq $16, %rax
addpd %xmm0, %xmm1
cmpq $500, %rdx
jb L1
L2:
movaps %xmm1, %xmm0
unpckhpd %xmm1, %xmm1
addsd %xmm1, %xmm0
![Page 6: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/6.jpg)
Виды оптимизации
По стадии оптимизации:
• Алгоритмическая
• Программная
• Аппаратная
По области применения:
• Общая
• Зависимая от окружения
• архитектуры
• компилятора
• библиотек
• …
![Page 7: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/7.jpg)
Что оптимизировать?
• Правило 80/20: 80% времени работают 20% кода программы
• Hot spot – место в программе, работа которого занимает наибольшую долю времени (обычно это цикл).
• Оптимизация hot spots даёт наибольший выигрыш.
• Как их найти? Путём профилирования
![Page 8: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/8.jpg)
БАЗОВЫЕ СПОСОБЫ ОПТИМИЗАЦИИ
![Page 9: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/9.jpg)
Базовые способы оптимизации
• Устранение «ненужных» вычислений
• Замена «долгих» вычислений на «быстрые»
![Page 10: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/10.jpg)
Устранение «ненужных» вычислений
• «Ненужные» вычисления:
– Вычисления, результат которых не используется
– Повторные вычисления
• Вынос инвариантных подвыражений за скобки, из цикла
• Запоминание результата вычислений (мемоизация)
![Page 11: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/11.jpg)
Устранение «ненужных» вычислений
• Примерыx = func1(); // результат не используетсяx = func2();use(x);
x = func2();use(x);
x = func(); // результат может не понадобитьсяif (y) use(x);
if (y){ x = func();
use(x);}
// избыточные вычисленияx = c*(a+b) + d*(a+b); x = (c+d) * (a+b);
// избыточные вычисленияfor (i=0; i<n; i++)
x[i] = a*b + i;
ab = a*b;for (i=0; i<n; i++)
x[i] = ab + i;
// избыточное управлениеfor (i=0; i<n; i++)
if (a>b) work_a(i);else work_b(i);
if (a>b)for (i=0; i<n; i++) work_a(i);
elsefor (i=0; i<n; i++) work_b(i);
![Page 12: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/12.jpg)
Устранение «ненужных» вычислений
• Примеры
• Lookup table (Agner Fog, p.132)
y = 2.0 * x / 3.0;// компилятор вычислит константуy = (2.0 / 3.0) * x;
![Page 13: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/13.jpg)
Устранение «ненужных» вычислений
• Что может делать компилятор– Устранение операций, результат которых не используется– Предвычисление константных выражений– Вынос общих подвыражений– …– Не имеет права делать преобразования с вещественными
числами, изменяющие порядок операций– Разрешается специальным ключом компилятора
![Page 14: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/14.jpg)
Замена «долгих» вычисленийна «быстрые»
• Применяется на всех уровнях программирования:– Программы, подпрограммы, блоки кода, машинные операции
• На уровне машинных операций:– Латентности разных операций процессора сильно отличаются
• (см. Intel64 and IA-32 Architectures Optimization Reference Manual, Software Optimization Guide for AMD Family ### Processors, …)
• Примеры– Замена умножений на сложения и вычитания– Замена делений на умножения– Замена обращения в память на быстрое вычисление (или
наоборот)– Понижение точности вещественных вычислений– …
![Page 15: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/15.jpg)
Замена «долгих» вычисленийна «быстрые»
• Примерыfor (i=0; i<n; i++) x[i] = (double) i / n; double r = 1.0 / n;
for (i=0; i<n; i++) x[i] = i * r;
for (i=0; i<n; i++) x[i] = i+1;…for (i=0; i<n; i++) y[i] = x[i]*2;
for (i=0; i<n; i++) x[i] = i+1;…for (i=0; i<n; i++) y[i] = (i+1)*2;
for (i=0; i<n; i++){ int k = i+1;
x[i] = k;y[i] = k*2;
}…
![Page 16: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/16.jpg)
Замена «долгих» вычисленийна «быстрые»
• Примеры#define PI 3.141592653589793double x[N];for (i=0; i<N; i++) x[i] = sin(2*PI*i/N);
#define PI 3.14159265ffloat x[N];for (i=0; i<N; i++) x[i] = sinf(2*PI*i/N);
#define PI 3.14159265f#define A (2*PI/N)float x[N];for (i=0; i<N; i++) x[i] = sinf(A*i);
#define PI 3.14159265fconst float a = 2*PI/N;float x[N];for (i=0; i<N; i++) x[i] = sinf(a*i);
![Page 17: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/17.jpg)
Замена «долгих» вычисленийна «быстрые»
• Примеры
• Проверка границ (Agner Fog, p.134)
• Проверка на несколько значений (p.135)
• Оптимизация умножений и делений (p.136)
• Смешивание float и double (p.140)
#define PI 3.14159265fconst float a = 2*PI/N;float x[N];for (i=0; i<N; i++) x[i] = sin(a*i);
#define PI 3.14159265fconst float a = 2*PI/N;float x[N];for (i=0; i<N; i++) x[i] = sinf(a*i);
![Page 18: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/18.jpg)
Замена «долгих» вычисленийна «быстрые»
• Что может делать компилятор– Выбирает наиболее быстрые реализации операций языка
в машинном коде из множества допустимых– Может делать множество арифметических
преобразований (см. Agner Fog)– …– Не имеет права делать преобразования с вещественными
числами, изменяющие порядок операций• Разрешается специальным ключом компилятора
![Page 19: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/19.jpg)
Пример из практики• Было: 15 делений, Xeon: 95 c,Xeon Phi: 1351 c
– double tmp1 = Teta1/(( 1.0-xx-yy )*Rho_10), tmp1__2 = tmp1*tmp1, tmp1__3 = tmp1__2*tmp1;
– double tmp2 = Teta2/( xx *Rho_20), tmp2__2 = tmp2*tmp2, tmp2__3 = tmp2__2*tmp2;
– double tmp3 = Teta3/( yy *Rho_30), tmp3__2 = tmp3*tmp3, tmp3__3 = tmp3__2*tmp3;
– double t1 = ( P_10 + pi1*delta_s + Kbig1*( Teta1/( 1.0-xx-yy )-Rho_10 )/Rho_10 )*tmp1__2;
– double t2 = ( P_20 + pi2*delta_s + Kbig2*( Teta2/ xx -Rho_20 )/Rho_20 )*tmp2__2;
– double t3 = ( P_30 + pi3*delta_s + Kbig3*( Teta3/ yy -Rho_30 )/Rho_30 )*tmp3__2;
– f = t3 - t2;
– g = t3 - t1;
– fx = 2.0*t2/xx + tmp2__3 * Kbig2/xx;
– fy = - 2.0*t3/yy - tmp3__3 * Kbig3/yy;
– gx = - 2.0*t1/( 1.0-xx-yy ) - tmp1__3 * Kbig1 / ( 1.0-xx-yy );
– gy = fy + gx;
• Стало:3 деления, Xeon: 40 c,Xeon Phi: 509 c– double rxx = 1.0/xx;
– double ryy = 1.0/yy;
– double rxxyy = 1.0/(1.0 - xx - yy);
– double tmp1 = Teta1_Rho_10*rxxyy, tmp1__2 = tmp1*tmp1, tmp1__3 = tmp1__2*tmp1;
– double tmp2 = Teta2_Rho_20*rxx, tmp2__2 = tmp2*tmp2, tmp2__3 = tmp2__2*tmp2;
– double tmp3 = Teta3_Rho_30*ryy, tmp3__2 = tmp3*tmp3, tmp3__3 = tmp3__2*tmp3;
– double t1 = ( P_10 + pi1*delta_s + Kbig1*( tmp1 - 1.0 ) )*tmp1__2;
– double t2 = ( P_20 + pi2*delta_s + Kbig2*( tmp2 - 1.0 ) )*tmp2__2;
– double t3 = ( P_30 + pi3*delta_s + Kbig3*( tmp3 - 1.0 ) )*tmp3__2;
– f = t3 - t2;
– g = t3 - t1;
– fx = ( 2.0*t2 + tmp2__3 * Kbig2 ) * rxx;
– fy = ( -2.0*t3 - tmp3__3 * Kbig3 ) * ryy;
– gx = ( -2.0*t1 - tmp1__3 * Kbig1 ) * rxxyy;
– gy = fy + gx;
![Page 20: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/20.jpg)
Задача 1: решение 3D уравнения Пуассона методом Зейделя
• Есть 3D массив: φi,j,k
• На n+1 шаге значения элементов массива φперевычисляются по формуле:
𝜑𝑖,𝑗,𝑘𝑛+1 =
𝑤
21
ℎ𝑥2 +
1
ℎ𝑦2 +
1
ℎ𝑧2
𝜑𝑖+1,𝑗,𝑘𝑛 + 𝜑𝑖−1,𝑗,𝑘
𝑛+1
ℎ𝑥2 +
𝜑𝑖,𝑗+1,𝑘𝑛 + 𝜑𝑖,𝑗−1,𝑘
𝑛+1
ℎ𝑦2 +
𝜑𝑖,𝑗,𝑘+1𝑛 + 𝜑𝑖,𝑗,𝑘−1
𝑛+1
ℎ𝑧2 − 𝜌𝑖,𝑗,𝑘 + 1 − 𝑤 𝜑𝑖,𝑗,𝑘
𝑛
![Page 21: Введение Базовые способы оптимизацииssd.sscc.ru/sites/default/files/content/attach/317/lecture2018_01_intro.pdf · Обзор курса •Введение](https://reader033.vdocuments.net/reader033/viewer/2022041605/5e33b99715407240ff71911f/html5/thumbnails/21.jpg)
Задача 2: обращение к соседним элементам массива
• 𝑦𝑖 =𝑥𝑖−1+𝑥𝑖+𝑥𝑖+1
3