Rekomendasi untuk pustaka matriks C ++ yang dapat digunakan dan cepat?

158

Apakah ada yang punya rekomendasi tentang perpustakaan matriks C ++ yang dapat digunakan dan cepat?

Yang saya maksud dengan dapat digunakan adalah sebagai berikut:

  • Objek matriks memiliki antarmuka yang intuitif (mis .: saya dapat menggunakan baris dan kolom saat pengindeksan)
  • Saya dapat melakukan apa saja dengan kelas matriks yang dapat saya lakukan dengan LAPACK dan BLAS
  • Mudah dipelajari dan menggunakan API
  • Relatif tanpa rasa sakit untuk menginstal di Linux (saya menggunakan Ubuntu 11.04 sekarang)

Bagi saya, kegunaan lebih penting daripada kecepatan atau penggunaan memori saat ini, untuk menghindari optimasi prematur. Dalam menulis kode, saya selalu dapat menggunakan array 1-D (atau vektor STL) dan aritmatika indeks atau pointer yang tepat untuk meniru sebuah matriks, tetapi saya lebih suka untuk tidak menghindari bug. Saya juga ingin memfokuskan upaya mental saya pada masalah aktual yang saya coba selesaikan dan memprogram ke dalam domain masalah, daripada menggunakan bagian dari perhatian terbatas saya untuk mengingat semua trik pemrograman kecil yang saya gunakan untuk meniru matriks sebagai array. , dan ingat perintah LAPACK, dan sebagainya. Plus, semakin sedikit kode yang harus saya tulis, dan semakin terstandarisasi, semakin baik.

Padat versus jarang belum penting; beberapa matriks yang saya hadapi akan jarang, tetapi tidak semuanya. Namun, jika paket tertentu menangani matriks padat atau jarang dengan baik, perlu disebutkan.

Templating juga tidak terlalu berarti bagi saya, karena saya akan bekerja dengan tipe numerik standar dan tidak perlu menyimpan apa pun selain ganda, float, atau int. Itu bagus, tetapi tidak perlu untuk apa yang ingin saya lakukan.

Geoff Oxberry
sumber
1
Apakah menggunakan CUDA merupakan pilihan?
flipchart
1
Bisa jadi nanti. Saya tidak tertarik pada CUDA sekarang karena saya sedang membangun perpustakaan untuk aplikasi di mana perkalian matriks adalah yang paling tidak menjadi perhatian saya. Sebagian besar upaya akan dihabiskan untuk memanggil pemecah program linier campuran-integer, sehingga menggunakan CUDA akan berlebihan. Setelah saya menyelesaikan tesis saya, saya berencana untuk melihat algoritma yang lebih berat aljabar linier dan kurang optimasi-sentris. Saya pasti mendorong Anda untuk memposting tentang perpustakaan CUDA, meskipun, jika Anda memiliki pengalaman dengan mereka, karena saya yakin orang lain akan tertarik untuk mengetahui pemikiran Anda.
Geoff Oxberry
Bagaimana dengan Intel MKL dan IPP?
Royi

Jawaban:

146

Saya telah mengumpulkan yang berikut dari riset online sejauh ini:

Saya telah menggunakan Armadillo sedikit, dan menemukan antarmuka cukup intuitif, dan mudah untuk menemukan paket biner untuk Ubuntu (dan saya mengasumsikan distro Linux lainnya). Saya belum mengkompilasinya dari sumber, tetapi harapan saya adalah itu tidak akan terlalu sulit. Itu memenuhi sebagian besar kriteria desain saya, dan menggunakan aljabar linier padat. Itu bisa memanggil rutinitas LAPACK atau MKL. Biasanya tidak perlu mengkompilasi Armadillo, itu adalah pustaka berbasis template murni: Anda hanya menyertakan header dan tautan ke BLAS / LAPACK atau MKL dll.

Saya pernah mendengar hal-hal baik tentang Eigen , tetapi belum pernah menggunakannya. Ini diklaim cepat , menggunakan templating, dan mendukung aljabar linier padat. Itu tidak memiliki LAPACK atau BLAS sebagai ketergantungan, tetapi tampaknya mampu melakukan semua yang dapat dilakukan LAPACK (ditambah beberapa hal yang tidak bisa LAPACK). Banyak proyek menggunakan Eigen, yang menjanjikan. Ini memiliki paket biner untuk Ubuntu, tetapi sebagai pustaka header-saja itu sepele untuk digunakan di tempat lain juga.

