Đề xuất cho một thư viện ma trận C ++ có thể sử dụng nhanh?


158

Có ai có đề xuất về một thư viện ma trận C ++ nhanh, có thể sử dụng được không?

Những gì tôi có nghĩa là có thể sử dụng là như sau:

  • Các đối tượng ma trận có giao diện trực quan (ví dụ: Tôi có thể sử dụng các hàng và cột trong khi lập chỉ mục)
  • Tôi có thể làm bất cứ điều gì với lớp ma trận mà tôi có thể làm với LAPACK và BLAS
  • Dễ học và sử dụng API
  • Tương đối không đau để cài đặt trong Linux (Tôi sử dụng Ubuntu 11.04 ngay bây giờ)

Đối với tôi, khả năng sử dụng quan trọng hơn tốc độ hoặc sử dụng bộ nhớ ngay bây giờ, để tránh tối ưu hóa sớm. Khi viết mã, tôi luôn có thể sử dụng mảng 1-D (hoặc vectơ STL) và số học con trỏ hoặc chỉ số thích hợp để mô phỏng ma trận, nhưng tôi không muốn tránh lỗi. Tôi cũng muốn tập trung nỗ lực tinh thần của mình vào vấn đề thực tế Tôi đang cố gắng giải quyết và lập trình vào miền vấn đề, thay vì sử dụng một phần sự chú ý hữu hạn của tôi để ghi nhớ tất cả các thủ thuật lập trình nhỏ mà tôi đã sử dụng để mô phỏng ma trận như mảng và nhớ các lệnh LAPACK, et cetera. Thêm vào đó, tôi phải viết càng ít mã, và càng chuẩn hóa thì càng tốt.

Dày đặc so với thưa thớt chưa quan trọng; một số ma trận tôi đang xử lý sẽ thưa thớt, nhưng không phải tất cả chúng. Tuy nhiên, nếu một gói cụ thể xử lý tốt ma trận dày đặc hoặc thưa thớt, thì điều đáng nói.

Việc tạo khuôn mẫu cũng không thành vấn đề với tôi, vì tôi sẽ làm việc với các loại số tiêu chuẩn và không cần lưu trữ bất cứ thứ gì ngoài đôi, phao hoặc int. Thật tuyệt, nhưng không cần thiết cho những gì tôi muốn làm.


1
Là sử dụng CUDA một tùy chọn?
bảng lật

1
Nó có thể, sau này. Tôi không quan tâm đến CUDA ngay bây giờ vì tôi đang xây dựng thư viện cho một ứng dụng trong đó phép nhân ma trận là mối quan tâm ít nhất của tôi. Phần lớn nỗ lực sẽ được dành cho việc gọi một bộ giải chương trình tuyến tính số nguyên hỗn hợp, vì vậy sử dụng CUDA sẽ là quá mức cần thiết. Sau khi tôi hoàn thành luận án của mình, tôi dự định xem xét các thuật toán có tính đại số tuyến tính nặng hơn và ít tối ưu hóa hơn. Tôi chắc chắn khuyến khích bạn đăng bài về thư viện CUDA, tuy nhiên, nếu bạn có kinh nghiệm với họ, bởi vì tôi chắc chắn rằng những người khác sẽ quan tâm để biết suy nghĩ của bạn.
Geoff Oxberry

Còn Intel MKL và IPP thì sao?
Royi

Câu trả lời:


146

Tôi đã thu thập những điều sau đây từ nghiên cứu trực tuyến cho đến nay:

Tôi đã sử dụng Armadillo một chút và thấy giao diện đủ trực quan và thật dễ dàng để xác định các gói nhị phân cho Ubuntu (và tôi giả sử các bản phân phối Linux khác). Tôi đã không biên dịch nó từ nguồn, nhưng hy vọng của tôi là nó sẽ không quá khó. Nó đáp ứng hầu hết các tiêu chí thiết kế của tôi và sử dụng đại số tuyến tính dày đặc. Nó có thể gọi các thói quen LAPACK hoặc MKL. Nói chung không cần phải biên dịch Armadillo, đây là một thư viện hoàn toàn dựa trên mẫu: Bạn chỉ cần bao gồm tiêu đề và liên kết đến BLAS / LAPACK hoặc MKL, v.v.

