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!
Jawaban:
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".
sumber
Beberapa waktu yang lalu, ketika saya mulai mengerjakan beberapa aljabar linier
C
, saya terkejut melihat ada begitu sedikit tutorial untukBLAS
,LAPACK
dan hal-hal mendasar lainnyaAPI
, 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 untukBLAS
,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++
dangfortran
). Saya telah membuatMakeFile
yang dapat Anda baca untuk mempelajari bagaimana Anda dapat memanggilFortran/FORTRAN
rutinitas individu dalam sebuahC
atauC++
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:
BLAS
danLAPACK
agakAPI
s tidak spesifikSDK
. Mereka hanyalah daftar spesifikasi atau ekstensi bahasa daripada implementasi atau pustaka. Dengan mengatakan bahwa, ada original implementasi oleh Netlib diFORTRAN 77
, yang kebanyakan orang merujuk (membingungkan!) Ketika berbicara tentangBLAS
danLAPACK
. Jadi jika Anda melihat banyak hal aneh saat menggunakan iniAPI
adalah karena Anda sebenarnya memanggilFORTRAN
rutinitas,C
bukan diC
pustaka dan fungsi.ATLAS
danOpenBLAS
beberapa implementasi terbaikBLAS
danLACPACK
sejauh yang saya tahu. Mereka sesuai dengan aslinyaAPI
, meskipun, menurut pengetahuan saya, mereka diterapkanC/C++
dari awal (tidak yakin!). Ada implementasi GPGPU yangAPI
menggunakanOpenCL
: 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
BLAS
danLAPACK
dalamC
adalah belajarFORTRAN-C
pemrograman 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!
sumber
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.
sumber
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.
sumber