The Matrix Template Library versi 4 juga tampak menjanjikan, dan menggunakan template. Ini mendukung aljabar linier yang padat dan jarang, dan dapat memanggil UMFPACK sebagai pemecah yang jarang. Fiturnya agak tidak jelas dari situs web mereka. Ini memiliki paket biner untuk Ubuntu, dapat diunduh dari situs web mereka.

PETSc , yang ditulis oleh sebuah tim di Argonne National Laboratory, memiliki akses ke pemecah linear yang jarang dan padat, jadi saya berasumsi bahwa itu dapat berfungsi sebagai perpustakaan matriks. Ini ditulis dalam C, tetapi memiliki binding C ++, saya pikir (dan bahkan jika tidak, memanggil C dari C ++ tidak ada masalah). Dokumentasinya sangat menyeluruh. Paket ini sedikit berlebihan untuk apa yang ingin saya lakukan sekarang (perkalian dan pengindeksan matriks untuk mengatur program linear bilangan bulat), tetapi dapat berguna sebagai format matriks untuk saya di masa depan, atau untuk orang lain yang memiliki kebutuhan berbeda daripada saya.

Trilinos , yang ditulis oleh tim di Sandia National Laboratory, menyediakan antarmuka C ++ berorientasi objek untuk matriks padat dan jarang melalui komponen Epetra-nya, dan antarmuka templated untuk matriks padat dan jarang melalui komponen Tpetra-nya. Ini juga memiliki komponen yang menyediakan fungsi linear solver dan eigensolver. Dokumentasi tampaknya tidak dipoles atau menonjol seperti PETSc; Trilinos sepertinya analog Sandia dari PETSc. PETSc dapat memanggil beberapa pemecah Trilinos. Binari untuk Trilinos tersedia untuk Linux.

Blitz adalah pustaka berorientasi objek C ++ yang memiliki binari Linux. Tampaknya tidak dipelihara secara aktif (2012-06-29: versi baru baru saja muncul kemarin!), Meskipun milis aktif, jadi ada beberapa komunitas yang menggunakannya. Tampaknya tidak melakukan banyak hal dalam aljabar linear numerik di luar BLAS, dan tampak seperti perpustakaan matriks padat. Itu menggunakan template.

Boost :: uBLAS adalah pustaka berorientasi objek C ++ dan bagian dari proyek Boost. Ini mendukung templating dan aljabar linear numerik yang padat. Saya pernah mendengar itu tidak terlalu cepat.

The Template numerik Toolkit adalah C ++ library berorientasi objek yang dikembangkan oleh NIST. Penulisnya, Roldan Pozo, tampaknya memberikan kontribusi tambalan sesekali, tetapi tampaknya tidak lagi dalam pengembangan aktif (pembaruan terakhir adalah 2010). Ini berfokus pada aljabar linier yang padat, dan menyediakan antarmuka untuk beberapa dekomposisi matriks dasar dan pemecah nilai eigen.

Elemental , yang dikembangkan oleh Jack Poulson, adalah paket perangkat lunak aljabar linier padat dengan memori terdistribusi (paralel) yang ditulis dengan gaya yang mirip dengan FLAME . Untuk daftar fitur dan latar belakang proyek, lihat dokumentasinya . FLAME sendiri memiliki pustaka terkait untuk aljabar linier padat berurutan dan berbagi-memori, yang disebut libflame , yang tampaknya ditulis dalam objek-berorientasi C. Libflame terlihat sangat mirip LAPACK, tetapi dengan notasi yang lebih baik yang mendasari algoritma untuk membuat pengembangan numerik cepat perpustakaan aljabar linear lebih merupakan sains dan lebih sedikit dari seni hitam.