Tôi đã nghe những điều tốt về Eigen , nhưng chưa sử dụng nó. Nó tuyên bố là nhanh , sử dụng templating và hỗ trợ đại số tuyến tính dày đặc. Nó không có LAPACK hoặc BLAS như một sự phụ thuộc, nhưng dường như có thể làm mọi thứ mà LAPACK có thể làm (cộng với một số điều LAPACK không thể). Rất nhiều dự án sử dụng Eigen, có triển vọng. Nó có một gói nhị phân cho Ubuntu, nhưng là một thư viện chỉ có tiêu đề, nó cũng không đáng để sử dụng ở nơi khác.

Các Matrix Template Library phiên bản 4 cũng sẽ hứa hẹn, và sử dụng khuôn mẫu. Nó hỗ trợ cả đại số tuyến tính dày đặc và thưa thớt, và có thể gọi UMFPACK là một bộ giải thưa thớt. Các tính năng có phần không rõ ràng từ trang web của họ. Nó có gói nhị phân cho Ubuntu, có thể tải xuống từ trang web của họ.

PETSc , được viết bởi một nhóm tại Phòng thí nghiệm quốc gia Argonne, có quyền truy cập vào các bộ giải tuyến tính thưa thớt và dày đặc, vì vậy tôi cho rằng nó có thể hoạt động như một thư viện ma trận. Nó được viết bằng C, nhưng tôi có các ràng buộc C ++, và tôi nghĩ vậy (và ngay cả khi không, gọi C từ C ++ là không có vấn đề gì). Các tài liệu là vô cùng kỹ lưỡng. Gói này hơi quá mức cho những gì tôi muốn làm bây giờ (nhân ma trận và lập chỉ mục để thiết lập các chương trình tuyến tính số nguyên hỗn hợp), nhưng có thể hữu ích như một định dạng ma trận cho tôi trong tương lai hoặc cho những người khác có nhu cầu khác hơn tôi làm.

Trilinos , được viết bởi một nhóm tại Phòng thí nghiệm quốc gia Sandia, cung cấp các giao diện C ++ hướng đối tượng cho các ma trận dày đặc và thưa thớt thông qua thành phần Epetra của nó và các giao diện templated cho ma trận dày đặc và thưa thớt thông qua thành phần Tpetra của nó. Nó cũng có các thành phần cung cấp chức năng giải quyết tuyến tính và eigensolver. Các tài liệu dường như không được đánh bóng hoặc nổi bật như PETSc; Trilinos có vẻ giống như Sandia tương tự của PETSc. PETSc có thể gọi một số người giải Trilinos. Binaries cho Trilinos có sẵn cho Linux.

Blitz là một thư viện hướng đối tượng C ++ có nhị phân Linux. Nó dường như không được duy trì tích cực (2012-06-29: một phiên bản mới vừa xuất hiện ngày hôm qua!), Mặc dù danh sách gửi thư đang hoạt động, vì vậy có một số cộng đồng sử dụng nó. Nó dường như không làm được gì nhiều trong cách đại số tuyến tính số ngoài BLAS, và trông giống như một thư viện ma trận dày đặc. Nó sử dụng các mẫu.

Boost :: uBLAS là một thư viện hướng đối tượng C ++ và là một phần của dự án Boost. Nó hỗ trợ templating và đại số tuyến tính dày đặc. Tôi đã nghe nói nó không đặc biệt nhanh.

Các mẫu bằng số Toolkit là một thư viện C ++ hướng đối tượng được phát triển bởi NIST. Tác giả của nó, Roldan Pozo, dường như thỉnh thoảng đóng góp các bản vá, nhưng dường như nó không còn được phát triển tích cực nữa (bản cập nhật cuối cùng là năm 2010). Nó tập trung vào đại số tuyến tính dày đặc, và cung cấp giao diện cho một số phân tách ma trận cơ bản và một bộ giải eigenvalue.

Elemental , được phát triển bởi Jack Poulson, là gói phần mềm đại số tuyến tính dày đặc (song song) bộ nhớ phân tán được viết theo kiểu tương tự như FLAME . Để biết danh sách các tính năng và nền tảng của dự án, xem tài liệu của anh ấy . Bản thân FLAME có một thư viện liên kết cho đại số tuyến tính dày đặc liên tiếp và bộ nhớ chung, được gọi là libflame , dường như được viết bằng hướng đối tượng C. Libflame trông rất giống LAPACK, nhưng với ký hiệu tốt hơn là các thuật toán để phát triển số nhanh thư viện đại số tuyến tính nhiều hơn của một khoa học và ít nghệ thuật đen.

