Мастер класс Инструменты и библиотеки для ...
Transcript of Мастер класс Инструменты и библиотеки для ...
Мастер-класс «Инструменты и библиотеки для высокопроизводительных вычислений»НЕМНЮГИН СЕРГЕЙ АНДРЕЕВИЧ
САНКТ -ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
1Высокопроизводительные вычисления на Grid системах 2017
HPC
Платформа
Модель
Алгоритмы
ПрограммированиеОптимизация
при компиляции
Оптимизация
готовой программы
Параллельные
технологии
Высокопроизводительные
библиотеки2
HPC
Алгоритмы
Библиотеки
Для систем с DM
SMP
Гибридные
Для систем с SM
Для гибридных
систем
3Высокопроизводительные вычисления на Grid системах 2017
Высокопроизводительные библиотеки
4Высокопроизводительные вычисления на Grid системах 2017
Библиотеки линейной алгебры
�ScaLAPACK – реализация LAPACK для систем с распределённой памятью (на
основе MPI).
�PLASMA – реализация LAPACK для многоядерных систем (Pthread, Linux).
�MAGMA – реализация LAPACK для гибридных архитектур (с использованием
графических ускорителей, Pthread, CUDA, Linux).
�SuperLU - 3 варианта: последовательный, параллельный для систем с общей
памятью (Pthreads, OpenMP ) и параллельный для систем с распределённой
памятью (MPI).
�PaStiX – библиотека функций для решения СЛАУ с большими разреженными
матрицами для вычислительных систем с распределённой памятью. 5
Высокопроизводительные вычисления на Grid системах 2017
Intel® Math Kernel library
6Высокопроизводительные вычисления на Grid системах 2017
Intel® Math Kernel Library (Intel® MKL) – вычислительная математическая
библиотека, содержащая хорошо оптимизированные многопоточные реализации
математических функций. Содержит BLAS, LAPACK, ScaLAPACK, солверы для
разреженных систем, быстрое преобразование Фурье, векторизованные
математические функции и т.д.
Многоплатформенная библиотека.
Поддерживаются C и Fortran.
7Высокопроизводительные вычисления на Grid системах 2017
Решение СЛАУ.
Спектральные задачи
LAPACK ScaLAPACK
Решение СЛАУ для разрежённых матриц
PARDISO ISS
Базовые векторные и матричные операции
BLAS
PBLAS
SparseBLAS
Оптимизационные
решатели
Быстрое преобразование Фурье
FFT
ClusterFFT
Поддержка решения дифференциальных
уравнений в частных производных
TT PL
Векторные библиотеки
VML
VSL
Intel® Math Kernel library
8Высокопроизводительные вычисления на Grid системах 2017
Основные операции с векторами и матрицами:
- BLAS (Basic Linear Algebra Subroutines);
- SparseBLAS (Basic Linear Algebra Subroutines);
- PBLAS (Parallel BLAS).
BLAS – оптимизированная библиотека, в которой реализованы основные операции: векторно-векторные (1 уровень), матрично-векторные (2 уровень) и матрично-матричные (3 уровень). Библиотека оптимизируется под разные архитектуры и используется в качестве «ядра» других библиотек более высокого уровня).
SparseBLAS – расширение BLAS для работы с разрежёнными векторами и матрицами.
PBLAS – параллельная реализация BLAS для вычислительных систем с распределённой памятью. Построена на основе MPI.
BLAS – Basic Linear Algebra Subroutines
9Высокопроизводительные вычисления на Grid системах 2017
Структура:
� 1 уровень: векторно-векторные (пересылки в/из памяти O(n), операции с плавающей точкой O(n));
� 2 уровень: матрично-векторные (пересылки в/из памяти O(n2), операции с плавающей точкой O(n2));
� 3 уровень: матрично-матричные (пересылки в/из памяти O(n2), операции с плавающей точкой O(n3)).
Форматы хранения матриц:
�плотный – матрица хранится в двумерном массиве;
�упакованный – используется для симметричных или треугольных матриц. Элементы матрицы хранятся последовательно, по столбцам;
�ленточный - используется для ленточных матриц. Двумерный массив хранит диагонали матрицы.
10Высокопроизводительные вычисления на Grid системах 2017
SparseBLAS
Основные операции с разрежёнными векторами и матрицами
Структура:
� 1 уровень: операции с разрежёнными векторами;
� 2 уровень: операции с разрежёнными матрицами и плотными векторами;
� 3 уровень: операции с разрежёнными и плотными матрицами.
Разнообразные форматы хранения матриц.
Вспомогательные процедуры для работы с разреженными матрицами.
11Высокопроизводительные вычисления на Grid системах 2017
Модуль линейной алгебры (решение систем линейных алгебраических уравнений, решение спектральных задач). Включает следующие компоненты:
- LAPACK (Linear Algebra PACKage);
-- ScaLAPACK.
LAPACK содержит подпрограммы решения систем линейных алгебраических уравнений, решения спектральных задач для матриц (вычисления собственных значений и собственных векторов), факторизации матриц разного вида (LU, QR, Холецкого, Шура, сингулярного и других) и т.д. Процедуры предназначены для работы с хорошо заполненными и ленточными матрицами, вещественными и комплексными, в форматах с простой и двойной точностью (www.netlib.org/lapack).
ScaLAPACK – параллельная библиотека подпрограмм линейной алгебры, реализованная для систем с распределённой памятью (www.netlib.org/scalapack).
LAPACK – Linear Algebra PACKage
12Высокопроизводительные вычисления на Grid системах 2017
Структура:
� системы линейных алгебраических уравнений: факторизация матриц, решение систем линейных алгебраических уравнений, оценка обусловленности, уточнение решения и оценка его погрешности, обращение матриц;
� решение спектральных задач для симметричных и несимметричных матриц, метод наименьших квадратов: ортогональные разложения (QR, LQ), сингулярные разложения, линейный метод наименьших квадратов, обобщённый метод наименьших квадратов;
� вспомогательные процедуры.
13Высокопроизводительные вычисления на Grid системах 2017
Модуль линейной алгебры для разрежённых матриц:
- PARDISO (PARallel DIrect SOlver);
- итерационные солверы для разрежённых матриц.
PARDISO – потокобезопасная, эффективная библиотека, предназначенная для решения систем линейных алгебраических уравнений с большими разрежёнными матрицами, как симметричными, так и несимметричными (www.pardiso-project.org). Подпрограммы библиотеки реализованы как для систем с общей, так и с распределённой памятью.
Солверы для разреженных систем
14Высокопроизводительные вычисления на Grid системах 2017
SS – Sparse Solvers
Солверы для разреженных систем
Прямые солверы
PARDISO (PARallel DIrect Solver) – параллельный прямой солвер.
DSS (Direct Sparse Solver) – солвер разреженных систем, прямой метод.
Итерационные солверы
CG (Conjugate Gradients) – метод сопряжённых градиентов.
FGMRES (Generalized Minimal RESidual) – метод обобщённых минимальных невязок.
Предобуславливатели
ILUO и ILUT (Incomplete LU).15
Высокопроизводительные вычисления на Grid системах 2017
VML – Vector Mathematical Library
Векторизованные математические функции.
Структура
Вещественные функции (неполная выборка):
Тригонометри
ческие
Гиперболиче
ские
Степени
и корни
Экспоненциа
льные,
логарифмиче
ские
Спецфунк
ции
Арифметиче
ские
Округле
ние
Sin Sinh Pow2o3 Exp Erf Add Floor
Cos Cosh Pow3o2 Ln Erfc Sub Cell
Tan Tanh Pow Log10 ErfInv Sqr Trunc
Asin Asinh Powx Exm1p ErfcInv Mul Round
Acos Acosh Sqrt Log1p TGamma Abs NearbyInt
Atan Atanh InvSqrt LGamma LinearFrac Rint
16Высокопроизводительные вычисления на Grid системах 2017
Комплексные функции (неполная выборка):
Тригонометрические Гиперболические Степени и
корни
Экспоненциальные,
логарифмические
Арифметические
Sin Sinh Pow Exp Add
Cos Cosh Powx Ln Sub
Tan Tanh Sqrt Log10 Div
Asin Asinh Mul
Acos Acosh Abs
Atan Atanh Conj
17Высокопроизводительные вычисления на Grid системах 2017
Форматы
Вещественный и комплексный, с простой и двойной точностью.
Режимы точности и производительности
Повышенная точность (HA – High Accuracy). Правильное округление выполняется более чем в 99% случаев. Самый медленный режим.
Пониженная точность (LA – Low Accuracy). Неправильными могут быть до двух младших (наименее значимых) разрядов. Производительность, по сравнению с режимом высокой точности выше на 30-50%.
Режим улучшенной производительности (EP – Enhanced Performance). Неправильными могут быть до половины двоичных разрядов. Производительность, по сравнению с режимом низкой точности выше на 30-50%.
Библиотека поддерживает динамическое управление точностью.
18Высокопроизводительные вычисления на Grid системах 2017
Формат вызова
Вещественный и комплексный, с простой и двойной точностью.
v(s, d)Exp(n, input_array, output_array)
Функции VML могут вызываться в режиме in-place, когда входной и выходной массивы занимают одно и то же положение в памяти.
Изменение режима точности
Вызовом
vmlSetMode(VML_EP)
19Высокопроизводительные вычисления на Grid системах 2017
VSL – Vector Statistical Library
Векторизованные функции генерации псевдо/квазислучайных чисел, статистика.
СтруктураГенераторы случайных чисел
(равномерное распределение)
Генераторы псевдослучайных чисел
(неравномерное распределение)
Статистика
Псевдослучайные Квазислучайные Непрерывные Дискретные
Мультипликативный
конгруэнтный 59-
разрядный
Соболя Равномерное Равномерное Центральные и
нецентральные моменты
до 4-го порядка
включительно
Мультипликативный
конгруэнтный 31-
разрядный
Нидеррайтера Нормальное Бернулли Эксцесс, асимметрия
На сдвиговом
регистре с обратной
связью
Экспоненциальное Биномиальное Квантили, порядковые
статистики
Mersenne Twister
19937
Коши Гипергеометрическое Матрицы ковариации и
корреляции
Mersenne Twister 2203
(6024 потока)
Бета Пуассона
20Высокопроизводительные вычисления на Grid системах 2017
Генераторы случайных чисел
(равномерное распределение)
Генераторы псевдослучайных чисел
(неравномерное распределение)
Статистика
Псевдослучайные Квазислучайные Непрерывные Дискретные
Mersenne Twister
19937 – SSE-версия
Вейбулла Геометрическое Квантили для потоковых
данных
Генератор
Wichmann-Hill
(273 потока)
Релея Отрицательное
биномиальное
Робастная оценка
матрицы ковариации
Логнормальное Определение выбросов
Гамбела Параметризация
матрицы корреляции
Гамма Поддержка
пропущенных значений
21Высокопроизводительные вычисления на Grid системах 2017
Генераторы VSL, модель использования
Заголовочный файл
#include ”mkl_vsl.h”
Инициализация
status = vslNewStream(&stream, VSL_BRNG_MT19937, SEED)
Генерация псевдо(квази)случайных значений
status = vdRngUniform(method, stream, vector_size, r, 0.0, 1.0)
Деинициализация
status = vslDeleteStream(&stream)
22Высокопроизводительные вычисления на Grid системах 2017
Статистика, модель использования
Заголовочный файл
#include ”mkl_vsl.h”
Инициализация
status = vsldSSNewTask(&task, &p, &n, &x_storage, x, w, indices)
Установка параметров
status = vsldSSEditTask(task, VSL_SS_ED_MEAN, mean)
Вычисления
status = vsldSSCompute(task, VSL_SS_MEAN, VSL_SS_METHOD_1PASS)
Деинициализация
status = vslDeleteTask(&task)23
Высокопроизводительные вычисления на Grid системах 2017
FFT – Fast Fourier Transform
Быстрое преобразование Фурье
� Размерность: 1, 2, 3 и более.
� Совместимость с FFTW (поддерживаются соответствующие интерфейсы).
� Поддержка многопоточности, архитектур SMP и кластерных.
� Поддержка преобразований со смешанным основанием.
� Реализация – на C и Fortran 95.
ClusterFFT – кластерная реализация библиотеки быстрого преобразования Фурье.
24Высокопроизводительные вычисления на Grid системах 2017
Модель использования
Создание дескриптора
Status = DftiCreateDescriptor(MDH, …)
Зарегистрировать дескриптор
Status = DftiCommitDescriptor(MDH)
Выполнить преобразование
Status = DftiComputeForward(MDH, X)
Деинициализация (не обязательна)
25Высокопроизводительные вычисления на Grid системах 2017
Cluster FFT
Для систем с распределённой памятью.
Реализован с помощью MPI и BLACS.
Поддерживается OpenMP.
Для использования требует базовых навыков работы с MPI.
Поддерживает FFTW.
26Высокопроизводительные вычисления на Grid системах 2017
Сплайны Тип сплайна Граничные условия Внутренние условия
Линейные 1-я производная
Квадратичные Свободные 2-я производная
Кубические Натуральные,
эрмитовы,
Бесселя, Акимы
1-я производная на
левой/правой
границах интервала
Массив узлов
Кусочно-постоянные Непрерывные
слева,
непрерывные
справа
Периодические
Определённые
пользователем
Векторизованные функции, предназначенные для фитирования данных: создание сплайнов, сплайн-интерполяция и вычисление производных, интегрирование и решение других задач.
DFL – Data Fitting Library
27Высокопроизводительные вычисления на Grid системах 2017
Poisson Library – быстрое решение уравнений Гельмгольца, Пуассона, Лапласа с разделяемыми переменными.
Функции интерфейса для тригонометрического преобразования.
Солверы для уравнений в частных производных
28Высокопроизводительные вычисления на Grid системах 2017
Решение проблем МНК без условий и с граничными условиями, вычисление матрицы Якоби с помощью центральных разделённых разностей для решения проблем МНК.
Оптимизационные солверы
29Высокопроизводительные вычисления на Grid системах 2017
Получение информации об используемой версии MKL.
Управление количеством потоков.
Обработка ошибок.
Таймеры.
Определение тактовой частоты ЦП.
Выделение и освобождение памяти.
Другие задачи.
Вспомогательные функции
30Высокопроизводительные вычисления на Grid системах 2017
Как управлять многопоточностью в MKL
Переменные окружения:
OMP_NUM_THREADS
MKL_NUM_THREADS
MKL_DYNAMIC (MKL самостоятельно определяет оптимальное количество потоков) и некоторые другие.
Функции:
omp_set_num_threads()
mkl_set_num_threads()
omp_set_dynamic() и некоторые другие.
Примеры:
mkl_domain_set_num_threads(1, MKL_ALL)
mkl_domain_set_num_threads(2, MKL_BLAS)
31Высокопроизводительные вычисления на Grid системах 2017
Прежде, чем использовать Intel® Math Kernel Library, необходимо сделать следующее:
1. Определить платформу исполнения. Установить значения переменных окружения с помощью соответствующих скриптов.
2. Определить домен (раздел) библиотеки: BLAS, SparseBLAS, PBLAS, LAPACK, ScaLAPACK, разреженные солверы, VML, VSL, FFT, ClusterFFT, тригонометрические преобразования (TT), солверы Пуассона/Лапласа/Гельмгольца, оптимизационные солверы, DFL. От выбора зависят ключи компоновки и особенности оптимального программирования.
3. Выбрать язык программирования: Fortran/C/C++. От выбора зависит набор заголовочных файлов, интерфейсы.
4. Определить объём обрабатываемых данных (количество элементов в массиве). От этого зависит диапазон целых значений, а также соответствующие интерфейсы (например, ILP64 для больших массивов).
5. Выбрать модель многопоточности : реализация компилятором Intel, реализация другим компилятором, отказ от использования многопоточности.
6. Задать количество потоков. Intel® MKL использует OpenMP.
32Высокопроизводительные вычисления на Grid системах 2017
7. Выбрать модель компоновки: статическая или динамическая. От выбора модели компоновки зависит набор библиотек, используемых при сборке приложения.
8. Выбрать реализацию MPI, которая будет использоваться в кластерных модулях. Соответствующие библиотеки указываются в опциях компоновки. Рекомендуется использовать последние версии.
33Высокопроизводительные вычисления на Grid системах 2017
Примеры
34Высокопроизводительные вычисления на Grid системах 2017
Вычисление скалярного произведения
#include <windows.h>
#include <stdio.h>
#include "mkl.h"
#define N 100000000
double a[N + 1], b[N + 1];
int i;
double gDotProduct = 0;
int main()
{
// initialize vectors
for (i = 0; i < N; i++)
{
a[i] = 1.034; b[i] = 1.057;
}
printf("Computed value of vector sum: ");
gDotProduct = cblas_ddot(N, &a, 1, &b, 1);
//print dot product
printf("sum = %f\n", gDotProduct);
}
35Высокопроизводительные вычисления на Grid системах 2017
Intel® Integrated Performance Primitives
36Высокопроизводительные вычисления на Grid системах 2017
Intel ® Integrated Performance Primitives
Библиотека готовых компонентов для разработки мультимедийных приложений для вычислительных платформ Intel.
Включает модули для обработки сигналов и выполнения векторных и матричных операций (эффективна при работе с маленькими матрицами), функции сжатия и распаковки речи и статических/динамических изображений, средства шифрования и обработки аудиоданных и текстовых строк.
Intel IPP обеспечивает прозрачное использование расширенных возможностей процессоров Intel, таких, как технология MMX, расширения набора команд Streaming SIMD Extensions и StreamingSIMD Extensions.
Библиотека Intel IPP оптимизирована для работы с разными процессорами Intel.
Библиотека Intel IPP поддерживает 32- и 64-битные операционные системы Windows и Linux, включая встраиваемые версии, такие как Windows Mobile.
37Высокопроизводительные вычисления на Grid системах 2017
Состав:
�Функции размещения и освобождения памяти.
�Вспомогательные функции – определение числа ядер, типа процессора, выравнивание указателей, определение числа потоков и т.д.
�Функции диспетчеризации.
�Функции инициализации векторов.
�Генерация сигналов разного типа.
�Генераторы однородного и неоднородных распределений.
�Логические, арифметические функции, функции преобразования векторов (сортировка, преобразование типов, объединение векторов,
комплексное сопряжение и др.).
�Работа с окнами (обработка сигналов).
�Статистические функции.
�Функции фильтрации.
�Преобразования: FFT, Харли, Гильберта, Уолша-Адамара, вейвлетное.
�Функции распознавания и кодирования речи.
�Работа со строками.
�Элементарные и специальные математические функции.
�Сжатие данных и т.д.
38Высокопроизводительные вычисления на Grid системах 2017
Пример. Скалярное произведение
#include <windows.h>#include <stdio.h>#define N 100000000#include "ipps.h"
Ipp64f a[N + 1], b[N + 1];int i; double gDotProduct = 0;
int main(){// initialize vectors for (i = 0; i < N; i++) {a[i] = 1.034; b[i] = 1.057;
}printf("Computed value of vector sum: ");ippsDotProd_64f(a, b, (N + 1), &gDotProduct);//print dot product printf("sum = %f\n", gDotProduct); }
39Высокопроизводительные вычисления на Grid системах 2017
Intel® Threading Building Blocks
40Высокопроизводительные вычисления на Grid системах 2017
Библиотека готовых шаблонов C++, упрощающая разработку многопоточных приложений, обеспечивая более высокий уровень абстракции при распараллеливании.
Многоплатформенность: Linux, Microsoft Windows, Mac OS.
41Высокопроизводительные вычисления на Grid системах 2017
42
Примитивы синхронизацииatomic, condition_variable[recursive_]mutex
{spin,queuing,null} [_rw]_mutex
critical_section, reader_writer_lock
Диспетчер задачtask_group, structured_task_grouptask
task_scheduler_init
task_scheduler_observer
Concurrent Containersconcurrent_hash_mapconcurrent_unordered_{map,set}
concurrent_[bounded_]queue
concurrent_priority_queue
concurrent_vector
Размещение памятиtbb_allocatorzero_allocator
cache_aligned_allocator
scalable_allocator
Thread Local Storagecombinableenumerable_thread_specific
Потокиstd::thread
Параллельные алгоритмыparallel_forparallel_for_each
parallel_invoke
parallel_do
parallel_scanparallel_sort
parallel_[deterministic]_reduce
Macro Dataflowparallel_pipelinetbb::flow::...
Высокопроизводительные вычисления на Grid системах 2017
Оптимизация в примерах
43Высокопроизводительные вычисления на Grid системах 2017
44Высокопроизводительные вычисления на Grid системах 2017
45Высокопроизводительные вычисления на Grid системах 2017
46Высокопроизводительные вычисления на Grid системах 2017
47Высокопроизводительные вычисления на Grid системах 2017
48Высокопроизводительные вычисления на Grid системах 2017
49Высокопроизводительные вычисления на Grid системах 2017
50Высокопроизводительные вычисления на Grid системах 2017
51Высокопроизводительные вычисления на Grid системах 2017
52Высокопроизводительные вычисления на Grid системах 2017
Matrices.cpp
�icl /FeMatricesOd /Od Matrices.cpp
�icl /FeMatricesO1 /O1 Matrices.cpp
�icl /FeMatricesO2 /O2 Matrices.cpp
�icl /FeMatricesO3 /O3 Matrices.cpp
53Высокопроизводительные вычисления на Grid системах 2017
#include <ctime>
#include <iostream>
#include "stdlib.h"
#include "conio.h"
#include "math.h“
using namespace std;
const int SIZE = 1000;
void matrixMultiply(double ** matrA, double ** matrB, double ** matrC, int matrSize);
double sinCosMultiply(double i, double j);
int main()
{
time_t t1, t2;
double trace(0);
double ** matrixA = new double*[SIZE];
double ** matrixB = new double*[SIZE];
cout << "We will construct the square matrix " << SIZE << "x" << SIZE << endl;
cout << "of pseudo-random values" << endl;
cout << "and multiply it by itself. Then we will find the trace of the matrix." << endl;
for(int i = 0; i < SIZE; i++)
{
matrixA[i] = new double[SIZE];
matrixB[i] = new double[SIZE];
}54
Высокопроизводительные вычисления на Grid системах 2017
t1 = clock();
for(int i=0; i<SIZE; i++)
{
for(int j=0; j<SIZE; j++)
{
matrixA[i][j]=sinCosMultiply(rand()%10/3, rand()%10/3);
}
}
matrixMultiply(matrixA, matrixA, matrixB, SIZE);
for(int i=0; i<SIZE; i++)
{
for(int j=0; j<SIZE; j++)
{
if(i==j) trace += matrixB[i][j];
}
}
t2 = clock();
cout << "\nTrace is " << trace << endl;
cout << "\nInitial clock ticks value is " << t1 << endl;
cout << "Final clock ticks value is " << t2 << endl;
cout << "Difference in clock ticks is " << difftime(t2,t1) << endl;
cout << "Clock ticks per second value is " << CLOCKS_PER_SEC << endl;
cout << "\nActual time of calculations is " << ((t2-t1)/CLOCKS_PER_SEC) << " sec" << endl;
55Высокопроизводительные вычисления на Grid системах 2017
for(int i = 0; i < SIZE; i++)
{
delete [] matrixA[i];
delete [] matrixB[i];
}
delete [] matrixA;
delete [] matrixB;
return 0;
}
void matrixMultiply(double ** matrA, double ** matrB, double ** matrC, int matrSize)
{
for(int i=0; i<matrSize; i++) {
for(int j=0; j<matrSize; j++) {
matrC[i][j] = 0;
for(int k=0; k<matrSize; k++) {
matrC[i][j] += matrA[i][k]*matrB[k][j];
}
}
} }
double sinCosMultiply(double i, double j)
{
return sin(i)*cos(j);
}
56Высокопроизводительные вычисления на Grid системах 2017
Результаты
Intel Core 2 Duo T3700 2.00 ГГц, 2 Гб RAM
Среднее значение времени выполнения:
� MatricesOd . . . 21.76 с.
� MatricesO1 . . . 14.05 с.
� MatricesO2 . . . 9.63 с.
� MatricesO3 . . . 9.57 с.
57Высокопроизводительные вычисления на Grid системах 2017
/Qax (Windows), -ax (Linux)Оптимизация под архитектуру Intel
� QxHost
� QxAVX
� QxSSE2, QxSSE3, QxSSE3_ATOM, QxSSE4.1, QxSSE4.2, QxSSSE3
Оптимизация под архитектуру
58Высокопроизводительные вычисления на Grid системах 2017
Primes.cpp
�icl /FePOd /Od Primes.cpp
�icl /FePx /QaxSSSE3 Primes.cpp
Intel Core 2 Duo T3700 2.00 ГГц, 2 Гб ОЗУ
Среднее значение времени выполнения:
- POd . . . . . 29.8 с.
- Px . . . . . . 4.5 с.
59Высокопроизводительные вычисления на Grid системах 2017
#include "time.h"
#include <iostream>
#include "stdlib.h"
#include "conio.h"
#include "math.h “
using namespace std;
const int NUM_OF_TESTS = 2000000;
const int RANGE = 1000;
bool isComposite(const int y);
int main()
{
time_t t1, t2;
int counter(0);
t1 = clock();
for (int i = 0; i < NUM_OF_TESTS; i++)
if(isComposite(rand()%RANGE))
++counter;
t2 = clock();
cout << "For " << NUM_OF_TESTS << " pseudo-random values" << endl;
cout << "within the range 0.." << RANGE << endl;
cout << ((NUM_OF_TESTS-counter)*100.0)/NUM_OF_TESTS << "% were prime
numbers." << endl;
60Высокопроизводительные вычисления на Grid системах 2017
cout << "\nInitial clock ticks value is " << t1 << endl;
cout << "Final clock ticks value is " << t2 << endl;
cout << "Difference in clock ticks is " << difftime(t2,t1) << endl;
cout << "Clock ticks per second value is " << CLOCKS_PER_SEC << endl;
cout << "\nActual time of calculations is " << ((t2-t1)/CLOCKS_PER_SEC)
<< " sec" << endl;
return 0;
}
bool isComposite(const int y)
{
bool result = false;
for (int i = 2; i <= ceil(y/2.0); i++)
{
if (y%i == 0) result = true;
}
return result;
}
61Высокопроизводительные вычисления на Grid системах 2017
Результаты
Intel Core 2 Duo T3700 2.00 ГГц, 2 Гб ОЗУ
Среднее значение времени выполнения:
- POd . . . . . 29.8 с.
- Px . . . . . . 4.5 с.
62Высокопроизводительные вычисления на Grid системах 2017
Автоматическое распараллеливание
/Qparallel (Windows), -parallel (Linux)
�Автоматическое распараллеливание.
�Определяются те части кода, которые можно распараллелить.
�Выполняется анализ зависимостей.
�Разделение данных для параллельной обработки.
�Работа с циклами.
63Высокопроизводительные вычисления на Grid системах 2017
FermatsCubes.cpp
• icl /FeFCOd /Od FermatsCubes.cpp
• icl /FeFCPar /Qparallel FermatsCubes.cpp
Сравнить результаты
64Высокопроизводительные вычисления на Grid системах 2017
#include "time.h"
#include <iostream>
#include "stdlib.h"
#include "conio.h"
#include "math.h“
using namespace std;
const int RANGE = 2000;
long sumOfCubes(const int x, const int y);
int main()
{
time_t t1, t2;
bool isDisproven = false;
cout << "Checking for mispredictions of Fermat's Great Theorem" << endl;
cout << "for cubes in range 3.." << RANGE << endl;
t1 = clock();
for (int i = 3; i < RANGE; i++)
{
for(int k = 1; k < i; k++)
{
for(int j = 1; j < i; j++)
{
if (long(i*i*i) == sumOfCubes(k,j))
{
cout << k << " " << j << " " << i << endl;
isDisproven = true;
}}}}
65Высокопроизводительные вычисления на Grid системах 2017
t2 = clock();
cout << "\nAre theorem's predictions correct? +" << !(isDisproven) << endl;
cout << "\nInitial clock ticks value is " << t1 << endl;
cout << "Final clock ticks value is " << t2 << endl;
cout << "Difference in clock ticks is " << difftime(t2,t1) << endl;
cout << "Clock ticks per second value is " << CLOCKS_PER_SEC << endl;
cout << "\nActual time of calculations is " << ((t2-t1)/CLOCKS_PER_SEC) << " sec" << endl;
return 0;
}
long sumOfCubes(const int x, const int y)
{
return (x*x*x + y*y*y);
}
66Высокопроизводительные вычисления на Grid системах 2017
Среднее значение времени выполнения:
- FCOd . . . . . 25.95 с.
- FCPar . . . . . 3.78 с.
Результаты
67Высокопроизводительные вычисления на Grid системах 2017
/Qprof-gen (Windows), -prof-gen (Linux)
/Qprof-use (Windows), -prof-use (Linux)
�Инструментовка.
�Сбор информации.
�Компиляция с учетом проанализированных данных.
Оптимизация с профилированием
68Высокопроизводительные вычисления на Grid системах 2017
Branches.cpp
�icl /FeBOd /Od Branches.cpp
�icl /FeBPrg /Qprof-gen Branches.cpp
�BPrg.exe
�icl /FeBProf /Qprof-use Branches.cpp
69Высокопроизводительные вычисления на Grid системах 2017
#include "time.h"
#include <iostream>
#include "stdlib.h"
#include "conio.h"
#include "math.h“
using namespace std;
bool slow_func(void);
bool quick_func(void);
int main()
{
time_t t1, t2;
t1 = clock();
if(slow_func() && quick_func()) cout << "You can't see this...";
t2 = clock();
cout << "\nInitial clock ticks value is " << t1 << endl;
cout << "Final clock ticks value is " << t2 << endl;
cout << "Difference in clock ticks is " << difftime(t2,t1) << endl;
cout << "Clock ticks per second value is " << CLOCKS_PER_SEC << endl;
cout << "\nActual time of calculations is " << ((t2-t1)/CLOCKS_PER_SEC)
<< " sec" << endl;
return 0;
}
70Высокопроизводительные вычисления на Grid системах 2017
bool slow_func(void)
{
double a(0);
for(int i = 0; i < 50000000; i++)
a = pow((sin(a/2.0)+cos(a/2.0))*(sin(i/2.0)+cos(i/2.0)), 2);
for(int i = 0; i < 100; i++)
a += i;
return !a;
}
bool quick_func(void)
{
return false;
}
71Высокопроизводительные вычисления на Grid системах 2017
Результаты
Среднее значение времени выполнения:
- BOd . . . . . 13.171 с.
- BProf . . . . . 0.0 с.
72Высокопроизводительные вычисления на Grid системах 2017
/Qip (Windows), -ip (Linux)
�Анализ вызываемых функций приложения.
�Оптимизация многочисленных «маленьких» функций, особенно в циклах.
�Встраивание (inlining, подстановка кода) – уменьшение накладных расходов, создание возможностей для других видов оптимизации.
�Удаление неиспользуемого кода.
�Замена виртуальных вызовов статическими.
�Замена параметра функции константой.
�Эффективный анализ зависимостей для оптимизации циклов, векторизации и распараллеливания.
�Размер бинарного файла и время компиляции увеличиваются.
Межпроцедурная оптимизация
73Высокопроизводительные вычисления на Grid системах 2017
SquareRoots.cpp
�icl /FeSqOd /Od SquareRoots.cpp
�icl /FeSqip /Qip SquareRoots.cpp
74Высокопроизводительные вычисления на Grid системах 2017
#include "time.h"
#include <iostream>
#include "stdlib.h"
#include "conio.h"
#include "math.h“
using namespace std;
const int N = 10000; //number of steps in grid used for numerical method
const int LIM = 50000; //we want to find the sum of square roots of 1..LIM
double sqrootNewton(double x);
double returnHalf(double value);
double multiply(double value1, double value2);
int main()
{
time_t t1, t2;
double numRes(0), trueRes(0);
t1 = clock();
for (int i = 0; i < LIM; i++)
{
numRes += sqrootNewton(i+1);
trueRes += sqrt((i+1)/1.0);
}
t2 = clock();
cout << "Numerical result via Newton's method is " << numRes << endl;
cout << "PC arithmetical result is " << trueRes << endl;
75Высокопроизводительные вычисления на Grid системах 2017
cout << "\nInitial clock ticks value is " << t1 << endl;
cout << "Final clock ticks value is " << t2 << endl;
cout << "Difference in clock ticks is " << difftime(t2,t1) << endl;
cout << "Clock ticks per second value is " << CLOCKS_PER_SEC << endl;
cout << "\nActual time of calculations is " << ((t2-t1)/CLOCKS_PER_SEC) << " sec" << endl;
_getch();
return 0;
}
double sqrootNewton(double x) // Newtonian method applied for square root
{
double sq = 1.0;
for (int i = 0; i < N; i++)
sq = returnHalf((sq + multiply(x, 1/sq)));
return sq;
}
double returnHalf(double value)
{
return value*0.5;
}
double multiply(double value1, double value2)
{
return value1*value2;
}
76Высокопроизводительные вычисления на Grid системах 2017
Результаты
Среднее значение времени выполнения:
- SqOd . . . . . 35.69 с.
- Sqip . . . . . . 9.59 с.
77Высокопроизводительные вычисления на Grid системах 2017
Векторизация
Высокопроизводительные вычисления на Grid системах 2017
Векторизацией называется модификация последовательного алгоритма в
параллельный с использованием параллелизма данных.
Параллелизм данных реализуется с помощью упаковки данных в пакеты –
векторы, состоящие из нескольких значений.
Позволяет использовать низкоуровневый SIMD-параллелизм процессоров Intel.
Реализуется:– вручную;
– автоматически (средствами компилятора).
Высокопроизводительные вычисления на Grid системах 2017
Высокопроизводительные вычисления на Grid системах 2017
Векторные расширения набора команд процессора
MMX (MultiMedia Extensions, появилось с Pentium K6) – дополнительные
команды, позволяющие выполнять операции с 64-разрядными целыми значениями
и данными, упакованными в векторы длиной 64 бита.
Данные могут находиться в памяти или в 8 64-разрядных MMX-регистрах.
Примеры операций – поэлементное сложение векторов, Поэлементное вычитание
векторов, поэлементные логические операции, сдвиги, загрузка операндов из
памяти в MMX-регистры и наоборот и другие.
57 команд, 4 новых типа данных.
81Высокопроизводительные вычисления на Grid системах 2017
SSE (Streaming SIMD Extension)
SSE (Pentium III, 1999) – использует 128-разрядные векторные регистры XMM0-7,
«старые» MMX регистры и обычные 32-разрядные регистры. MMX использовало
тот же регистровый файл, что и обычное FPU, SSE использует выделенные
регистры. Имеются отдельные варианты команд для выравненных и
невыравненных данных, например, MOVAPD (move-aligned packed double) и
MOVUPD (move-unaligned packed double) .
70 дополнительных инструкций.
82Высокопроизводительные вычисления на Grid системах 2017
SSE2
SSE2 (Pentium 4, 2000) – операции с двойной точностью и значениями с
плавающей точкой, 64 разряда.
144 дополнительных инструкции.
Arithmetic:
addpd - Adds 2 64bit doubles.
addsd - Adds bottom 64bit doubles.
subpd - Subtracts 2 64bit doubles.
subsd - Subtracts bottom 64bit doubles.
mulpd - Multiplies 2 64bit doubles.
mulsd - Multiplies bottom 64bit doubles.
divpd - Divides 2 64bit doubles.
…
83Высокопроизводительные вычисления на Grid системах 2017
AVX – набор векторных команд
Intel® AVX (Advanced Vector Extensions) расширяет возможности 128-разрядных векторных регистров XMM (16 регистров), позволяя использовать 256-разрядные векторы.
256 разрядов используются в операциях с плавающей точкой.
В других операциях используются младшие 128 разрядов.
84Высокопроизводительные вычисления на Grid системах 2017
AVX – набор векторных команд
Сравнение с SSE.
�Увеличение разрядности векторных регистров с 128 до 256. В следующих версиях AVX планируется довести разрядность до 512 и 1024.
�Добавлены операции над трем операндами, не переписывающие сходные операнды.
�Введены инструкции для операндов, занимающих 4 регистра.
�Смягчены требования к выравниванию операндов. Несмотря на это, рекомендуется работать с выравненными данными. Выравнивание данных – важная тема!
�Используется новая схема кодирования команд, облегчающая дальнейшее расширение набора инструкций.
�Новые Fused-Multiply-Add (FMA) инструкции.85
Высокопроизводительные вычисления на Grid системах 2017
AVX – набор векторных команд
Hardware
�Для поддержки AVX требуются 16 256-разрядных регистров YMM0-YMM15.
�Для поддержки AVX требуется 32-разрядный регистр состояния/управления MXCSR.
�YMM регистры действуют «поверх» старых 128-разрядных регистров XMM0—XMM15.
86Высокопроизводительные вычисления на Grid системах 2017
AVX vs SSE – наборы векторных команд
Пакеты
87Высокопроизводительные вычисления на Grid системах 2017
AVX2 – набор векторных команд
Intel® AVX2 появился в архитектуре Haswell.
AVX векторизация целочисленных типов расширена до 256-разрядного формата и операций с ними. Этот тип используется в мультимедийных приложениях. В AVX2 для значений с плавающей точкой используется AVX, а для целых – AVX2.
Добавлены инструкции для операций с двоичными разрядами. Используются для работы с базами данных, арифметики больших чисел и в других задачах.
Появились инструкции GATHER, для которых не требуется, чтобы данные находились в непрерывных участках памяти.
FMA (Fused Multiply-Add) - одна инструкция выполняет несколько операций над упакованными данными.
88Высокопроизводительные вычисления на Grid системах 2017
Векторизация вручную
Векторизация поддерживается большинством x86 ассемблеров, в том числе: Microsoft MASM (Microsoft
Visual Studio* 2010 version), NASM, FASM, YASM.
Высокоуровневая поддержка.
Intel® C++ Compiler version 11.1 и новее, а также Intel® Fortran Compilers поддерживают Intel® AVX
посредством ключей компилятора. Поддерживается также автоматическая векторизация циклов с
вычислениями с плавающей точкой.
Компилятор Intel C++ поддерживает интринсики Intel AVX (надо использовать #include <immintrin.h>) и
ассемблерные вставки, а также поддерживает эмуляцию интринсиков Intel AVX (надо использовать #include
"avxintrin_emu.h").
Высокопроизводительные вычисления на Grid системах 2017
Векторизация вручную
Высокоуровневая поддержка.
Microsoft Visual Studio* C++ 2010 с SP1 и новее поддерживает Intel AVX при компиляции 64-разрядного
кода (с ключом /arch:AVX compiler switch). Поддерживает интринсики (с заголовокм <immintrin.h>. Не
поддерживает инлайнинг ассемблера.
GNU Compiler Collection (GCC), version 4.4 поддерживает интринсики Intel AVX (<immintrin.h>). Intel
активно участвует в развитии поддержки AVX-векторизации GCC.
Высокопроизводительные вычисления на Grid системах 2017
Векторизация вручную
Высокоуровневая поддержка.
Интринсик – функция, вместо вызова которой компилятор подставляет ассемблерный код.
Формат AVX интринсиков:
_mm256_op_suffix(data_type param1, data_type param2, data_type param3)
где:
_mm256 – префикс, обозначающий использование 256-разрядных регистров;
_op – обозначение операции;
_suffix – тип данных (см. таблицу);
param1 и param2 – регистры с данными;
param3 – может отсутствовать, если имеется, это целочисленная маска, селектор или сдвиг.
Высокопроизводительные вычисления на Grid системах 2017
Векторизация вручную
Высокоуровневая поддержка.
Marking Meaning
[s/d] Single- or double-precision floating point
[i/u]nnnSigned or unsigned integer of bit size nnn, where nnn
is 128, 64, 32, 16, or 8
[ps/pd/sd] Packed single, packed double, or scalar double
epi32 Extended packed 32-bit signed integer
si256 Scalar 256-bit integer
Высокопроизводительные вычисления на Grid системах 2017
Векторизация вручную
Высокоуровневая поддержка.
Type Meaning
__m256256-bit as eight single-precision floating-point values,
representing a YMM register or memory location
__m256d256-bit as four double-precision floating-point values,
representing a YMM register or memory location
__m256i 256-bit as integers, (bytes, words, etc.)
__m128 128-bit single precision floating-point (32 bits each)
__m128d 128-bit double precision floating-point (64 bits each)
Intel® AVX Intrinsics Data Types
Высокопроизводительные вычисления на Grid системах 2017
Векторизация вручную
Высокоуровневая поддержка.
Директивы компилятору.
Высокопроизводительные вычисления на Grid системах 2017
Компиляторная векторизацияИсходный
текст
программы
Автоматический анализ
Подсказки для векторизации
(прагмы ivdep и vector)
Индексная нотация
Элементные функции
Прагма SIMD
Средства реализации
векторного параллелизма
Векторизатор(отображает векторный
параллелизм на
векторную архитектуру)
SSE AVX MIC
Оптимизация и генерация кода
Высокопроизводительные вычисления на Grid системах 2017
Протокол векторизации
Содержит сообщения об успешно выполненной векторизации и проблемах:
Linux, Mac OS X: -vec-report<n>
Windows: /Qvec-report<n>
n диагностические сообщения
� 0 не выводить диагностические сообщения;
� 1 выводить сообщения о векторизованных циклах (действует по умолчанию);
� 2 выводить сообщения о векторизованных и невекторизованных циклах;
� 3 выводить сообщения о векторизованных и невекторизованных циклах и любых
установленных и предполагаемых зависимостях по данным;
� 4 выводить сообщения о невекторизованных циклах;
� 5 выводить сообщения о невекторизованных циклах и причине того, что
векторизация не удалась;
� 6 вывод более подробных сообщений о векторизованных и невекторизованных
циклах и любых установленных и предполагаемых зависимостях по данным.
Высокопроизводительные вычисления на Grid системах 2017
Пример
Протокол оптимизации, ключ–opt-report
Высокопроизводительные вычисления на Grid системах 2017
Intel® VTune Amplifier XE 2013
Высокопроизводительные вычисления на Grid системах 2017
Intel® VTune Amplifier XE 2013 – инструмент динамического анализа приложений.
Многоплатформенный: MS Windows (включая Windows Server 2012), Linux.
Архитектуры: Intel® Xeon Phi, Sandy Bridge-EP (Xeon E5), Ivy Bridge (22-нм Core i5 и i7) и другие.
Частичная несовместимость с Hyper V.
Поддержка: C/C++, Fortran, .NET, ассемблер, JAVA, C#.
Интеграция с Microsoft Visual Studio (включая VS 2012).
Возможность работы в режиме командной строки (CLI).
Поддержка автономного интерфейса.
Широкий спектр видов анализа.
Поддержка регрессионного тестирования производительности.
Возможность сравнения результатов тестирования производительности.
Высокопроизводительные вычисления на Grid системах 2017
Для выполнения анализа приложения требуется:
� исполняемый (бинарный) файл;
� исходный файл (не обязательно, но желательно, поскольку в этом случае результаты сбора
статистики можно «привязать» к исходному коду программы).
Необходим правильно
подготовленный тестовый
набор данных, соответствующий
«стандартной» для данного
приложения ситуации. Запуск
приложения с этим набором
данных даёт опорную точку, по
которой будет определяться
эффективность различных
методов оптимизации
производительности.
100Высокопроизводительные вычисления на Grid системах 2017
101Высокопроизводительные вычисления на Grid системах 2017
102Высокопроизводительные вычисления на Grid системах 2017
103Высокопроизводительные вычисления на Grid системах 2017
104Высокопроизводительные вычисления на Grid системах 2017
105Высокопроизводительные вычисления на Grid системах 2017
Метрики производительности
Метрика Описание
Available CPU Time Общее время выполнения на всех ядрах
CPI Cycles Per Instruction. Метрика, на которую следует обратить внимание в первую
очередь. Хорошее значение 0.75, плохое значение 4. «Плохое» значение CPI может
означать как неудачную организацию вычислений, так и неоптимальное
использование логических ядер процессора (с технологией HT).
CPU Time Время, затраченное активным процессором на выполнение потока. В
многопоточном случае суммируется по всем потокам (логическим ядрам).
CPU Time by Utilization Время, затраченное активным процессором на выполнение функции (время
выполнения вызываемых функций не учитывается).
CPU Time:Total Время, затраченное активным процессором на выполнение функции и всех
вызываемых из неё функций.
Cx Residency Время, проведённое в состоянии сна.
Elapsed Time Время выполнения программы = время завершения программы – время запуска
программы.
106Высокопроизводительные вычисления на Grid системах 2017
Метрика Описание
Idle Time Время, в течение которого нить неактивна, а система не может переключиться на
выполнение другой задачи.
Inactive Time Время, в течение которого нить остаётся вытесненной из исполнения.
Overhead Time Время, в течение которого проходит с момента освобождения ресурса его
предыдущим обладателем до захвата следующим собственником. Чем меньше это
время, тем лучше. Если объём работы фиксирован, а степень параллелизма
увеличивается, Overhead Time будет расти.
Spin Time Wait Time, в течение которого процессор был занят. Spin возникает, когда
программные средства синхронизации выполняют опрос ЦП, в то время как поток
находится в состоянии ожидания.
Total Thread Count Количество исполняющихся потоков.
Wait Time Длительность простоя потока в результате действия механизмов синхронизации.
Synchronization Context Switches Количество переключений контекста в результате явного вызова функций
синхронизации.
и другие, всего около 35
107Высокопроизводительные вычисления на Grid системах 2017
Метрики производительности, основанные на аппаратных событиях
Метрика Событие Описание
False Sharing Простой процессора в результате попытки доступа к разным
элементам данных, находящихся в одной строке кэш-памяти.
Assists FP_ASSIST.ANY Некоторые операции могут быть выполнены не аппаратно, а
только с помощью микрокода (например, арифметические
операции с денормализованными числами). Объём
микропрограммы – несколько сотен команд.
L1 Misses Промахи кэш-памяти 1 уровня. Для Intel® XeonТМ Phi.
Branch
Mispredict
BR_MISP_RETIRED.ALL_BRANCHES_PS Ошибка предсказания ветвления. Если ветвление предсказано
неправильно, инструкции из неправильно предсказанной ветви
всё равно выполняются. Это лишние затраты времени.
Cache Usage Эффективность использования кэш-памяти. Связана с
локальностью данных. Характерное время доступа к данным из
L1 20 тактов, из L2 250 тактов.
LLC Miss Промахи кэш-памяти уровня, ближайшего к оперативной памяти.
Split
Loads/Split
Stores
Загрузка/выгрузка элемента данных, когда он занимает 2 строки
кэш-памяти (длина строки 64 байта).
108Высокопроизводительные вычисления на Grid системах 2017
Метрика Событие Описание
DTLB Overhead DTLB_LOAD_MISSES.STLB_HIT
DTLB_MISSESDTLB (Data Translation Look-ahead Buffers) позволяют минимизировать
обращения к таблице страниц, используемой при работе с виртуальной
памятью. Буферы организованы в многоуровневую иерархию, чем
больше путь к требуемым данным, тем больше накладные расходы.
Memory Bus
Transactions
Количество транзакций через шину.
Vectorization
Usage
Для Intel® XeonТМ Phi. Отношение числа элементов данных,
обработанных векторными инструкциями, к числу векторных
инструкций. Значения 8, 16 соответствуют хорошей векторизации
циклов.
Bus Lock Блокировки доступа к шине. Возникают при использовании различных
видов синхронизации.
Execution Stalls RESOURCE_STALLS.ANY Вычислительные ресурсы ЦП используются полностью, однако
операции с большой латентностью сериализуются, ожидая критически
важные ресурсы.
Issued uOps UOPS_ISSUED.ANY Количество микроинструкций, выполняемых ядром. На каждом такте
аппаратный поток генерирует до 4 микроинструкций. Если реальное
количество меньше, производительность.
ICache Misses ICACHE.MISSES Промахи кэш-памяти декодированных инструкций.
Другие.
109Высокопроизводительные вычисления на Grid системах 2017
Intel® VTune™ Amplifier позволяет: � определить, какие части программы содержат «хотспоты» (потребляют большую часть
процессорного времени);
� определить, какие последовательности вызовов определяют производительность
приложения;
� определить, какие части программы неэффективно используют процессор;
� выявить объекты синхронизации, которые негативно влияют на производительность
программы;
� локализовать участки кода, в которых неэффективно используются аппаратные ресурсы:
память, шина и др.;
� анализировать производительность, конфликты потоков, простои, энергопотребление;
� определить, где и почему работа приложения приводит к неэффективному потреблению
электроэнергии (только в Linux);
� другие виды анализа (в том числе Frame и Task анализ).
110Высокопроизводительные вычисления на Grid системах 2017
Результаты расширенного анализа аппаратной EBS-статистики отображаются с помощью
предустановленных средств просмотра:
� Hotspots – определение фрагментов программы, на выполнение которых затрачивается
наибольшая часть процессорного времени.
� Hardware Event Counts – счётчик событий процессора.
� Hardware Event Sample Counts – счётчик полной статистики событий процессора.
� Hardware Issues – определение фрагментов программы, неэффективно использующих
аппаратные ресурсы.
� General Exploration – определение проблем, связанных с неэффективным использованием
ресурсов микроархитектуры Sandy Bridge и Intel® Atom™.
� Bandwidth – определение фрагментов программы, генерирующих большой поток данных в
DRAM для микроархитектур Sandy Bridge, Ivy Bridge и Nehalem.
� Если выбрана опция Collect stacks, все средства просмотра дополняются метриками,
помогающими определить критические пути вызовов функций, проанализировать
конфликты потоков и энергопотребление для этих путей.
111Высокопроизводительные вычисления на Grid системах 2017
Эффективность использования процессора� Idle – все ядра находятся в состоянии ожидания. Ни один поток не выполняется.
� Poor – доля одновременно работающих ядер < 50%.
� Ok – доля одновременно работающих ядер от 51% до 85%.
� Ideal – доля одновременно работающих ядер > 86%.
Эффективность многопоточного параллелизма� Idle – все потоки находятся в состоянии ожидания. Ни один поток не выполняется.
� Poor – низкая эффективность. Доля используемых потоков < 50% от степени параллелизма
архитектуры.
� Ok – хорошая эффективность. Доля используемых потоков от 51% до 85% от степени
параллелизма архитектуры.
� Ideal – очень хорошая эффективность. Доля используемых потоков от 86% до 115% от степени
параллелизма архитектуры.
� Over – избыточная эффективность. Доля используемых потоков > 115% от степени параллелизма
архитектуры.
Высокопроизводительные вычисления на Grid системах 2017
Виды анализа Intel® Vtune Amplifier XE
Algorithm analysis
� Basic Hotspots. Интервал сбора статистики 10 мс. Используются ЦП таймеры высокой точности. Интервал
сбора статистики GPU 1000 мкс. Построение временной диаграммы. Сбор статистики по пользовательским
задачам.
� Advanced Hotspots. Используется для определения положения «хотспотов». В дополнение к
базовому уровню анализируются стеки вызовов, переключения контекста, анализируется метрика CPI
и другие аспекты. Анонсированы небольшие накладные расходы. Для сбора статистики используется
драйвер. Статистика собирается по событиям CPU_CLK_UNHALTED.REF_TSC,
CPU_CLK_UNHALTED.THREAD, INST_RETIRED.ANY.
� Concurrency. Анализ реализации многопоточного параллелизма на уровне логических ядер. Этот
вид анализа может использоваться для поиска избыточной синхронизации и накладных расходов.
� Locks and Waits. Блокировки и простои. Этот вид анализа позволяет определить ожжидание при
синхронизации, операций ввода-вывода, а также их влияние на производительность приложения.
Высокопроизводительные вычисления на Grid системах 2017
Intel Core 2 Processor Analysis� General Exploration.
� Memory Accsess.
� Bandwidth.
� Bandwidth Breakdown.
� Cycles and uOps.
Nehalem / Westmere Analysis
(Core i5, Core i7, Xeon E7, …)� General Exploration.
� Memory Access.
� Read Bandwidth.
� Write Bandwidth.
� Cycles and uOps.
� Front End Investigation.Sandy Bridge / Ivy Bridge / Haswell Analysis
(Intel® XeonTM E5, Core i3, Core i5, Core i7, …)� General Exploration. Около 40 событий.
� Memory Access. Более 10 событий.
� Bandwidth. Оценка объёма данных, считываемых из и записываемых в память
через контроллер памяти, определение, достигается ли насыщение пропускной
способности. 4 события.
� Access Contention. Анализ работы с кэш-памятью, блокировок, влияющих на
быстродействие и т.л.
� Cycles and uOps.
� Branch Analysis. Анализ эффективности предсказания ветвлений.
� Client Analysis.
� Core Port Saturation.
� Port Saturation.
Высокопроизводительные вычисления на Grid системах 2017
Intel Atom Processor AnalysisGeneral Exploration.
Knights Corner Platform Analysis
(Intel® XeonTM Phi)� Hotspots.
� General Exploration.
� Bandwidth.
Power Analysis� CPU Sleep States.
� CPU Frequency.
Custom Analysis
Высокопроизводительные вычисления на Grid системах 2017
Intel® Inspector XE 2013
116Высокопроизводительные вычисления на Grid системах 2017
Многоплатформенный: MS Windows, Linux.
Поддержка: C/C++, C#, Fortran.
Интеграция с Microsoft Visual Studio (включая VS 2012).
Специальная подготовка кода не требуется.
Поиск и локализация:
� некорректного доступа к памяти;
� утечек памяти;
� некорректного использования указателей;
� переполнения буферов;
� гонок за данными (heap races, stack races);
� взаимных блокировок;
� доступа к чужим стекам;
� и других ошибок работы с памятью и реализации многопоточности.
Поддержка Intel® XeonTM Phi.
Возможность анализа MPI-приложений на ошибки памяти и ошибки многопоточности.
Поддержка Intel® TBB, Intel® CilkTM Plus, OpenMP.
Возможность ограничивать область анализа.
Поддержка командной работы над проектом.
Высокопроизводительные вычисления на Grid системах 2017
Высокопроизводительные вычисления на Grid системах 2017
Высокопроизводительные вычисления на Grid системах 2017
Высокопроизводительные вычисления на Grid системах 2017
Высокопроизводительные вычисления на Grid системах 2017
Высокопроизводительные вычисления на Grid системах 2017
Высокопроизводительные вычисления на Grid системах 2017
Высокопроизводительные вычисления на Grid системах 2017
Высокопроизводительные вычисления на Grid системах 2017
Высокопроизводительные вычисления на Grid системах 2017