Введение
Рутинные процедуры для выполнения общих операций линейной алгебры. Основные подпрограммы линейной алгебры (BLAS) – это спецификация, определяющая набор низкоуровневых подпрограмм для выполнения общих операций линейной алгебры, таких как сложение векторов, скалярное умножение, скалярное произведение, линейные комбинации и умножение матриц. Они являются де-факто стандартными низкоуровневыми подпрограммами для библиотек линейной алгебры; эти подпрограммы имеют привязки как для C ("интерфейс CBLAS"), так и для Fortran ("интерфейс BLAS"). Хотя спецификация BLAS является общей, реализации BLAS часто оптимизированы для скорости на конкретном аппаратном обеспечении, поэтому их использование может обеспечить существенные преимущества в производительности. Реализации BLAS используют специальное оборудование для работы с плавающей точкой, такое как векторные регистры или SIMD-инструкции. Изначально BLAS была разработана как библиотека Fortran в 1979 году, а её интерфейс был стандартизирован форумом BLAS Technical (BLAST). Последний отчёт о BLAS можно найти на веб-сайте netlib. Эта библиотека на Fortran известна как эталонная реализация (иногда ошибочно называемая библиотекой BLAS) и не оптимизирована для скорости, но находится в общественном достоянии. Большинство библиотек, предлагающих подпрограммы линейной алгебры, соответствуют интерфейсу BLAS, что позволяет пользователям разрабатывать программы, не зависящие от конкретной используемой библиотеки BLAS. Было разработано множество библиотек BLAS, ориентированных на различные аппаратные платформы. Примеры включают cuBLAS (NVIDIA GPU, GPGPU), rocBLAS (AMD GPU) и OpenBLAS. Примеры ветвей библиотек BLAS, работающих на базе CPU, включают: OpenBLAS, BLIS (BLAS-like Library Instantiation Software), Arm Performance Libraries, ATLAS и Intel Math Kernel Library (iMKL). AMD поддерживает форк BLIS, оптимизированный для платформы AMD. ATLAS – это переносимая библиотека, которая автоматически оптимизируется для произвольной архитектуры. iMKL – это бесплатная и проприетарная библиотека поставщика, оптимизированная для x86 и x86-64 с акцентом на производительность процессоров Intel. OpenBLAS – это библиотека с открытым исходным кодом, оптимизированная вручную для многих популярных архитектур. Бенчмарки LINPACK в значительной степени полагаются на подпрограмму gemm BLAS для измерения производительности. Многие приложения для численных расчётов используют библиотеки, совместимые с BLAS, для выполнения вычислений линейной алгебры, включая LAPACK, LINPACK, Armadillo, GNU Octave, Mathematica, MATLAB, NumPy, R, Julia и Lisp Stat.
Basic Linear Algebra Subprograms (BLAS) is a specification that prescribes a set of low level routines for performing common linear algebra operations such as vector addition, scalar multiplication, dot products, linear combinations, and matrix multiplication. They are the de facto standard low level routines for linear algebra libraries; the routines have bindings for both C ("CBLAS interface") and Fortran ("BLAS interface"). Although the BLAS specification is general, BLAS implementations are often optimized for speed on a particular machine, so using them can bring substantial performance benefits. BLAS implementations will take advantage of special floating point hardware such as vector registers or SIMD instructions. It originated as a Fortran library in 1979 and its interface was standardized by the BLAS Technical (BLAST) Forum, whose latest BLAS report can be found on the netlib website. This Fortran library is known as the reference implementation (sometimes confusingly referred to as the BLAS library) and is not optimized for speed but is in the public domain. Most libraries that offer linear algebra routines conform to the BLAS interface, allowing library users to develop programs that are indifferent to the BLAS library being used. Many BLAS libraries have been developed, targeting various different hardware platforms. Examples includes cuBLAS (NVIDIA GPU, GPGPU), rocBLAS (AMD GPU), and OpenBLAS. Examples of CPU based BLAS library branches include: OpenBLAS, BLIS (BLAS like Library Instantiation Software), Arm Performance Libraries, ATLAS, and Intel Math Kernel Library (iMKL). AMD maintains a fork of BLIS that is optimized for the AMD platform. ATLAS is a portable library that automatically optimizes itself for an arbitrary architecture. iMKL is a freeware and proprietary vendor library optimized for x86 and x86 64 with a performance emphasis on Intel processors. OpenBLAS is an open source library that is hand optimized for many of the popular architectures. The LINPACK benchmarks rely heavily on the BLAS routine gemm for its performance measurements. Many numerical software applications use BLAS compatible libraries to do linear algebra computations, including LAPACK, LINPACK, Armadillo, GNU Octave, Mathematica, MATLAB, NumPy, R, Julia and Lisp Stat.
Предыстория
С появлением численного программирования полезными стали сложные библиотеки подпрограмм. Эти библиотеки содержали подпрограммы для общих математических операций высокого уровня, таких как поиск корней, инверсия матриц и решение систем уравнений. Языком выбора был FORTRAN. Наиболее известной библиотекой численного программирования был пакет научных подпрограмм (SSP) компании IBM. Эти библиотеки подпрограмм позволяли программистам сосредоточиться на своих конкретных задачах и избегать повторной реализации известных алгоритмов. Библиотечные процедуры, как правило, были лучше средних реализаций; например, матричные алгоритмы могли использовать полный поворот для достижения более высокой численной точности. В библиотеке также были более эффективные процедуры. Например, библиотека могла включать программу для решения верхнетреугольной матрицы. Библиотеки содержали версии алгоритмов одинарной и двойной точности. Первоначально в этих подпрограммах для операций низкого уровня использовались жестко закодированные циклы. Например, если подпрограмме требовалось выполнить умножение матриц, то в подпрограмме было бы три вложенных цикла. Программы линейной алгебры имеют множество общих операций низкого уровня (так называемые "ядерные" операции, не связанные с операционными системами). В период с 1973 по 1977 год ряд этих операций были идентифицированы. Эти ядерные операции стали определенными подпрограммами, которые могли вызываться математическими библиотеками. Вызовы к ядру имели преимущества перед жестко закодированными циклами: библиотечная процедура была более читаемой, вероятность ошибок была меньше, а реализация ядра могла быть оптимизирована по скорости. Спецификация для этих ядерных операций с использованием скаляров и векторов, Базовые подпрограммы линейной алгебры 1-го уровня (BLAS), была опубликована в 1979 году. BLAS использовались для реализации библиотеки подпрограмм линейной алгебры LINPACK. Абстракция BLAS позволяет настраивать для достижения высокой производительности. Например, LINPACK — это библиотека общего назначения, которую можно использовать на различных машинах без изменений. LINPACK может использовать универсальную версию BLAS. Для повышения производительности различные машины могут использовать специализированные версии BLAS. По мере усложнения компьютерных архитектур появились векторные машины. BLAS для векторной машины мог использовать быстрые векторные операции машины. (Хотя векторные процессоры в конечном итоге утратили популярность, векторные инструкции в современных процессорах необходимы для оптимальной производительности в BLAS-рутинах.) Стали доступны и другие аппаратные возможности, которые также можно было использовать. Следовательно, с 1984 по 1986 год BLAS был расширен операциями ядра 2-го уровня, касающимися векторно-матричных операций. Иерархия памяти также была признана важным фактором, который можно использовать. Многие компьютеры имеют кэш-память, которая намного быстрее основной памяти; локализация матричных операций позволяет лучше использовать кэш. В 1987 и 1988 годах были определены BLAS 3-го уровня для выполнения матрично-матричных операций. BLAS 3-го уровня способствовали использованию блочно-разделенных алгоритмов. Библиотека LAPACK использует BLAS 3-го уровня. Первоначальный BLAS касался только плотно хранимых векторов и матриц. Дальнейшие расширения BLAS, например, для разреженных матриц, также были рассмотрены.
Функциональность
Функциональность BLAS подразделяется на три набора подпрограмм, называемых "уровнями", которые соответствуют как хронологическому порядку определения и публикации, так и степени полинома в сложности алгоритмов. Операции BLAS уровня 1 обычно выполняются за линейное время, O(n), операции уровня 2 – за квадратичное время, а операции уровня 3 – за кубическое время. Современные реализации BLAS обычно предоставляют все три уровня.
Библиотеки, использующие BLAS
Armadillo Armadillo – это библиотека линейной алгебры на C++, стремящаяся к хорошему балансу между скоростью и простотой использования. Она использует классы шаблонов и поддерживает опциональное подключение к BLAS/ATLAS и LAPACK. Разработка спонсируется NICTA (в Австралии) и распространяется под свободной лицензией. LAPACK LAPACK – это библиотека линейной алгебры более высокого уровня, построенная на основе BLAS. Как и в случае с BLAS, существует эталонная реализация, но также доступны различные альтернативы, такие как libFlame и MKL. Mir Mir – это универсальная числовая библиотека для науки и машинного обучения, написанная на языке D и использующая ускорение LLVM. Она предоставляет универсальные подпрограммы линейной алгебры (GLAS) и может быть построена на основе реализации CBLAS.
Подобные библиотеки (не совместимы с BLAS)
Elemental – это программное обеспечение с открытым исходным кодом для распределенных вычислений в области плотной и разреженной линейной алгебры и оптимизации. HASEM – это библиотека шаблонов C++, предназначенная для решения систем линейных уравнений и вычисления собственных значений. Она распространяется под лицензией BSD. LAMA (Library for Accelerated Math Applications) – это библиотека шаблонов C++ для разработки численных решателей, ориентированных на различные типы аппаратного обеспечения (например, графические процессоры через CUDA или OpenCL) в распределенных системах памяти, скрывая от разработчика специфику программирования для конкретного оборудования. MTL4 (Matrix Template Library version 4) – это универсальная библиотека шаблонов C++, предоставляющая функциональность BLAS для работы с разреженными и плотными матрицами. MTL4 обеспечивает интуитивно понятный интерфейс (подобный MATLAB) и широкую область применения благодаря использованию обобщенного программирования.
MTL4 The Matrix Template Library version 4 is a generic C++ template library providing sparse and dense BLAS functionality. MTL4 establishes an intuitive interface (similar to MATLAB) and broad applicability thanks to generic programming.
Небольшие BLAS
В течение истории библиотеки было предложено несколько расширений BLAS для работы с разреженными матрицами; небольшой набор базовых подпрограмм для разреженных матриц был наконец стандартизирован в 2002 году.