Ada perpustakaan lain yang dapat ditambahkan ke daftar; jika kita menghitung paket aljabar linier yang jarang sebagai "pustaka matriks", yang gratis terbaik yang saya ketahui di C adalah SuiteSparse , yang diprogram dalam gaya berorientasi objek. Saya telah menggunakan SuiteSparse dan merasa cukup mudah untuk mengambilnya; itu tergantung pada BLAS dan LAPACK untuk beberapa algoritma yang menguraikan masalah-masalah yang jarang menjadi banyak sub-masalah kecil, aljabar linier yang padat. Penulis utama paket ini, Tim Davis, sangat membantu dan seorang pria yang hebat.

The Harwell Subroutine Perpustakaan terkenal karena jarang rutinitas aljabar linear mereka, dan gratis untuk pengguna akademis, meskipun Anda harus melalui proses ini mengisi formulir dan menerima e-mail untuk setiap file yang ingin Anda download. Karena subrutin sering kali memiliki dependensi, menggunakan satu solver mungkin perlu mengunduh lima atau enam file, dan prosesnya bisa agak membosankan, terutama karena bentuk persetujuannya tidak instan.

Ada juga pemecah aljabar linier lain yang jarang, tetapi sejauh yang saya tahu, MUMPS dan paket lainnya sebagian besar terfokus pada solusi sistem linear, dan menyelesaikan sistem linear adalah yang paling tidak menjadi perhatian saya saat ini. (Mungkin nanti, saya akan membutuhkan fungsionalitas itu, dan itu bisa bermanfaat bagi orang lain.)

Geoff Oxberry
sumber
2
Saya pikir Anda bingung Eigen dengan Elemental; Saya belum mengerjakan Eigen, meskipun saya sangat terkesan dengan proyek ini. Elemental terutama menargetkan mesin memori terdistribusi.
Jack Poulson
3
Saya kira pertanyaan pertama saya adalah: Apakah Anda pernah ingin menjalankan sesuatu secara paralel?
Matt Knepley
1
Saya harus menyebutkan Trilinos ... walaupun tidak mendapatkan banyak visibilitas di sini (belum), ini adalah alternatif yang layak untuk PETSc, dengan paket matriks templated, eigensolver, dan pemecah matriks jarang, ia juga memiliki paket dimaksudkan khusus untuk mengabstraksi pembukuan suatu algoritma, meskipun saya tidak tahu seberapa baik kerjanya.
Andrew Spott
1
Eigen tampak hebat - seorang kolega saya menggunakannya dalam konteks profesional, dan itu bisa membuat Anda bangun dan berlari cukup cepat tanpa mengorbankan kinerja.
qdot
7
Saya juga akan menambahkan pustaka berikut untuk jawaban Anda: ViennaCL - pustaka header C ++ berbasis OpenCL yang dapat berinteraksi ke Eigen dan MTL. PLASMA - desain ulang UTK dari perpustakaan BLAS dan LAPACK yang menampilkan dekomposisi berbasis ubin. MAGMA - proyek UTK lain yang berfokus pada peningkatan kinerja LAPACK / BLAS.
Aron Ahmadia
24

Dokumen ini ditulis pada bulan Maret 2009 untuk membantu dalam pemilihan perpustakaan aljabar linier untuk perpustakaan ilmiah. Ini mengevaluasi portabilitas, antarmuka tingkat tinggi dan lisensi untuk beberapa perpustakaan, di antaranya Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos dan uBlas. Tampaknya sangat menyukai Flens dan Seldon . (Salah satu persyaratan adalah bahwa template C ++ dan matriks jarang harus didukung.)

jh
sumber
17

Dari semua proyek yang tercantum di atas, hanya ada dua beban berat yang sangat banyak digunakan (dan untuk alasan yang baik): PETSc dan Trilinos. Keduanya dikembangkan secara profesional dan memiliki basis pengembang yang besar. Semua yang lain adalah proyek yang agak kecil dibandingkan dengan dua ini, dan saya akan merekomendasikan pergi bersama mereka karena (i) mereka akan didukung untuk waktu yang lama untuk datang dan (ii) mereka cenderung sudah memiliki semua fungsi yang Anda perlukan tentang aljabar linier (dan banyak lagi di atas itu).

