Параллелизм в библиотеке Intel® Math Kernel Library

Parallelism in the Intel® Math Kernel Library [Eng., PDF 171KB]

Введение

Использование программных библиотек – это простой способ достичь немедленного увеличения производительности в многоядерных, многопроцессорных и кластерных компьютерных системах. Библиотека Intel® Math Kernel Library (Intel® MKL) содержит большой набор функций, который будет полезен в приложениях с большим количеством математических операций. В данной статье описывается, как Intel MKL помогает достичь прекрасной последовательной и параллельной производительности в обычных приложениях. Приведённый материал применим к системам на процессорах IA-32 и Intel® 64 с операционными системами Windows*, Linux*, и Mac OS* X.

Вводные данные

Оптимальная производительность в современных многопроцессорных и многоядерных системах достигается только тогда, когда используются все возможности параллелизма и учитываются особенности устройства памяти. Для достижения оптимальной производительности последовательный код должен широко опираться на параллелизм уровня SIMD команд и регистров, а также использование кэш-блокинга. В параллельных программах применяют развитые стратегии группировки данных в блоки для более эффективного использования множественных ядер и процессоров и равномерного распределения параллельных задач. В некоторых случаях для сложных задач, которые не помещаются в памяти, могут быть использованы внешние (out-of-core) реализации.

Рекомендации

Один из самых простых способов применить параллелизм в приложении с интенсивными математическими расчётами ¬– использовать многопоточную оптимизированную библиотеку. Это не только поможет сэкономить время разработки, но также и существенно уменьшит объём тестирования. Применение стандартизованных API делает код более переносимым.

Intel MKL предоставляет обширный набор математических функций, распараллеленных и оптимизированных для использования на новейших процессорах Intel®. При первом вызове какой-либо функции библиотеки происходит проверка аппаратных возможностей системы, в которой запущена программа. На основе данных проверки выбирается вариант кода, который даёт максимально эффективное использование параллелизма SIMD команд и регистров, выбирается наилучшая стратегия кэш-блокинга. Библиотека Intel MKL является потокобезопасной, что означает, что её функции будут корректно работать при одновременном вызове из нескольких потоков.

Библиотека Intel MKL собрана с помощью компиляторов Intel® C++ и Fortran и распараллелена через OpenMP. Её алгоритмы сконструированы таким образом, чтобы соблюдался баланс данных и задач и эффективно использовались ресурсы процессоров. В приведённой таблице показаны разделы математики, для которых имеются распараллеленные функции (данные основаны на Intel MKL 10.2 Update 3):

Линейная алгебра Используется в различных программах от анализа методом конечных элементов до современных анимаций
BLAS (Basic Linear Algebra Subprograms) Все операции матрица-матрица (уровень 3) распараллелены как для плотных, так и для разреженных объектов. Многие операции вектор-вектор (уровень 1) и матрица-вектор (уровень 2) распараллелены для плотных матриц при работе в 64-разрядный программах на архитектуре Intel® 64. В случае разрежённых матриц, распараллелены все операции второго уровня, за исключением разрежённых треугольных решателей.
LAPACK (Linear Algebra Package) Несколько функций распараллелены для следующих типов задач: решение линейных уравнений, ортогональная факторизация, сингулярное разложение, симметричные задачи собственных значений. LAPACK также использует функции BLAS, так что даже не распараллеленные функции могут работать параллельно.
ScaLAPACK (Scalable LAPACK) Параллельная версия LAPACK с распределенной памятью, предназначенная для кластерных систем.
PARDISO В этом параллельном прямом разрежённом решателе распараллелены все три этапа: перераспределение (опционально), факторизация и решение (при решении со множественными правыми частями).
Быстрые преобразования Фурье Используются для обработки сигналов и в разнообразных приложениях от разведки нефти до медицины.
Распараллеленные БПФ Распараллелены все функции, за исключением одномерных массивов действительных чисел и сплит-комплексных БПФ.
Кластерные БПФ Параллельные БПФ с распределённой памятью, предназначены для кластерных систем.
Векторная математика Используется в финансовых приложениях
Библиотека векторной математики Арифметика, тригонометрия, экспоненты, логарифмы, округление и т.д.

