Apa hubungan antara BLAS, LAPACK dan ATLAS

147

Saya tidak mengerti bagaimana BLAS, LAPACK dan ATLAS terkait dan bagaimana saya harus menggunakannya bersama! Saya telah melihat-lihat semua manual mereka dan saya memiliki gambaran umum tentang BLAS dan LAPACK dan bagaimana menggunakannya dengan sangat sedikit contoh yang saya temukan, tetapi saya tidak dapat menemukan contoh sebenarnya menggunakan ATLAS untuk melihat bagaimana hubungannya dengan dua ini.

Saya mencoba melakukan beberapa pekerjaan tingkat rendah pada matriks dan bahasa utama saya adalah C. Pertama saya ingin menggunakan GSL, tetapi dikatakan bahwa jika Anda menginginkan kinerja terbaik, Anda harus menggunakan BLAS dan ATLAS. Apakah ada halaman web bagus yang memberikan beberapa contoh bagus tentang bagaimana menggunakan ini (dalam C) secara bersamaan? Dengan kata lain, saya mencari tutorial tentang cara menggunakan ketiganya (atau bagian mana pun dari mereka!). Singkatnya saya bingung!

makhlaghi
sumber
3
Lihat juga scicomp.stackexchange.com/questions/8052/…
Tanda Kinerja Tinggi

Jawaban:

159

BLAS adalah kumpulan operasi aritmatika vektor dan matriks tingkat rendah ("mengalikan vektor dengan skalar", "mengalikan dua matriks dan menambahkan ke matriks ketiga", dll ...).

LAPACK adalah kumpulan operasi aljabar linier tingkat tinggi. Hal-hal seperti faktorisasi matriks (LU, LLt, QR, SVD, Schur, dll) yang digunakan untuk melakukan hal-hal seperti "menemukan nilai eigen dari matriks", atau "menemukan nilai tunggal matriks", atau "menyelesaikan sistem linier ". LAPACK dibangun di atas BLAS; banyak pengguna LAPACK hanya menggunakan antarmuka LAPACK dan tidak perlu menyadari BLAS sama sekali. LAPACK umumnya dikompilasi secara terpisah dari BLAS, dan dapat menggunakan implementasi BLAS apa pun yang sangat dioptimalkan yang Anda miliki.

ATLAS adalah implementasi antarmuka BLAS portabel yang cukup baik, yang juga mengimplementasikan beberapa operasi LAPACK yang paling umum digunakan.

Apa yang "harus Anda gunakan" agak bergantung pada detail dari apa yang Anda coba lakukan dan platform apa yang Anda gunakan. Namun, Anda tidak akan salah dengan "gunakan ATLAS + LAPACK".

Stephen Canon
sumber
Terima kasih atas penjelasannya. Apakah Anda tahu contoh CARA menggunakan ATLAS + LAPACK? Saya perlu melihat beberapa contoh untuk memahami cara menggunakan ini! Saya mengerti untuk apa mereka dan teori tentang apa yang mereka lakukan, tetapi saya hampir tidak dapat menemukan contoh di C tentang bagaimana menerapkan dalam praktik.
makhlaghi
1
@astroboy: dapatkah Anda memberi saya beberapa informasi tentang apa yang sebenarnya Anda coba lakukan? LAPACK khususnya adalah perpustakaan yang sangat besar .
Stephen Canon
Untuk kesederhanaan, katakanlah saya memiliki matriks dan saya ingin mengalikannya dengan nilai tertentu. Bagaimana saya bisa melakukan ini dengan menggabungkan ATLAS dan (LAPACK atau BLAS) di C? Saya hanya ingin melihat bagaimana mengimplementasikan salah satu fungsi ini. Ada beberapa contoh di netlib.org/lapack/lapacke.html tetapi ATLAS tidak disebutkan!
makhlaghi
Apakah ada BLAS, LAPACK atau MKL yang dapat bekerja secara transparan dengan objek yang jauh lebih besar dari memori?
skan
1
@ MinhNghĩa: Ada standar, netlib.org/blas/blast-forum , tetapi (a) tidak ada penegakan - standar tanpa rangkaian pengujian bukanlah standar - dan (b) saya rasa bahwa siapa pun yang mengimplementasikan set antarmuka lengkap yang dijelaskan oleh dokumen itu. Ini, uh, aspiratif.
Stephen Canon
42