Wolfgang Bangerth
sumber
4
PETSc tidak menampilkan lebih dari antarmuka abstrak untuk ScaLAPACK dan PLAPACK. Jika Geoff tertarik pada aljabar linier padat yang nyaman, saya pikir PETSc berlebihan (saya tidak cukup tahu tentang kemampuan padat Trilinos untuk berkomentar)
Aron Ahmadia
@AronAhmadia: Pada titik ini, saya pikir jawabannya telah berubah menjadi lebih banyak sumber daya wiki komunitas, itulah sebabnya saya telah menambahkan paket atas permintaan komentator.
Geoff Oxberry
3
@WolfgangBangerth: Saya pikir penting untuk menyebutkan tujuan desain. Jika tujuannya adalah untuk menulis perangkat lunak yang tahan lama dan dimaksudkan untuk digunakan oleh orang lain, dan aljabar linier adalah bagian integral dari perangkat lunak itu, maka PETSc dan Trilinos adalah pilihan yang baik. Namun, ada beberapa kasus di mana opsi yang lebih ringan lebih disukai dan berguna, karena mereka memiliki API yang lebih sederhana dan dapat menyelesaikan tugas yang hampir sama dalam lebih sedikit baris kode. Akhirnya, bias seleksi berperan dalam kelangsungan kode. Jika tidak ada yang menggunakan kode yang lebih kecil, mereka tidak akan bertahan atau membangun basis seperti PETSc dan Trilinos.
Geoff Oxberry
1
Untuk menambah apa yang dikatakan Geoff, sebagian besar fungsi PETSc dan Trilinos berasal dari pembungkus di sekitar perpustakaan eksternal. Untuk mengatakan bahwa tidak seorang pun boleh menggunakan perpustakaan eksternal tersebut secara langsung tampak aneh bagi saya.
Jack Poulson
1
@JackPoulson: Saya sebenarnya mendukung komentar saya. Ya, PETSc membungkus banyak paket individual. Tetapi ia melakukannya dengan antarmuka yang seragam dan lebih mudah untuk mempelajari ini satu kali daripada harus mempelajari kekhasan masing-masing paket penamaan konvensi dan gaya. Dengan kata lain, sementara masing-masing proyek dapat menggunakan paket yang dibungkus dengan cara yang sama, ada sinergi yang berasal dari menggunakannya melalui PETSc setiap saat.
Wolfgang Bangerth
11

jika kamu mau

  • Kelas-kelas matriks dengan antarmuka yang intuitif
  • Semua fitur LAPACK dan BLAS
  • Mudah dipelajari dan menggunakan API
  • Mudah dipasang

Maka saya sarankan Anda untuk melihat FLENS perpustakaan saya . Saya mendesainnya untuk tugas-tugas semacam ini. Namun, itu membutuhkan kompiler konform C ++ 11 (mis. Gcc 4.7 atau dentang).

FLENS memberi Anda kinerja yang persis sama dengan implementasi BLAS yang mendasarinya. Ada beberapa tolok ukur (agak lama) yang menunjukkan ini

Hal yang sama dapat dikatakan tentang FLENS-LAPACK itu hanya memberi Anda kinerja yang sama persis seperti LAPACK Netlib jika implementasi BLAS yang sama digunakan.

Mengenai tolok ukur baru biarkan saya masuk ke lebih detail ...

Beberapa waktu lalu saya bertanya kepada Clint Whaley (penulis ATLAS) apa pendapatnya tentang tolok ukur yang diterbitkan di situs Eigen. Dia hanya mengkonfirmasi dugaan saya bahwa tolok ukur ini kemungkinan besar tidak dapat diandalkan. Sementara itu, beberapa tolok ukur lain yang disadari seperti yang disarankan Clint. Detail dapat ditemukan di situs ATLAS dan milis Eigen. Benchmark tidak disajikan dengan baik dalam grafik tetapi menunjukkan bahwa ATLAS selalu sekitar 40% lebih cepat dari Eigen. Ini bertentangan dengan tolok ukur dari situs Eigen tetapi mengkonfirmasi tolok ukur lain (misalnya yang dari blaze-lib).

Perhatikan bahwa untuk aljabar linier numerik yang padat, produk matriks-matriks paling relevan. Secara pribadi saya tidak peduli apakah Eigen atau ATLAS lebih cepat. Jika Eigen lebih cepat dari ATLAS maka saya akan menggunakan Eigen sebagai BLAS-backend.