Поскольку при создании и управлении потоками возникают некоторые издержки, не всегда выгодно использовать многопоточность. По этой причине Intel MKL не создаёт потоки для мелких задач. Размер, который считается мелким, оценивается по отношению к разделу математики и типу функции. Для BLAS третьего уровня потоки подключаются при размерности 20, в то время как BLAS первого уровня и векторные функции не параллелятся для векторов размерностью меньше 1000.

Intel MKL будет работать на одном потоке в случае вызова из распараллеленного приложения, чтобы избежать такого явления, как oversubscription. Для приложений, распараллеленных с помощью OpenMP, это происходит автоматически. Если для создания параллельности используются другие средства, то поведение Intel MKL следует регулировать с помощью методов, описанных ниже. Для случая, когда функции библиотеки вызываются в последовательном режиме из нескольких потоков, Intel MKL имеет несколько полезных функций. Например, библиотека Vector Statistical Library (VSL) предоставляет набор векторизованных генераторов случайных чисел, которые не распараллелены, но которые имеют возможность разделять последовательность случайных чисел между потоками программы. Функция SkipAheadStream() разделяет последовательность случайных чисел на отдельные блоки, по одному на поток. Функция LeapFrogStream() разделяет последовательность случайных чисел таким образом, что каждый поток получает подпоследовательность начальной последовательности. Например, чтобы разделить последовательность между двумя потоками по методу чехарды (Leapfrog), то все числа с чётными индексами назначаются одному потоку, а с нечетными – другому.

Производительность

На рис. 1 показан пример производительности, которую пользователь может ожидать от DGEMM – функции умножения двух матриц двойной точности, которая включена в Intel MKL. Функции BLAS играют важную роль в работе многих приложений. График показывает производительность в Gflops для разных размеров матриц. Показано, как производительность растёт с увеличением количества процессоров (ускорение до 1,9х на двух потоках, 3,8х на четырёх и 7,9х на восьми), достигая 94,3% пиковой производительности при 96,5 Gflops.


Рис. 1. Производительность и масштабируемость функции умножения матриц BLAS.

Применение

Поскольку библиотека Intel MKL распараллелена с использованием OpenMP, то её поведение можно контролировать с помощью того же OpenMP. Для добавочного контроля за поведением потоков в Intel MKL есть несколько сервисных функций, которые дублируют контрольные функции OpenMP. Эти функции позволяют контролировать количество используемых библиотекой потоков, как в целом, так и в зависимости от раздела (т.е. отдельно для BLAS, LAPACK и т.д.). Такие независимые контрольные функции можно применять, например, для вложенного параллелизма. Поведение приложения, распараллеленного с помощью OpenMP, можно контролировать с помощью переменной окружения OMP_NUM_THREADS или функции omp_set_num_threads(), в то время как поведение потоков Intel MKL независимо устанавливается через собственные переменную и функцию MKL_NUM_THREADS и mkl_set_num_threads(). Наконец, для тех, кому всегда нужно запускать функции Intel MKL только на одном потоке, существует последовательная версия библиотеки, совершенно независимая от распараллеливающей библиотеки.

Технология Intel® Hyper-Threading более всего эффективна тогда, когда все потоки выполняют разные типы операций и в процессоре присутствуют недозагруженные ресурсы. Однако Intel MKL не соответствует этим условиям, поскольку параллельная часть библиотеки использует большую часть ресурсов и в каждом потоке выполняются идентичные операции. По этой причине Intel MKL по умолчанию использует количество потоков, равное количеству физических ядер.

Пожалуйста, обратитесь к странице Уведомление об оптимизации для более подробной информации относительно производительности и оптимизации в программных продуктах компании Intel.
Возможность комментирования русскоязычного контента была отключена. Узнать подробнее.