Kullanılabilir, hızlı bir C ++ matris kütüphanesi için öneriler?


158

Kullanılabilir, hızlı bir C ++ matris kütüphanesi hakkında önerileri olan var mı?

Kullanılabilir kastettiğim şudur:

  • Matrix nesneleri sezgisel bir arayüze sahiptir (örneğin: İndeksleme sırasında satır ve sütunları kullanabilirim)
  • LAPACK ve BLAS ile yapabileceğim matris sınıfıyla her şeyi yapabilirim
  • API öğrenmek ve kullanmak kolaydır
  • Linux'a kurmak için nispeten ağrısız (şu anda Ubuntu 11.04 kullanıyorum)

Bana göre kullanılabilirlik, erken optimizasyondan kaçınmak için şu an hız veya bellek kullanımından daha önemlidir. Kod yazarken, bir matrisi taklit etmek için her zaman 1B dizileri (veya STL vektörleri) ve uygun dizin veya işaretçi aritmetiği kullanabilirim, ancak hataları önlemek için yapmamayı tercih ederim. Zihinsel çabamı, matrisleri diziler olarak taklit etmek için kullandığım tüm küçük programlama püf noktalarını hatırlamak için sonlu dikkatimin bir kısmını kullanmak yerine, çözmeye ve problem alanına programlamaya çalıştığım gerçek probleme odaklanmak istiyorum. ve LAPACK komutlarını hatırlayın, et cetera. Ayrıca, ne kadar az kod yazmam gerekecek ve ne kadar standartlaştırılmışsa o kadar iyidir.

Yoğun ve seyrek karşı henüz farketmez; Uğraştığım matrislerin bazıları seyrek olacak, ama hepsi değil. Bununla birlikte, belirli bir paket yoğun veya seyrek matrisleri iyi kullanıyorsa, bahsetmeye değer.

Temprating benim için de önemli değil, çünkü standart nümerik tiplerle çalışacağım ve iki kat, yüzer veya inçten başka bir şey depolamam gerekmeyecek. Güzel, ama yapmak istediğim şey için gerekli değil.


1
CUDA kullanmak bir seçenek midir?
flipchart

1
Daha sonra olabilir. Şu an CUDA ile ilgilenmiyorum çünkü matris çarpımının endişelerimin en az olduğu bir uygulama için bir kütüphane yapıyorum. Çabaların büyük bir kısmı karma tamsayılı bir doğrusal program çözücü çağırmak için harcanacak, bu nedenle CUDA'yı kullanmak fazla mazeret olacaktır. Tezimi tamamladıktan sonra daha lineer cebir ağırlıklı ve daha az optimizasyon merkezli algoritmalar incelemeyi planlıyorum. Onlarla deneyiminiz varsa, başkalarının da düşüncelerinizi bilmek isteyeceğinden eminim, çünkü CUDA kütüphaneleri hakkında kesinlikle bilgi vermenizi öneririm.
Geoff Oxberry

Peki ya Intel MKL ve IPP?
Royi,

Yanıtlar:


146

Aşağıdakileri çevrimiçi araştırmalardan şu ana kadar topladım:

Armadillo'yu biraz kullandım ve arayüzü yeterince sezgisel buldum ve Ubuntu için ikili paketleri bulmak kolaydı (ve diğer Linux dağıtımlarını kabul ediyorum). Kaynaktan derlemedim, ama umudum çok zor olmayacaktı. Tasarım kriterlerimin çoğunu karşılıyor ve yoğun doğrusal cebir kullanıyor. LAPACK veya MKL rutinlerini çağırabilir. Genelde Armadillo'yu derlemeye gerek yoktur, tamamen şablon temelli bir kütüphanedir: Sadece başlığı ve BLAS / LAPACK veya MKL vb.

