# Библиотека ABLAS

Этот документ описывает библиотеку ABLAS - компактную библиотеку базовых операций линейной алгебры с поддержкой SSE2. Библиотека ABLAS используется программами, входящими в состав проекта ALGLIB для ускорения работы алгоритмов линейной алгебры. На данный момент только C++ версия ALGLIB может использовать ABLAS, однако в перспективе планируется добавление поддержки ABLAS в версии ALGLIB на других языках.

# Язык, компилятор и операционная система

Библиотека написана на Pascal. Компилятор - FreePascal (для компилирования использовалась версия 2.2.0). Текущая версия библиотеки поддерживает только Win32.

# Распространение и лицензия

Библиотека ABLAS распространяется на основе лицензии BSD. Распространение осуществляется в виде предварительно откомпилированных двоичных файлов и в виде исходных кодов. Эти файлы можно скачать со страницы ABLAS по адресу http://alglib.sources.ru/projects/ablas/.

# Возможности

Библиотека поддерживает операции с векторами из вещественных чисел двойной точности, элементы которых расположены в памяти последовательно, без промежутков. Такие векторы соответствуют одномерным массивам и строкам двухмерных массивов в большинстве языков высокого уровня. Доступны следующие типы операций:

- скалярное произведение - подпрограмма `ASMDotProduct1`
- копирование - подпрограмма `ASMMove1`
- копирование с умножением на число - подпрограмма `ASMMoveS1`
- копирование с умножением на -1 - подпрограмма `ASMMoveNeg1`
- добавление вектора - подпрограмма `ASMAdd1`
- добавление вектора с умножением добавляемого вектора на число - `ASMAddS1`
- вычитание вектора - подпрограмма `ASMSub1`
- inplace-умножение вектора на число - подпрограмма `ASMMulS1`

Для каждой операции доступны следующие типы реализаций, выбираемые автоматически в зависимости от процессора и операндов:

- реализация с использованием SSE2 - выровненный вариант. Используется, если оба операнда выровнены по 64-битной границе (что после предобработки данных эквивалентно выровниванию по 128-битной границе). Эта реализация обеспечивает максимальное быстродействие.
- реализация с использованием SSE2 - частично выровненный вариант. Используется, если только один из операндов выровнен по 64-битной границе. Эта реализация по скорости уступает предыдущей.
- реализация с использованием сопроцессора - используется, если ни один из операндов не выровнен по 64-битной границе.

# Использование ABLAS в C++

Для того, чтобы программы пакета ALGLIB могли использовать ABLAS, требуется выполнить два действия. Во-первых, укажите в настройках компилятора (или определите при помощи директивы `define`) символ `AP_WIN32`. Этот символ сообщит пакету ALGLIB о том, что он работает под управлением Windows и может использовать соответствующие функции операционной системы для поиска и загрузки дополнительных библиотек. Во-вторых, поместите файл библиотеки (`ablas.dll`) в тот же каталог, что и исполняемый файл вашей программы. После выполнения этих двух действий библиотека будет автоматически обнаружена и загружена при запуске вашей программы.

# Использование ABLAS в других языках программирования

На данный момент интерфейсы к ABLAS для других языков программирования отсутствуют.