BLAS, LAPACK ve ATLAS arasındaki ilişki nedir


143

BLAS, LAPACK ve ATLAS'ın nasıl ilişkili olduğunu ve bunları birlikte nasıl kullanmam gerektiğini anlamıyorum! Tüm kılavuzlarını inceledim ve BLAS ve LAPACK hakkında genel bir fikrim var ve bunları bulduğum çok az örnekle nasıl kullanacağım, ancak ATLAS'ı kullanarak nasıl olduğunu görmek için gerçek örnekleri bulamıyorum bu ikisi.

Matrisler üzerinde düşük seviyeli bir iş yapmaya çalışıyorum ve birincil dilim C. İlk önce GSL kullanmak istedim, ancak en iyi performansı istiyorsanız BLAS ve ATLAS kullanmanız gerektiğini söylüyor. Bunların (C) birlikte nasıl kullanılacağına dair güzel örnekler veren iyi bir web sayfası var mı? Başka bir deyişle, bu üçü (veya herhangi bir alt kümesini!) Kullanma konusunda bir eğitim arıyorum. Kısacası kafam karıştı!


Yanıtlar:


156

BLAS, düşük seviyeli matris ve vektör aritmetik işlemlerin bir koleksiyonudur (“bir vektörü skalerle çarpma”, “iki matrisi çarpma ve üçüncü bir matrise ekleme” vb.).

LAPACK, yüksek seviyeli lineer cebir işlemlerinin bir koleksiyonudur. “Bir matrisin özdeğerlerini bul” veya “bir matrisin tekil değerlerini bul” veya “doğrusal bir sistemi çöz” gibi şeyleri yapmak için kullanılan matris çarpanlarına ayırma (LU, LLt, QR, SVD, Schur vb.) ”. LAPACK, BLAS'ın üzerine inşa edilmiştir; birçok LAPACK kullanıcısı sadece LAPACK arayüzlerini kullanır ve BLAS'ın farkında olmanın hiçbir zaman farkında değildir. LAPACK genellikle BLAS'tan ayrı olarak derlenir ve sahip olduğunuz yüksek düzeyde optimize edilmiş BLAS uygulamasını kullanabilir.

ATLAS, BLAS arabirimlerinin taşınabilir ve oldukça iyi bir uygulamasıdır ve bu da en sık kullanılan LAPACK işlemlerinden birkaçını uygular.

Ne “kullanmalısınız” biraz yapmaya çalıştığınız ve hangi platformu kullandığınızın ayrıntılarına bağlıdır. Ancak “ATLAS + LAPACK kullan” ile fazla yanlış gitmeyeceksiniz.


Açıklamalar için teşekkürler. ATLAS + LAPACK nasıl kullanılır? Bunların nasıl kullanılacağını anlamak için birkaç örnek görmem gerekiyor! Ne için olduklarını ve ne yaptıkları teorisini anlıyorum, ancak C'de pratikte nasıl uygulanacağına dair neredeyse hiç örnek bulamıyorum.
makhlaghi

1
@astroboy: Bana gerçekten ne yapmaya çalıştığınız hakkında bilgi verebilir misiniz? LAPACK özellikle muazzam bir kütüphanedir.
Stephen Canon

Basitlik için, bir matrisim olduğunu ve bunu belirli bir değerle çarpmak istediğimi varsayalım. C de ATLAS ve (LAPACK veya BLAS) birleştirerek bunu nasıl yapabilirim? Sadece bu işlevlerden herhangi birinin nasıl uygulanacağını görmek istiyorum. Netlib.org/lapack/lapacke.html dosyasında birkaç örnek var, ancak ATLAS'tan bahsedilmiyor!
makhlaghi

BLAS, LAPACK veya MKL gibi, bellekten çok daha büyük nesnelerle şeffaf bir şekilde çalışabilen bir şey var mı?
skan

