Какая связь между BLAS, LAPACK и ATLAS

147

Я не понимаю, как связаны BLAS, LAPACK и ATLAS и как я должен использовать их вместе! Я просмотрел все их руководства, и у меня есть общее представление о BLAS и LAPACK и о том, как их использовать, с очень немногими примерами, которые я нахожу, но я не могу найти никаких реальных примеров использования ATLAS, чтобы увидеть, как это связано с эти двое.

Я пытаюсь выполнить некоторую работу на низком уровне над матрицами, и мой основной язык - C. Сначала я хотел использовать GSL, но он говорит, что если вам нужна лучшая производительность, вы должны использовать BLAS и ATLAS. Есть ли какая-нибудь хорошая веб-страница, дающая несколько хороших примеров того, как использовать их (на C) вместе? Другими словами, я ищу учебник по использованию этих трех (или любого из них!). Короче запуталась!

махлаги
источник
3
См. Также scicomp.stackexchange.com/questions/8052/…
High Performance Mark

Ответы:

159

BLAS - это набор низкоуровневых матричных и векторных арифметических операций («умножить вектор на скаляр», «умножить две матрицы и добавить к третьей матрице» и т. Д.).

LAPACK - это набор операций линейной алгебры более высокого уровня. Такие вещи, как факторизации матриц (LU, LLt, QR, SVD, Schur и т. Д.), Которые используются для таких вещей, как «найти собственные значения матрицы», или «найти сингулярные значения матрицы», или «решить линейную систему. ». LAPACK построен на основе BLAS; многие пользователи LAPACK используют только интерфейсы LAPACK и никогда не должны знать о BLAS. LAPACK обычно компилируется отдельно от BLAS и может использовать любую имеющуюся высоко оптимизированную реализацию BLAS.

ATLAS - это достаточно хорошая переносимая реализация интерфейсов BLAS, которая также реализует несколько наиболее часто используемых операций LAPACK.

То, что «вам следует использовать», в некоторой степени зависит от деталей того, что вы пытаетесь сделать, и от того, какую платформу вы используете. Однако вы не ошибетесь, сказав «используйте ATLAS + LAPACK».

Стивен Кэнон
источник
Спасибо за объяснения. Знаете ли вы примеры, КАК использовать ATLAS + LAPACK? Мне нужно увидеть несколько примеров, чтобы понять, как их использовать! Я понимаю, для чего они нужны, и теорию того, что они делают, но я с трудом могу найти на C примеры того, как реализовать на практике.
makhlaghi
1
@astroboy: можешь дать мне немного информации о том, что ты на самом деле пытаешься сделать? LAPACK - особенно огромная библиотека.
Стивен Кэнон
Для простоты предположим, что у меня есть матрица, и я хочу умножить ее на определенное значение. Как я могу сделать это, объединив ATLAS и (LAPACK или BLAS) в C? Я просто хочу посмотреть, как реализовать любую из этих функций. В netlib.org/lapack/lapacke.html есть несколько примеров, но нет упоминания об ATLAS!
Махлаги
Есть ли что-нибудь вроде BLAS, LAPACK или MKL, способного прозрачно работать с объектами, намного превышающими размер памяти?
skan
1
@ MinhNghĩa: Есть стандарт netlib.org/blas/blast-forum , но (а) нет принудительного исполнения - стандарт без набора тестов на самом деле не является стандартом - и (б) я не думаю что кто-либо реализует полный набор интерфейсов, описанных в этом документе. Это вдохновляет.
Стивен Кэнон
42

В то время назад, когда я начал делать некоторую линейную алгебру в C, она пришла ко мне как сюрприз , чтобы увидеть так мало учебных пособия для BLAS, LAPACKи других фундаментальных APIs, несмотря на то , что они какие - то образом краеугольные многих других библиотек. По этой причине я начал собирать все примеры / уроки я смог найти по всему интернету для BLAS, CBLAS, LAPACK, CLAPACK, LAPACKE, ATLAS, OpenBLAS... в этом Github репо .

Что ж, я должен вас предупредить, что как инженер-механик у меня мало опыта в управлении таким репозиторием git или GitHub. Сначала это покажется вам полным беспорядком, ребята. Однако, если вам удастся преодолеть запутанную структуру, вы найдете всевозможные примеры и инструкции, которые могут помочь. Я перепробовал большинство из них, чтобы убедиться, что они компилируются. А те, которые не компилируются, я уже упоминал. Я модифицировал многие из них, чтобы их можно было компилировать с помощью GNU compilers( gcc, g++и gfortran). Я сделал MakeFiles, которые вы можете прочитать, чтобы узнать, как вы можете вызывать отдельные Fortran/FORTRANподпрограммы в программе Cили C++. Я также поместил несколько инструкций по установке для Mac и Linux (извините, ребята, Windows!). Я также сделал несколькоbash .sh файлы для автоматической компиляции некоторых из этих библиотек.