Eigen hakkında iyi şeyler duydum ama kullanmadım. Hızlı olduğunu iddia ediyor , şablon oluşturuyor ve yoğun doğrusal cebiri destekliyor. Bir bağımlılık olarak LAPACK veya BLAS'a sahip değildir, ancak LAPACK'in yapabileceği her şeyi yapabiliyor gibi görünmektedir (ayrıca LAPACK'in yapamadığı bazı şeyler). Birçok proje umut verici olan Eigen'i kullanıyor. Ubuntu için ikili bir pakete sahip, ancak yalnızca başlıklı bir kütüphane olarak başka yerlerde de kullanmak çok önemli.

Matris Şablon Kütüphanesi sürüm 4 de umut verici görünüyor ve şablon oluşturmayı kullanır. Hem yoğun hem de seyrek lineer cebiri destekler ve UMFPACK'i seyrek bir çözücü olarak çağırabilir . Özellikler kendi web sitesinden biraz belirsizdir. Ubuntu için, web sitelerinden indirilebilir bir ikili pakete sahiptir.

Argonne Ulusal Laboratuarında bir ekip tarafından yazılmış PETSc , seyrek ve yoğun doğrusal çözücülere erişebiliyor, bu yüzden matris kütüphanesi olarak işlev görebileceğini farz ediyorum. C ile yazılmış, ancak C ++ bağları var, sanırım (ve olmasa bile C'yi C ++ 'dan çağırmak sorun değil). Belgeler inanılmaz derecede kapsamlı. Bu paket şimdi yapmak istediklerim için biraz fazla bilgi veriyor (karma tamsayılı doğrusal programlar oluşturmak için matris çarpımı ve indeksleme), ancak gelecekte benim için veya farklı ihtiyaçları olan diğer insanlar için bir matris formatı olarak yararlı olabilir benden

Sandia Ulusal Laboratuarında bir ekip tarafından yazılan Trilinos , Epetra bileşeni ile yoğun ve seyrek matrisler için nesne yönelimli C ++ arayüzleri ve Tpetra bileşeni ile yoğun ve seyrek matrisler için şablonlanmış arayüzler sunmaktadır. Aynı zamanda doğrusal çözücü ve özverensel işlevsellik sağlayan bileşenlere sahiptir. Dokümantasyon, PETSc kadar cilalanmış veya belirgin görünmüyor; Trilinos, PETSc'in Sandia analoguna benziyor. PETSc, Trilinos çözücülerinden bazılarını arayabilir. Trilinos için Binaries Linux için kullanılabilir.

Blitz , Linux ikili dosyalarına sahip, C ++ nesne yönelimli bir kütüphanedir. Aktif olarak görünmüyor gibi görünüyor (2012-06-29: dün yeni bir versiyon ortaya çıktı!), Posta listesi aktif olsa da, onu kullanan bir topluluk var. BLAS'ın ötesinde sayısal doğrusal cebir biçiminde pek bir şey yapmıyor ve yoğun bir matris kütüphanesine benziyor. Şablonları kullanır.

Boost :: uBLAS , C ++ nesne yönelimli bir kütüphanedir ve Boost projesinin bir parçasıdır. Baştan çıkarıcı ve yoğun sayısal lineer cebiri destekler. Çok hızlı olmadığını duydum.

Şablon Sayısal Toolkit NIST tarafından geliştirilen bir C ++ nesne yönelimli kütüphanesidir. Yazarı Roldan Pozo, zaman zaman yamalara katkıda bulunuyor gibi gözüküyor, ancak artık aktif bir gelişme göstermiyor gibi görünüyor (son güncelleme 2010). Yoğun doğrusal cebir üzerine odaklanır ve bazı temel matris ayrıştırma ve özdeğer çözücü için arayüzler sağlar.

Elemental Jack Poulson tarafından geliştirilen, benzer bir tarzda yazılmış (paralel) yoğun lineer cebir yazılım paketi dağıtılmış bellek olduğunu ALEVİN . Projedeki özelliklerin ve arka planların listesi için belgelerine bakın . FLAME'ın , nesne yönelimli C ile yazılmış gibi görünen libflame adı verilen sıralı ve paylaşılan bellek yoğun doğrusal cebir için ilişkili bir kütüphanesi vardır. Libflame , LAPACK'e çok benzer, ancak hızlı sayısal gelişimi geliştirmek için algoritmaların altında daha iyi notasyona sahiptir. Doğrusal cebir daha çok bilim ve daha az siyah sanattan ibarettir.

Listeye eklenebilecek başka kütüphaneler var; eğer seyrek lineer cebir paketlerini "matris kütüphaneleri" olarak sayıyorsak , C de bildiğim en iyi ücretsiz olanı nesne yönelimli bir şekilde programlanmış olan SuiteSparse . SuiteSparse'ı kullandım ve almayı oldukça kolay buldum; seyrek problemleri birçok küçük, yoğun doğrusal cebir alt problemine parçalayan algoritmaların bazıları için BLAS ve LAPACK'e bağlıdır. Paketin baş yazarı Tim Davis inanılmaz derecede yardımsever ve harika bir adam.

Harwell Altrutin Kütüphaneler onların seyrek lineer cebir rutinleri ünlüdür ve bir form doldurarak ve indirmek istediğiniz her dosya için bir e-posta alma bu süreçte geçmek zorunda olsa da, akademik kullanıcılar için ücretsizdir. Alt rutinler genellikle bağımlılıklara sahip olduklarından, bir çözücü kullanmak beş veya altı dosyanın indirilmesini gerektirebilir ve özellikle form onayı anında olmadığından işlem biraz sıkıcı olabilir.

Başka seyrek lineer cebir çözücüler de var, fakat söyleyebildiğim kadarıyla, MUMPS ve diğer paketler çoğunlukla lineer sistemlerin çözümüne odaklanmış durumda ve lineer sistemlerin çözümü şu anda endişelerimin en küçüğü. (Belki daha sonra, bu işlevselliğe ihtiyacım olacak ve diğerleri için faydalı olabilir.)


2
Eigen'i Elemental ile karıştırdığınızı düşünüyorum; Projeden çok etkilenmeme rağmen Eigen üzerinde çalışmadım. Elemental, temel olarak dağıtılmış bellek makinelerini hedef alır.
Jack Poulson

3
Sanırım ilk sorum şu olurdu: Hiç bir şeyi paralel olarak çalıştırmak ister misiniz?
Matt Knepley

1
Trilinos'tan bahsetmeliyim ... burada (henüz) çok fazla görünürlük olmasa da, tempolu bir matris paketi, bir eigensolver ve seyrek bir matris çözücü ile PETSc için uygun bir alternatif. özellikle bir algoritmanın hesaplanmasını açıklamak anlamına gelse de, ne kadar iyi çalıştığını bilmiyorum.
Andrew Spott

1
Eigen harika görünüyor - bir meslektaşım profesyonel bir bağlamda kullandı ve performanstan ödün vermeden yeterince hızlı bir şekilde çalışmanızı sağlayabilir.
qdot

7
Cevabınıza şu kütüphaneleri de eklerdim : ViennaCL - Eigen ve MTL ile etkileşime girebilen OpenCL-tabanlı C ++ başlık kütüphanesi. PLASMA - karo bazlı ayrıştırmalara sahip BLAS ve LAPACK kütüphanelerinin UTK tabanlı yeniden tasarımı. MAGMA - LAPACK / BLAS performansını artırmaya odaklanan bir başka UTK projesi.
Aron Ahmadia

24

Bu belge , Mart 2009'da bilimsel bir kütüphane için doğrusal bir cebir kütüphanesinin seçimine yardımcı olmak için yazılmıştır. Taşınabilirliği, üst düzey arayüzü ve aralarında Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos ve uBlas gibi birçok kütüphanenin lisansını değerlendirir. Özellikle Flens ve Seldon düşkün görünüyor . (Gereksinimlerden biri, C ++ şablonlarının ve seyrek matrislerin desteklenmesi gerektiğiydi.)


17

Yukarıda listelenen tüm projeler arasında, son derece yaygın kullanılan (ve iyi nedenlerden dolayı) gerçekten sadece iki ağır ağırlık vardır: PETSc ve Trilinos. Her ikisi de profesyonel olarak geliştirilmiştir ve büyük bir geliştirici tabanına sahiptir. Diğerleri bu iki proje ile karşılaştırıldığında oldukça küçük projeler ve onlarla birlikte gitmeyi öneriyorum çünkü (i) uzun bir süre boyunca desteklenecekler ve (ii) şimdiye kadar ihtiyaç duyacağınız tüm fonksiyonlara sahip olmaları muhtemeldir. Doğrusal cebir (ve bunun üstüne daha fazlası).


4
PETSc, ScaLAPACK ve PLAPACK için biraz soyut bir arayüzden daha fazlasını içermez. Geoff, uygun, yoğun doğrusal cebir ile ilgileniyorsa, PETSc'in aşırı saygın olduğunu düşünüyorum (Trilinos'un yorum yapma konusundaki yoğun kabiliyetleri hakkında yeterince bilgim yok)
Aron Ahmadia