Beberapa waktu yang lalu, ketika saya mulai mengerjakan beberapa aljabar linier C, saya terkejut melihat ada begitu sedikit tutorial untuk BLAS, LAPACKdan hal-hal mendasar lainnya API, terlepas dari kenyataan bahwa mereka bagaimanapun juga merupakan landasan dari banyak perpustakaan lainnya. Untuk alasan itu saya mulai mengumpulkan semua contoh / tutorial saya bisa menemukan seluruh internet untuk BLAS, CBLAS, LAPACK, CLAPACK, LAPACKE, ATLAS, OpenBLAS... di repo Github ini .

Yah, saya harus memperingatkan Anda bahwa sebagai seorang insinyur mesin saya memiliki sedikit pengalaman dalam mengelola repositori git atau GitHub seperti itu. Ini pertama-tama akan tampak seperti kekacauan total bagi kalian. Namun jika Anda berhasil mengatasi struktur yang berantakan, Anda akan menemukan semua jenis contoh dan instruksi yang mungkin bisa membantu. Saya telah mencoba sebagian besar dari mereka, untuk memastikan mereka dapat dikompilasi. Dan yang tidak dapat dikompilasi telah saya sebutkan. Saya telah memodifikasi banyak dari mereka agar dapat dikompilasi dengan GNU compilers( gcc, g++dan gfortran). Saya telah membuat MakeFileyang dapat Anda baca untuk mempelajari bagaimana Anda dapat memanggil Fortran/FORTRANrutinitas individu dalam sebuah Catau C++program. Saya juga telah memasukkan beberapa instruksi instalasi untuk mac dan linux (maaf windows guys!). Saya juga sudah membuatnyabash .sh file untuk kompilasi otomatis dari beberapa pustaka ini.

Tapi pergi ke pertanyaan Anda yang lain: BLASdan LAPACKagak APIs tidak spesifik SDK. Mereka hanyalah daftar spesifikasi atau ekstensi bahasa daripada implementasi atau pustaka. Dengan mengatakan bahwa, ada original implementasi oleh Netlib di FORTRAN 77, yang kebanyakan orang merujuk (membingungkan!) Ketika berbicara tentang BLASdan LAPACK. Jadi jika Anda melihat banyak hal aneh saat menggunakan ini APIadalah karena Anda sebenarnya memanggil FORTRANrutinitas, Cbukan di Cpustaka dan fungsi. ATLASdan OpenBLASbeberapa implementasi terbaik BLASdan LACPACKsejauh yang saya tahu. Mereka sesuai dengan aslinya API, meskipun, menurut pengetahuan saya, mereka diterapkanC/C++dari awal (tidak yakin!). Ada implementasi GPGPU yang APImenggunakan OpenCL: CLBlast , clBLAS , clMAGMA , ArrayFire dan ViennaCL untuk menyebutkan beberapa. Ada juga implementasi khusus vendor yang dioptimalkan untuk perangkat keras atau platform tertentu, yang saya sangat tidak menyarankan siapa pun untuk menggunakannya.

Rekomendasi saya untuk siapa saja yang ingin belajar menggunakan BLASdan LAPACKdalam Cadalah belajar FORTRAN-Cpemrograman campuran terlebih dahulu. Bab pertama dari repo yang disebutkan didedikasikan untuk masalah ini dan di sana saya telah mengumpulkan banyak contoh berbeda.

PS Saya telah mengerjakan cabang dev dari repositori dari waktu ke waktu. Sepertinya tidak terlalu berantakan!