Но переход на другой Ваш вопрос: BLASа LAPACKявляются скорее APIS не конкретные SDKs. Это просто список спецификаций или языковых расширений, а не реализации или библиотеки. С учетом сказанного, есть оригинальные претворением Netlib в FORTRAN 77, которые большинство людей относятся к (смутно!) , Когда речь идет о BLASи LAPACK. Итак, если вы видите много странных вещей при использовании этих APIs, это потому, что вы на самом деле вызывали FORTRANподпрограммы, Cа не Cбиблиотеки и функции. ATLASи OpenBLASявляются одними из лучших реализаций BLASи LACPACK, насколько я знаю. Они соответствуют оригиналу API, хотя, насколько мне известно, они реализованы наC/C++с нуля (не уверен!). Есть GPGPU реализации APIс использованием OpenCL: CLBlast , clBLAS , clMAGMA , ArrayFire и ViennaCL говоря уже о некоторых из них . Существуют также реализации конкретных производителей, оптимизированные для конкретного оборудования или платформы, и я настоятельно не рекомендую их использовать.

Я рекомендую всем, кто хочет научиться использовать BLASи LAPACKв первую очередь, Cизучить FORTRAN-Cсмешанное программирование. Этому посвящена первая глава упомянутого репо, в которой я собрал много разных примеров.

PS Я время от времени работаю над dev-веткой репозитория . Это кажется немного менее беспорядочным!

Foad
источник
Страница LAPACK в Википедии начинается со слов «LAPACK (пакет линейной алгебры) - это стандартная программная библиотека». Вы говорите, что это неправильно, поскольку это спецификация API, а не реализация?
Noah_S
1
После некоторого исследования кажется, что LAPACK и BLAS на самом деле являются реализациями. Из часто задаваемых вопросов NetLib по BLAS: «BLAS (подпрограммы базовой линейной алгебры) - это процедуры, которые предоставляют стандартные строительные блоки для выполнения основных векторных и матричных операций». Со страницы LAPACK на GitHub: «LAPACK - это библиотека функций Fortran». На основании этого и после прочтения проекта LAPACK GitHub у меня сложилось впечатление, что BLAS и LAPACK на самом деле являются реализациями - LAPACK основывается на BLAS для обеспечения более сложных функций.
Noah_S
1
@Noah_S Я бы не стал использовать Википедию в качестве «справочника», но, насколько мне известно, существует несколько реализаций LAPACK. Я думаю, что теперь называть это API точнее. но, пожалуйста, поправьте меня, если я ошибаюсь.
Foad
2
Я думаю, что часть путаницы заключается в том, что BLAS - это API / спецификация, но есть также «эталонная реализация» BLAS (из Netlib), которая также называется просто «библиотекой BLAS». Обычно, когда люди говорят BLAS, они имеют в виду API, потому что эталонная реализация не оптимизирована, поэтому на практике / в отрасли она мало используется. ATLAS обеспечивает оптимизированную реализацию нескольких подпрограмм LAPACK, а затем, при необходимости, извлекает остальные из самого LAPACK для создания полной реализации LAPACK во встроенных файлах библиотеки ATLAS.
Эндрю Янке
1
@Noah_S Нет противоречия, каждая библиотека имеет API, который позволяет повторно реализовать фактическую функциональность, оставаясь совместимым с API, и именно это произошло с LAPACK.
Андрей
20

ATLAS к настоящему времени довольно устарел. Он был разработан в то время, когда считалось, что оптимизация BLAS для различных платформ была недоступна для людей, и в результате автогенерация и автонастройка были правильным решением.

В начале 2000-х появился Казусигэ Гото, который показал, как высокоэффективные реализации могут быть написаны вручную. Возможно, вам понравится интересная статья в New York Times: https://www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun-a-human- компьютер-держит.html .

Казусигэ, с одной стороны, лучше разбирался в теории, лежащей в основе высокопроизводительных реализаций матричного умножения, а с другой стороны, лучше их спроектировал. Его подход, который на современных процессорах обычно наиболее эффективен, не относится к области поиска, которую автоматически настраивает ATLAS. Следовательно, ATLAS по своей сути уступает. Внедрение Казусиге BLAS стало известно как GotoBLAS. Когда он пришел в индустрию, он получил название OpenBLAS.

Идеи, лежащие в основе GotoBLAS, были преобразованы в новую реализацию, платформу BLAS-подобного программного обеспечения для создания библиотек (BLIS) ( https://github.com/flame/blis ), которая реализует те же алгоритмы, но структурирует код таким образом, чтобы меньше должен быть индивидуализирован для новой архитектуры. BLIS кодируется на C.

Это обсуждение показывает, что существует множество реализаций BLAS. Сами BLAS являются стандартом де-факто для интерфейса. Когда-то ATLAS был самым современным оборудованием. Это уже не так.

Роберт ван де Гейн
источник
0

Насколько мне известно, и после работы с репозиторием ATLAS, кажется, что он включает повторную реализацию BLAS на C. Это немного больше, чем это, но я надеюсь, что это ответит на вопрос.

cdcdcd
источник