@AronAhmadia: Bu noktada, cevabın bir topluluk wiki kaynağına daha çok yaklaştığını düşünüyorum, bu yüzden yorumcuların isteğine göre paketler ekliyorum.
Geoff Oxberry

3
@WolfgangBangerth: Tasarım hedeflerinden bahsetmenin önemli olduğunu düşünüyorum. Amaç, uzun ömürlü ve başkaları tarafından kullanılması amaçlanan bir yazılım parçası yazmaksa ve doğrusal cebir bu yazılımın ayrılmaz bir parçasıysa, PETSc ve Trilinos iyi bir seçimdir. Bununla birlikte, daha hafif seçeneklerin tercih edilebileceği ve kullanışlı olduğu durumlar vardır, çünkü daha basit API'lere sahiptirler ve daha az kod satırında neredeyse aynı işi yapabilirler. Son olarak, seçim yanlılığı kodların hayatta kalmasında rol oynar. Hiç kimse daha küçük kodları kullanmazsa, PETSc ve Trilinos gibi bir temel oluşturmaz veya dayanmaz.
Geoff Oxberry

1
Geoff'in söylediklerine ek olarak, PETSc ve Trilinos'un işlevselliğinin büyük çoğunluğu dış kütüphanelerin etrafındaki sarmalayıcılardan geliyor. Kimsenin dış kütüphaneleri kullanmaması gerektiğini söylemek bana çok garip geliyor.
Jack Poulson