Penafian: Ya, FLENS adalah bayi saya! Itu berarti saya mengkodekan sekitar 95% dari itu dan setiap baris kode tidak sia-sia :-)

Michael Lehn
sumber
Halo Michael, selamat datang di scicomp. URL Anda tidak berfungsi untuk saya, apakah ada yang salah dengan server Anda?
Aron Ahmadia
Terima kasih atas petunjuknya. URL itu benar tetapi tampaknya kami mengalami masalah di departemen matematika dengan server file. Tepat waktu untuk akhir pekan ...
Michael Lehn
1
Ok, saya baru saja membuat dokumentasi baru dari repo git saat ini dan menyalinnya di server lain: apfel.mathematik.uni-ulm.de/ ~lehn
Michael Lehn
3

Saya telah menggunakan GMM ++ selama beberapa waktu dan saya senang dengan itu.

GertVdE
sumber
1

Apa yang akan menjadi perpustakaan matriks terbaik untuk berurusan dengan matriks ukuran kecil, yang umum digunakan, misalnya, ketika merakit matriks elemen hingga, untuk melakukan operasi tensor dan sebagainya.

Saya sudah menggunakan PETSc untuk solusi sistem linear besar yang jarang muncul dalam aplikasi saya, tetapi saya saat ini menggunakan perpustakaan sederhana saya sendiri untuk menangani matriks / vektor ini ... Saya sedang mempertimbangkan untuk pindah ke perpustakaan yang lebih cepat, seperti yang disebutkan di atas.

Apa yang akan menjadi pilihan terbaik untuk berpasangan dengan PETSc? Eigen? Armadillo? MENINGKATKAN :: uBlas? MTL4? Saya menggunakan beberapa hal dari BOOST, jadi, pertama saya berpikir untuk menggunakan BOOST :: uBlas, tetapi tidak ada banyak dokumentasi, contoh, dan sebagainya ...

Bernardo MR
sumber
2
Saya sangat merekomendasikan untuk tidak menggunakan uBlas, karena diketahui bahwa urutan besarnya lebih lambat daripada rutinitas BLAS yang dioptimalkan. Saya pikir Eigen paling bersinar untuk matriks yang sangat kecil karena trik template yang pintar.
Jack Poulson
1
Ini mungkin lebih baik untuk pertanyaan terpisah. Saya tahu bahwa Eigen, MTL4, dan Armadillo semuanya memiliki trik untuk memecahkan sistem ukuran kecil, tapi saya pikir Anda bertanya bagaimana cara merakit matriks, dan untuk itu, saya tidak tahu. Saya biasanya merakit elemen-elemen matriks. Saya tidak yakin apakah ada perpustakaan yang disebutkan baik untuk digabungkan dengan PETSc; Saya belum menjadi pengguna PETSc. Namun, saya memberikan komentar kedua tentang Boost :: uBlas, karena lambat.
Geoff Oxberry
1

Armadillo, Boost dan lainnya sekarang dimasukkan sebagai bagian dari Ceemple, lingkungan komputasi teknis C ++ berbasis JIT yang cepat. Tersedia (gratis) dari http://www.ceemple.com .

pengguna7774
sumber
0

Terkejut tidak ada yang menyebutkan TooN sejauh ini. Sudah senang menggunakannya selama hampir 3 tahun sekarang.

Ini sangat mirip dengan Eigen meskipun tidak komprehensif. Namun saya pikir ini memiliki sintaks yang lebih bagus dalam beberapa hal.

Itu juga dilengkapi dengan kelas-kelas yang membantu memodelkan transformasi umum yang sering dijumpai dalam Grafik dan Visi, berdasarkan Lie Groups (Euclidean Khusus / Orthogonal dalam 2 dan 3 dimensi, dll) dan Lie Algebras yang terkait.

rsp1984
sumber
0

HASEM Matrix C ++ Library adalah yang benar-benar Anda butuhkan http://sourceforge.net/projects/hasem/

Nidam
sumber
1
"HASEM hampir dapat menyelesaikan masalah aljabar linear"!
David Ketcheson
Kenapa itu yang dibutuhkan orang?
mabraham