1
@ MinhNghĩa: Standart, netlib.org/blas/blast-forum var , ama (a) zorlama yok - test paketi olmayan standart gerçekten standart değil - ve (b) sanmıyorum Herkesin bu belge tarafından tanımlanan arayüzlerin tamamını uyguladığını. Bu, istekli.
Stephen Canon

40

Ben bazı lineer cebir yapmaya başladığımda önce de, Cbu için çok az örnekler bulunuyor görmek için bir sürpriz olarak bana geldi BLAS, LAPACKve diğer temel APIonlar nasılsa diğer birçok kütüphanelerin taşları olmasına rağmen, s. Bu nedenle ben için internet üzerinden tüm bulabildiğim tüm örnekler / öğreticiler toplamaya başladı BLAS, CBLAS, LAPACK, CLAPACK, LAPACKE, ATLAS, OpenBLAS... lütfen bu Github repo .

Mekanik bir mühendis olarak böyle bir git deposunu veya GitHub'ı yönetme konusunda çok az deneyime sahip olduğum konusunda sizi uyarmalıyım. İlk önce size tam bir karmaşa gibi görünecek. Ancak, dağınık yapıyı aşmayı başarırsanız, yardımcı olabilecek her türlü örneği ve talimatları bulacaksınız. Derlediklerinden emin olmak için çoğunu denedim. Derlemediklerimden bahsetmiştim. Birçoğunu GNU compilers( gcc, g++ve gfortran) ile derlenebilecek şekilde değiştirdim . Bir programda veya programda MakeFilebireysel Fortran/FORTRANrutinleri nasıl arayabileceğinizi öğrenmek için okuyabileceğiniz şeyler yaptım . Ayrıca mac ve linux için bazı kurulum talimatları koydum (üzgünüm windows çocuklar!). Ayrıca biraz yaptımCC++bash .sh Bu kütüphanelerin bazılarının otomatik derlenmesi için dosyalar.

Ama diğer sorunuza gitmek: BLASve LAPACKdaha APIspesifik değil SDKs. Bunlar yalnızca bir uygulama veya kitaplıktan ziyade teknik özelliklerin veya dil uzantılarının bir listesidir. Bu sözlerimle, orjinal uygulama vardır NETLIB içinde FORTRAN 77çoğu insan bakın (karışıklığa!) Bahsederken BLASve LAPACK. Bu APIs kullanırken çok garip şeyler görüyorsanız, aslında kütüphaneler ve fonksiyonlar yerine FORTRANrutinleri çağırıyor olmanızdır . ve en iyi uygulamaları bazılarıdır ve bildiğim kadarıyla biliyorum. Uygulandıkları bilgilerime rağmen orijinaline uyuyorlarCCATLASOpenBLASBLASLACPACKAPIC/C++sıfırdan (emin değilim!). GPGPU uygulamaları vardır APIkullanarak s OpenCL: CLBlast , clBLAS , clMAGMA , ArrayFire ve ViennaCL bazı bahsetmek. Ayrıca, belirli bir donanım veya platform için optimize edilmiş tedarikçiye özgü uygulamalar da vardır, bu da bunları herhangi birini kullanmasını şiddetle tavsiye ederim.

Kullanarak öğrenmek isteyen herkese Benim tavsiye BLASve LAPACKiçinde Cöğrenmektir FORTRAN-Cilk karma programlama. Söz konusu repo'nun ilk bölümü bu konuya ayrılmıştır ve orada birçok farklı örnek topladım.

PS Ben zaman zaman deponun geliştirici dalı üzerinde çalışıyorum . Biraz daha az dağınık görünüyor!


LAPACK için Wikipedia sayfası "LAPACK (Doğrusal Cebir Paketi) standart bir yazılım kütüphanesidir" ile başlar. Bunun bir API özelliği olmadığı ve bir uygulama olmadığı için bunun yanlış olduğunu mu söylüyorsunuz?
Noah_S