Foad
sumber
Halaman Wikipedia untuk LAPACK dimulai dengan "LAPACK (Paket Aljabar Linear) adalah perpustakaan perangkat lunak standar". Apakah Anda mengatakan itu tidak benar, karena ini spesifikasi API dan bukan implementasi?
Noah_S
1
Setelah beberapa penelitian, tampaknya LAPACK dan BLAS sebenarnya adalah implementasi. Dari faq NetLib di BLAS: "BLAS (Basic Linear Aljabar Subprograms) adalah rutinitas yang menyediakan blok bangunan standar untuk melakukan operasi vektor dan matriks dasar". Dari halaman GitHub LAPACK: "LAPACK adalah perpustakaan subrutin Fortran". Berdasarkan itu, dan saat membaca proyek GitHub LAPACK, kesan saya adalah bahwa BLAS dan LAPACK sebenarnya adalah implementasi - LAPACK dibangun di atas BLAS untuk menyediakan fungsionalitas yang lebih canggih.
Noah_S
1
@Noah_S Saya tidak akan menggunakan Wikipedia sebagai "referensi", tetapi untuk pengetahuan saya yang terbatas, ada beberapa implementasi LAPACK. Saya pikir menyebutnya API sekarang lebih akurat. tapi tolong perbaiki saya jika saya salah.
Muat
2
Saya pikir bagian dari kebingungan adalah bahwa BLAS adalah API / spesifikasi, tetapi ada juga "Implementasi Referensi" dari BLAS (dari Netlib) yang juga disebut sebagai "perpustakaan BLAS". Biasanya ketika orang mengatakan BLAS yang mereka maksud adalah API, karena Implementasi Referensi tidak dioptimalkan, sehingga tidak banyak digunakan dalam praktik / industri. ATLAS menyediakan implementasi yang dioptimalkan dari beberapa subrutin LAPACK, dan kemudian secara opsional menarik sisanya dari LAPACK itu sendiri untuk menghasilkan implementasi LAPACK lengkap dalam file lib ATLAS yang dibangun.
Andrew Janke
1
@Noah_S Tidak ada kontradiksi, setiap perpustakaan memiliki API, yang memungkinkan untuk mengimplementasikan kembali fungsionalitas sebenarnya sambil tetap kompatibel dengan API dan itulah yang terjadi dengan LAPACK.
Andrey
20

ATLAS sekarang sudah cukup usang. Ini dikembangkan pada saat dianggap bahwa mengoptimalkan BLAS untuk berbagai platform berada di luar kemampuan manusia, dan sebagai hasilnya, autogeneration dan autotuning adalah cara yang harus dilakukan.

Di awal tahun 2000-an, datanglah Kazushige Goto, yang menunjukkan bagaimana implementasi yang sangat efisien dapat dikodekan dengan tangan. Anda dapat menikmati artikel menarik di New York Times: https://www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun-a-human- computer-keeps.html .

Kazushige di satu sisi memiliki wawasan yang lebih baik tentang teori di balik implementasi kinerja tinggi dari perkalian matriks-matriks, dan di sisi lain merekayasa ini dengan lebih baik. Pendekatannya, yang pada CPU saat ini biasanya berkinerja tertinggi, tidak pada ruang pencarian yang di-autotune oleh ATLAS. Oleh karena itu, ATLAS secara inheren lebih rendah. Implementasi BLAS oleh Kazushige dikenal sebagai GotoBLAS. Itu bercabang sebagai OpenBLAS ketika dia bergabung dengan industri.

Ide-ide di balik GotoBLAS direfraktorisasi menjadi implementasi baru, kerangka kerja BLAS-like Library Instantiation Software (BLIS) ( https://github.com/flame/blis ), yang mengimplementasikan algoritma yang sama, tetapi menyusun kodenya sehingga lebih sedikit perlu diimplementasikan secara khusus untuk arsitektur baru. BLIS dikodekan dalam C.

Apa yang ditunjukkan diskusi ini adalah banyaknya implementasi BLAS. BLAS sendiri adalah standar de facto untuk antarmuka. ATLAS pernah menjadi yang paling mutakhir. Tidak lagi.

Robert van de Geijn
sumber
0

Sejauh yang saya ketahui, dan setelah bekerja melalui repositori ATLAS, tampaknya itu termasuk implementasi ulang BLAS di C. Ada sedikit lebih dari itu tetapi saya berharap ini menjawab pertanyaan.

cdcdcd
sumber