Có những thư viện khác có thể được thêm vào danh sách; nếu chúng ta tính các gói đại số tuyến tính thưa thớt là "thư viện ma trận", thì gói miễn phí tốt nhất mà tôi biết trong C là SuiteSparse , được lập trình theo kiểu hướng đối tượng. Tôi đã sử dụng SuiteSparse và thấy nó khá dễ để lấy; nó phụ thuộc vào BLAS và LAPACK cho một số thuật toán phân tách các vấn đề thưa thớt thành nhiều bài toán con đại số tuyến tính nhỏ, dày đặc. Tác giả chính của gói, Tim Davis, cực kỳ hữu ích và là một người tuyệt vời.

Các chương trình con Libraries Harwell nổi tiếng với thói quen đại số tuyến tính thưa thớt của họ, và được miễn phí cho người dùng học tập, mặc dù bạn phải đi qua quá trình này của việc điền vào mẫu và nhận được một e-mail cho mỗi tập tin mà bạn muốn tải về. Vì các chương trình con thường có các phụ thuộc, nên sử dụng một bộ giải có thể yêu cầu tải xuống năm hoặc sáu tệp và quá trình này có thể hơi tẻ nhạt, đặc biệt vì việc phê duyệt biểu mẫu không phải là tức thời.

Ngoài ra còn có các bộ giải đại số tuyến tính thưa thớt khác, nhưng theo tôi có thể nói, MUMPS và các gói khác tập trung chủ yếu vào giải pháp của các hệ tuyến tính, và giải quyết các hệ thống tuyến tính là điều tôi quan tâm nhất hiện nay. (Có lẽ sau này, tôi sẽ cần chức năng đó và nó có thể hữu ích cho những người khác.)


2
Tôi nghĩ rằng bạn đã nhầm lẫn Eigen với Elemental; Tôi đã không làm việc trên Eigen, mặc dù tôi rất ấn tượng với dự án. Nguyên tố chủ yếu nhắm vào các máy bộ nhớ phân tán.
Jack Poulson

3
Tôi đoán câu hỏi đầu tiên của tôi sẽ là: Bạn có bao giờ muốn chạy bất cứ thứ gì song song không?
Matt Knepley

1
Tôi nên đề cập đến Trilinos ... mặc dù nó không có nhiều khả năng hiển thị ở đây (nhưng), đây là một giải pháp thay thế khả thi cho PETSc, với gói ma trận templated, eigensolver và trình giải ma trận thưa thớt, nó cũng có một gói có nghĩa là đặc biệt để trừu tượng hóa việc ghi sổ thuật toán, mặc dù tôi không biết nó hoạt động tốt như thế nào.
Andrew Spott

1
Eigen có vẻ tuyệt vời - một đồng nghiệp của tôi đã sử dụng nó trong bối cảnh chuyên nghiệp, và nó có thể giúp bạn đứng dậy và chạy đủ nhanh mà không làm giảm hiệu suất.
qdot

7
Tôi cũng sẽ thêm các thư viện sau vào câu trả lời của bạn: ViennaCL - Thư viện tiêu đề C ++ dựa trên OpenCL có thể giao tiếp với Eigen và MTL. PLASMA - một thiết kế lại dựa trên UTK của các thư viện BLAS và LAPACK có phân rã dựa trên gạch. MAGMA - một dự án UTK khác tập trung vào cải thiện hiệu suất LAPACK / BLAS.
Aron Ahmadia

24

Tài liệu này được viết vào tháng 3 năm 2009 để giúp lựa chọn thư viện đại số tuyến tính cho thư viện khoa học. Nó đánh giá tính di động, giao diện cấp cao và cấp phép cho một số thư viện, trong đó có Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos và uBlas. Nó có vẻ đặc biệt thích FlensSeldon . (Một trong những yêu cầu là các mẫu C ++ và ma trận thưa thớt phải được hỗ trợ.)


17

Trong tất cả các dự án được liệt kê ở trên, thực sự chỉ có hai trọng lượng nặng được sử dụng cực kỳ rộng rãi (và vì lý do chính đáng): PETSc và Trilinos. Cả hai đều được phát triển chuyên nghiệp và có một cơ sở phát triển lớn. Tất cả những dự án khác đều là những dự án khá nhỏ so với hai dự án này và tôi khuyên bạn nên đi cùng với họ vì (i) họ sẽ được hỗ trợ trong một thời gian dài và (ii) họ có thể đã có tất cả các chức năng mà bạn sẽ cần đại số tuyến tính (và nhiều hơn nữa trên đó).