1
Bazı araştırmalardan sonra LAPACK ve BLAS aslında uygulamalar. NetLib'in BLAS'daki SSS'sinden: "BLAS (Temel Lineer Cebir Alt Programları), temel vektör ve matris işlemlerini gerçekleştirmek için standart yapı taşları sağlayan rutinlerdir". LAPACK'in GitHub sayfasından: "LAPACK, Fortran altyordamlarının bir kütüphanesidir". Buna dayanarak ve LAPACK'in GitHub projesini okuduğumda, izlenimim BLAS ve LAPACK'in aslında uygulamalar olduğudur - LAPACK, daha karmaşık işlevsellik sağlamak için BLAS üzerine kuruludur.
Noah_S

1
@Noah_S Wikipedia'yı "referans" olarak kullanmazdım, ancak sınırlı bilgime göre, LAPACK'in birkaç uygulaması var. Bunu bir API olarak adlandırmanın artık daha doğru olduğunu düşünüyorum. ama yanılıyorsam lütfen beni düzeltin.
Foad

2
Ben karışıklığın bir parçası BLAS bir API / şartname olduğunu, ama aynı zamanda sadece "BLAS kütüphanesi" olarak da adlandırılan BLAS (Netlib) bir "Referans Uygulama" olduğunu düşünüyorum. Genellikle insanlar BLAS derken API anlamına gelir, çünkü Referans Uygulaması optimize edilmemiştir, bu nedenle uygulamada / endüstride fazla kullanılmaz. ATLAS, birkaç LAPACK altyordamının optimize edilmiş bir uygulamasını sağlar ve daha sonra isteğe bağlı olarak, yerleşik ATLAS lib dosyalarında tam bir LAPACK uygulaması üretmek için LAPACK'in kendisinden çeker.
Andrew Janke

1
@Noah_S Herhangi bir çelişki yok, her kütüphanenin bir API'si var, bu da API uyumlu kalırken gerçek işlevselliği yeniden uygulamayı mümkün kılıyor ve LAPACK ile olan da bu.
Andrey

17

ATLAS şu anda oldukça eski. BLAS'ı çeşitli platformlar için optimize etmenin insanların kabiliyetinin ötesinde olduğu düşünülen bir zamanda geliştirildi ve sonuç olarak otojenerasyon ve otomatik ayarlamanın yolu vardı.

2000'lerin başında, uygulamaların elle nasıl kodlanabileceğini gösteren Kazushige Goto geldi. New York Times'da ilginç bir makalenin tadını çıkarabilirsiniz: https://www.nytimes.com/2005/11/28/technology/writing-the-fastest-code-by-hand-for-fun-a-human- computer-keeps.html .

Kazushige'nin bir yandan matris-matris çarpımının yüksek performanslı uygulamalarının arkasındaki teori hakkında daha iyi bir kavrayış vardı, diğer yandan bunları daha iyi tasarladı. Mevcut CPU'larda genellikle en yüksek performans gösteren yaklaşımı, ATLAS'ın otomatik olarak ayarladığı arama alanında değildir. Bu nedenle, ATLAS doğal olarak düşüktür. Kazushige'in BLAS uygulaması GotoBLAS olarak tanındı. Sanayiye katıldığında OpenBLAS olarak çatallandı.

GotoBLAS arkasında fikirler yeni uygulamaya refactored edildi, Kütüphane Destekleme Yazılım (BLIS) çerçevesi (gibi BLAS- https://github.com/flame/blis ), uygular aynı algoritmalar, ancak yapıların kod o daha az yeni bir mimari için özel olarak uygulanması gerekir. BLIS C olarak kodlanmıştır.

Bu tartışmanın gösterdiği, BLAS'ın birçok uygulaması olduğu. BLAS'ın kendisi arayüz için fiili bir standarttır. ATLAS bir zamanlar en son teknolojiydi. Artık değil.


0

Bildiğim kadarıyla ve ATLAS deposu üzerinde çalıştıktan sonra, C'de BLAS'ın yeniden uygulanmasını içeriyor gibi görünüyor. Bundan biraz daha fazlası var ama umarım soruyu cevaplar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.