Яке відношення між BLAS, LAPACK та ATLAS


143

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

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


Відповіді:


156

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

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

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

Що вам слід використовувати? Дещо залежить від деталей того, що ви намагаєтеся зробити і яку платформу використовуєте. Однак ви не помилитесь з "використанням ATLAS + LAPACK".


Дякуємо за пояснення. Чи знаєте ви будь-які приклади, ЯК використовувати ATLAS + LAPACK? Мені потрібно переглянути кілька прикладів, щоб зрозуміти, як їх використовувати! Я розумію, для чого вони, і теорію того, що вони роблять, але навряд чи можу знайти приклади в С, як реалізувати на практиці.
makhlaghi

1
@astroboy: ти можеш дати мені трохи інформації про те, що ти насправді намагаєшся зробити? LAPACK особливо величезна бібліотека.
Стівен Канон

Для простоти скажемо, що у мене є матриця, і я хочу помножити її на певне значення. Як я можу це зробити, поєднуючи ATLAS і (LAPACK або BLAS) в C? Я просто хочу побачити, як реалізувати будь-яку з цих функцій. На прикладі netlib.org/lapack/lapacke.html є кілька прикладів, але про ATLAS немає жодної згадки!
makhlaghi

Чи є щось на кшталт BLAS, LAPACK або MKL, здатне прозоро працювати з об'єктами, набагато більшими, ніж пам'ять?
скан

1
@ MinhNghĩa: Існує стандарт, netlib.org/blas/blast-forum , але (а) немає примусового виконання - стандарт без тестового набору насправді не є стандартом - і (b) я не думаю що хтось реалізує повний набір інтерфейсів, описаних у цьому документі. Це, на жаль, прагне.
Стівен Канон

40

В той час назад, коли я почав робити деяку лінійну алгебру в 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, швидше API, не є конкретними SDK. Вони є лише списком специфікацій або розширень мови, а не реалізаціями чи бібліотеками. З урахуванням сказаного, є оригінальні перетворенням Netlib в FORTRAN 77, які більшість людей ставляться до (смутно!) , Коли мова йде про BLASі LAPACK. Отже, якщо ви бачите багато дивних речей при використанні цих APIs, це тому, що ви насправді викликали FORTRANпідпрограми, Cа не Cбібліотеки та функції. ATLASі OpenBLASце одні з найкращих реалізацій BLASта LACPACKнаскільки я знаю. Вони відповідають оригіналуAPIХоча, наскільки мені відомо, вониC/C++з нуля (не впевнений!). Є реалізації GPGPU APIs, які використовують OpenCL: CLBlast , clBLAS , clMAGMA , ArrayFire та ViennaCL, щоб згадати деякі. Існують також конкретні постачальники реалізації, оптимізовані для конкретного обладнання або платформи, що я сильно заважаю комусь їх використовувати.

Моя рекомендація всім, хто хоче навчитися використовувати BLASта LAPACKін, C- спочатку навчитися FORTRAN-Cзмішаному програмуванню. Перша глава згаданого репо присвячена цій справі, і там я зібрав багато різних прикладів.

PS Я час від часу працював над відділом розробників сховища . Здається трохи менш безладним!


Сторінка Вікіпедії для LAPACK починається з "LAPACK (Пакет лінійної алгебри) - це стандартна бібліотека програмного забезпечення". Ви кажете, що це неправильно, оскільки це специфікація API, а не реалізація?
Noah_S

1
Після деяких досліджень здається, що LAPACK і BLAS насправді є реалізаціями. З факсу NetLib на BLAS: "BLAS (Основні лінійні підпрограми алгебри) - це підпрограми, які забезпечують стандартні будівельні блоки для виконання основних операцій з векторними та матричними". На сторінці GitHub LAPACK: "LAPACK - це бібліотека підпрограм Fortran". Виходячи з цього і читаючи проект GitHub LAPACK, моє враження, що BLAS і LAPACK насправді є реалізаціями - LAPACK будується на BLAS, щоб забезпечити більш досконалий функціонал.
Noah_S

1
@Noah_S Я б не використовував Вікіпедію як посилання "", але, наскільки мені відомо, існує кілька реалізацій LAPACK. Я думаю, що зараз називати його API більш точним. але, будь ласка, виправте мене, якщо я помиляюся.
Foad

2
Я думаю, що частина плутанини полягає в тому, що BLAS - це API / специфікація, але є також "Референтна реалізація" BLAS (від Netlib), яку також називають просто "бібліотекою BLAS". Зазвичай, коли люди кажуть BLAS, вони мають на увазі API, тому що Реалізація довідників не оптимізована, тому його не використовують у практиці / галузі. ATLAS забезпечує оптимізовану реалізацію декількох підпрограм LAPACK, а потім необов'язково перетягує решту з самого LAPACK для створення повної реалізації LAPACK у вбудованих файлах lib ATLAS.
Ендрю Янке

1
@Noah_S Немає суперечностей, у кожній бібліотеці є API, який дає можливість повторно реалізувати фактичну функціональність, залишаючись сумісним API, і саме це сталося з LAPACK.
Андрій

17

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

На початку 2000-х разом з ним вийшов Kazushige Goto, який показав, як високоефективні реалізації можна кодувати рукою. Вам може сподобатися цікава стаття в New York Times: https://www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun-a-human- computer-Keep.html .

Казусіге, з одного боку, краще зрозумів теорію, що стоїть за високоефективними реалізаціями множення матриці-матриці, а з іншого - розробила їх краще. Його підхід, який у поточних процесорах, як правило, є найбільш ефективним, полягає не в тому просторі пошуку, який ATLAS автоматично налаштовує. Отже, ATLAS за своєю суттю поступається. Реалізація BLAS від Kazushige отримала назву GotoBLAS. Коли він приєднався до галузі, він був роздвоєним як OpenBLAS.

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

За результатами цього обговорення є те, що БЛАС існує багато. Самі BLAS є фактичним стандартом для інтерфейсу. Колись ATLAS був найсучаснішим. Це вже не.


0

Наскільки мені відомо, і після роботи через сховище ATLAS, здається, що воно включає повторну реалізацію BLAS в C. Є в цьому трохи більше, ніж це, але я сподіваюся, що він відповідає на питання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.