4
PETSc không có tính năng nhiều hơn một giao diện hơi trừu tượng với ScaLAPACK và PLAPACK. Nếu Geoff quan tâm đến đại số tuyến tính dày đặc thuận tiện, tôi nghĩ rằng PETSc là quá mức cần thiết (tôi không biết đủ về khả năng dày đặc của Trilinos để bình luận)
Aron Ahmadia

@AronAhmadia: Tại thời điểm này, tôi nghĩ rằng câu trả lời đã được đưa vào nhiều tài nguyên wiki cộng đồng, đó là lý do tại sao tôi đã thêm các gói theo yêu cầu của người bình luận.
Geoff Oxberry

3
@WolfgangBangerth: Tôi nghĩ việc đề cập đến các mục tiêu thiết kế là rất quan trọng. Nếu mục tiêu là viết một phần mềm tồn tại lâu dài và được người khác sử dụng, và đại số tuyến tính là một phần không thể thiếu của phần mềm đó, thì PETSc và Trilinos là những lựa chọn tốt. Tuy nhiên, có những trường hợp các tùy chọn nhẹ hơn được ưa thích và hữu ích hơn, bởi vì chúng có API đơn giản hơn và có thể thực hiện gần như cùng một nhiệm vụ trong ít dòng mã hơn. Cuối cùng, sai lệch lựa chọn đóng một vai trò trong sự tồn tại của mã. Nếu không ai sử dụng các mã nhỏ hơn, họ sẽ không tồn tại hoặc xây dựng một cơ sở như PETSc và Trilinos.
Geoff Oxberry

1
Để thêm vào những gì Geoff đã nói, phần lớn chức năng của PETSc và Trilinos đến từ các trình bao bọc xung quanh các thư viện bên ngoài. Để nói rằng không ai nên sử dụng các thư viện bên ngoài nói trực tiếp có vẻ xa lạ đối với tôi.
Jack Poulson

1
@JackPoulson: Tôi thực sự đứng trước bình luận của tôi. Có, PETSc kết thúc rất nhiều gói riêng lẻ. Nhưng nó làm như vậy với một giao diện thống nhất và do đó đơn giản hơn để học điều này một lần hơn là phải tìm hiểu đặc thù của từng gói quy ước đặt tên và kiểu dáng. Nói cách khác, trong khi mỗi dự án riêng lẻ có thể sử dụng tốt các gói được bao bọc, có một sức mạnh tổng hợp đến từ việc sử dụng chúng thông qua PETSc mọi lúc.
Wolfgang Bangerth

11

Nếu bạn muốn

  • Các lớp ma trận với giao diện trực quan
  • Tất cả các tính năng LAPACK và BLAS
  • Dễ học và sử dụng API
  • Dễ dàng để cài đặt

Sau đó, tôi khuyên bạn nên xem FLENS thư viện của tôi . Tôi đã thiết kế nó cho chính xác các loại nhiệm vụ. Tuy nhiên, nó đòi hỏi một trình biên dịch tuân thủ C ++ 11 (ví dụ gcc 4.7 hoặc clang).

FLENS cung cấp cho bạn chính xác hiệu suất tương tự như triển khai BLAS cơ bản. Có một số điểm chuẩn (khá cũ) cho thấy điều này

Điều tương tự cũng có thể nói về FLENS-LAPACK, nó chỉ cung cấp cho bạn hiệu suất chính xác như LAPACK của Netlib nếu sử dụng cùng một triển khai BLAS.

Về điểm chuẩn mới cho phép tôi đi sâu vào chi tiết ...

Cách đây một thời gian, tôi đã hỏi Clint Whaley (tác giả của ATLAS) anh ấy nghĩ gì về các điểm chuẩn được công bố trên trang Eigen. Ông chỉ xác nhận nghi ngờ của tôi rằng những điểm chuẩn này rất có thể không đáng tin cậy. Trong khi đó, một số điểm chuẩn khác nhận ra theo cách Clint đề xuất. Thông tin chi tiết có thể được tìm thấy trên trang ATLAS và danh sách gửi thư Eigen. Các điểm chuẩn không được trình bày độc đáo trong biểu đồ nhưng chúng cho thấy ATLAS luôn nhanh hơn khoảng 40% so với Eigen. Điều này mâu thuẫn với các điểm chuẩn từ trang Eigen nhưng xác nhận các điểm chuẩn khác (ví dụ: điểm chuẩn từ blaze-lib).