1
@ JackPoulson: Aslında yorumuma katılıyorum. Evet, PETSc birçok bireysel paketi sarar. Ancak bunu tek tip bir arayüzle yapar ve böylece bir kez öğrenmek, konvansiyon ve stil adında her bir paketin özelliklerini öğrenmek zorunda kalmaktan daha kolaydır. Başka bir deyişle, her bir proje sarılı paketleri eşit derecede iyi kullanabilse de, onları her zaman PETSc aracılığıyla kullanmaktan kaynaklanan bir sinerji vardır.
Wolfgang Bangerth

11

Eğer istersen

  • Sezgisel bir arayüze sahip Matrix sınıfları
  • Tüm LAPACK ve BLAS özellikleri
  • API öğrenmek ve kullanmak kolaydır
  • Kurulumu kolay

Ardından FLENS kütüphaneme bir göz atmanızı öneririm . Bu tür görevler için tasarladım. Bununla birlikte, bir C ++ 11 uygunluk derleyicisi (örneğin, gcc 4.7 veya clang) gerektirir.

FLENS, temelindeki BLAS uygulaması ile tam olarak aynı performansı sunar. Bunu gösteren bazı (oldukça eski) kriterler var

Aynı FLENS-LAPACK hakkında da söylenebilir, aynı BLAS uygulaması kullanılıyorsa, size Netlib'in LAPACK ile tam olarak aynı performansı verir.

Yeni kriterler söz konusu olduğunda, daha fazla ayrıntıya girmeme izin verin ...