Lưu ý rằng đối với đại số tuyến tính số dày đặc, các sản phẩm ma trận ma trận có liên quan nhất. Cá nhân tôi không quan tâm liệu Eigen hay ATLAS nhanh hơn. Nếu Eigen nhanh hơn ATLAS thì tôi sẽ sử dụng Eigen làm phụ trợ BLAS.

Tuyên bố miễn trừ trách nhiệm: Vâng, FLENS là con tôi! Điều đó có nghĩa là tôi đã mã hóa khoảng 95% của nó và mỗi dòng mã đều có giá trị :-)


Xin chào Michael, chào mừng bạn đến với scicomp. URL của bạn không hoạt động với tôi, có vấn đề gì với máy chủ của bạn không?
Aron Ahmadia

Cảm ơn đã gợi ý. URL là chính xác nhưng có vẻ như chúng ta đang gặp vấn đề ở bộ phận toán học với máy chủ tệp. Chỉ đúng giờ vào cuối tuần ...
Michael Lehn

1
Ok, tôi vừa tạo tài liệu mới từ repo git hiện tại và sao chép nó trên một máy chủ khác: apfel.mathematik.uni-ulm.de/~lehn/FLENS/index.html
Michael Lehn



1

Điều gì sẽ là thư viện ma trận tốt nhất để xử lý các ma trận kích thước nhỏ, thường được sử dụng, ví dụ, khi lắp ráp các ma trận phần tử hữu hạn, để thực hiện các hoạt động tenor, v.v.

Tôi đã sử dụng PETSc cho giải pháp cho các hệ thống tuyến tính thưa thớt lớn phát sinh trong ứng dụng của mình, nhưng hiện tại tôi đang sử dụng thư viện đơn giản của riêng mình để xử lý các ma trận / vectơ này ... Tôi đang xem xét chuyển sang thư viện nhanh hơn Giống như những người được đề cập ở trên.

Điều gì sẽ là sự lựa chọn tốt nhất để kết hợp với PETSc? Eigen? Armadillo? SÁCH :: uBlas? MTL4? Tôi sử dụng một số thứ từ BOOST, vì vậy, trước tiên tôi nghĩ về việc sử dụng BOOST :: uBlas, nhưng không có nhiều tài liệu, ví dụ, v.v.


2
Tôi thực sự khuyên bạn không nên sử dụng uBlas, vì nó được biết là có độ lớn chậm hơn so với các thói quen BLAS được tối ưu hóa. Tôi nghĩ rằng Eigen tỏa sáng nhất cho các ma trận rất nhỏ do các thủ thuật mẫu thông minh.
Jack Poulson

1
Điều này có lẽ tốt hơn cho một câu hỏi riêng biệt. Tôi biết rằng Eigen, MTL4 và Armadillo đều có thủ thuật để giải các hệ thống kích thước nhỏ, nhưng tôi nghĩ bạn đang hỏi cách lắp ráp ma trận, và vì thế, tôi không biết. Tôi thường lắp ráp ma trận từng yếu tố. Tôi không chắc liệu có bất kỳ thư viện nào được đề cập là tốt để ghép với PETSc hay không; Tôi chưa phải là người dùng PETSc. Tuy nhiên, tôi nhận xét thứ hai của Jack về Boost :: uBlas, vì nó chậm.
Geoff Oxberry

1

Armadillo, Boost và những người khác hiện là một phần của Ceemple, một môi trường tính toán kỹ thuật C ++ dựa trên JIT nhanh chóng. Có sẵn (miễn phí) từ http://www.ceemple.com .


0

Ngạc nhiên cho đến nay không ai đề cập đến TooN . Đã hạnh phúc sử dụng nó trong gần 3 năm nay.

Nó rất giống với Eigen mặc dù không toàn diện. Tuy nhiên tôi nghĩ rằng nó có cú pháp đẹp hơn theo một số cách.

Nó cũng đi kèm với các lớp giúp mô hình hóa các phép biến đổi phổ biến thường gặp trong Đồ họa và Tầm nhìn, dựa trên Nhóm Lie (Đặc biệt Euclide / Trực giao trong 2 và 3 chiều, v.v.) và Lie Algebras liên quan.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.