Bir süre önce Clint Whaley'e (ATLAS'ın yazarı) Eigen sitesinde yayınlanan referanslar hakkında ne düşündüğünü sordum. Sadece bu kriterlerin güvenilir olmadığını düşündüğümü onayladı. Bu arada diğer bazı Clint'in önerdiği şekilde kriterleri gerçekleştirdi. Ayrıntılar ATLAS sitesinde ve Eigen posta listesinde bulunabilir. Kriterler grafiklerde hoş bir şekilde sunulmuyor, ancak ATLAS'ın her zaman Eigen'den yaklaşık% 40 daha hızlı olduğunu gösteriyor. Bu, Eigen sitesindeki kıyas ölçütleriyle çelişir ancak diğer ölçütleri (ör. Blaze-lib'den olanlar) doğrular.

Yoğun sayısal lineer cebir için matris-matris ürünlerinin en alakalı olduğunu unutmayın. Şahsen Eigen veya ATLAS'ın daha hızlı olup olmadığı umrumda değil. Eigen ATLAS'tan daha hızlı olsaydı, Eigen'i BLAS-arka uç olarak kullanırdım.

Yasal Uyarı: Evet, FLENS benim bebeğim! Bu onun% 95'ini kodladığım ve her kod satırının buna değdiği anlamına gelir :-)


Merhaba Michael, bilime hoş geldiniz. URL’niz benim için çalışmıyor, sunucunuzda bir sorun mu var?
Aron Ahmadia,

İpucu için teşekkürler. URL doğrudur ancak dosya sunucusuyla matematik bölümünde bir sorun yaşıyoruz gibi görünüyor. Haftasonu için tam zamanında ...
Michael Lehn

1
Tamam, şu anki git deposundan
Michael Lehn 15



1

Örneğin, sonlu elemanlar matrislerinin montajında, tensör işlemlerinin gerçekleştirilmesinde yaygın olarak kullanılan küçük boyutlu matrislerle uğraşmak için en iyi matris kütüphanesi hangisidir?

Uygulamamda ortaya çıkan büyük doğrusal sistemlerin çözümü için zaten PETSc kullanıyorum, ancak şu anda bu matrisler / vektörlerle uğraşmak için kendi basit kütüphanemi kullanıyorum ... Daha hızlı bir kütüphaneye geçmeyi düşünüyorum yukarıda belirtilenler gibi.

PETSc ile çiftleşmek için en iyi seçim hangisidir? Eigen? Armadillo? BOOST :: uBlas? MTL4? BOOST'tan bazı şeyler kullanıyorum, bu yüzden ilk önce BOOST :: uBlas'ı kullanmayı düşündüm, ama çok fazla belge, örnek vb. Yok ...


2
Optimize edilmiş BLAS rutinlerine göre daha yavaş bir büyüklük sırası olduğu bilindiği için, uBlas kullanılmasını şiddetle tavsiye ederim. Bence Eigen, zeki kalıp numaralarından dolayı çok küçük matrisler için parlıyor.
Jack Poulson

1
Bu muhtemelen ayrı bir soru için daha iyidir. Eigen, MTL4 ve Armadillo'nun hepsinin küçük boyutlu sistemleri çözmek için püf noktaları olduğunu biliyorum, ancak matrisleri nasıl birleştireceğinizi sorduğunuzu düşünüyorum ve bunun için de bilmiyorum. Ben genellikle matrisleri element-element olarak birleştiririm. Bahsedilen kütüphanelerden herhangi birinin PETSc ile eşleşme için iyi olup olmadığından emin değilim; Henüz bir PETSc kullanıcısı değilim. Jack'in Boost :: uBlas hakkındaki yorumunu yine de söylüyorum, çünkü yavaş.
Geoff Oxberry,


0

Şaşırmış kimse şu ana kadar TooN'dan bahsetmedi . Neredeyse 3 yıldır mutlu bir şekilde kullanıyorum.

Kapsamlı olmasa da, Eigen'e çok benziyor . Ancak bazı yönlerden daha güzel sözdizimine sahip olduğunu düşünüyorum.

Ayrıca Lie Gruplarına (2 ve 3 boyutta Özel Öklid / Ortogonal, vb.) Ve ilgili Lie Cebirlerine dayanarak Grafik ve Vizyonda sıkça karşılaşılan ortak dönüşümlerin modellenmesine yardımcı olan sınıflarla birlikte gelir.


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.