Mối quan hệ giữa BLAS, LAPACK và ATLAS là gì


142

Tôi không hiểu BLAS, LAPACK và ATLAS có liên quan như thế nào và tôi nên sử dụng chúng cùng nhau như thế nào! Tôi đã xem qua tất cả các hướng dẫn sử dụng của họ và tôi có một ý tưởng chung về BLAS và LAPACK và cách sử dụng chúng với rất ít ví dụ tôi tìm thấy, nhưng tôi không thể tìm thấy bất kỳ ví dụ thực tế nào sử dụng ATLAS để xem nó có liên quan như thế nào với hai cái này

Tôi đang cố gắng thực hiện một số công việc cấp thấp về ma trận và ngôn ngữ chính của tôi là C. Đầu tiên tôi muốn sử dụng GSL, nhưng nó nói rằng nếu bạn muốn hiệu suất tốt nhất, bạn nên sử dụng BLAS và ATLAS. Có trang web nào tốt đưa ra một số ví dụ hay về cách sử dụng tất cả (trong C) cùng nhau không? Nói cách khác, tôi đang tìm kiếm một hướng dẫn về cách sử dụng ba (hoặc bất kỳ tập hợp con nào trong số chúng!). Tóm lại tôi bối rối!


Câu trả lời:


156

BLAS là tập hợp các phép toán số học ma trận và vectơ cấp thấp (Bang nhân một vectơ bằng một số vô hướng, Hồi nhân hai ma trận và thêm vào ma trận thứ ba, v.v ...).

LAPACK là một tập hợp các phép toán đại số tuyến tính cấp cao hơn. Những thứ như nhân tố ma trận (LU, LLt, QR, SVD, Schur, v.v.) được sử dụng để làm những việc như khỏe, tìm giá trị riêng của ma trận, hoặc tìm thấy các giá trị số ít của ma trận, hoặc giải quyết một hệ thống tuyến tính Mùi. LAPACK được xây dựng trên đỉnh BLAS; nhiều người dùng LAPACK chỉ sử dụng các giao diện LAPACK và không bao giờ cần phải biết về BLAS. LAPACK thường được biên dịch riêng biệt với BLAS và có thể sử dụng bất kỳ triển khai BLAS nào được tối ưu hóa cao mà bạn có sẵn.

ATLAS là một triển khai hợp lý tốt các giao diện BLAS, cũng thực hiện một số hoạt động LAPACK được sử dụng phổ biến nhất.

Bạn nên sử dụng những gì mà bạn nên sử dụng, tùy thuộc vào chi tiết về những gì bạn đang cố gắng làm và nền tảng bạn đang sử dụng. Tuy nhiên, bạn sẽ không đi quá xa với việc sử dụng ATLAS + LAPACK, tuy nhiên.


Cảm ơn đã giải thích. Bạn có biết bất kỳ ví dụ nào về CÁCH sử dụng ATLAS + LAPACK không? Tôi cần xem một vài ví dụ để hiểu cách sử dụng chúng! Tôi hiểu những gì họ làm và lý thuyết về những gì họ làm, nhưng tôi khó có thể tìm thấy bất kỳ ví dụ nào trong C về cách thực hiện trong thực tế.
makhlaghi

1
@astroboy: bạn có thể cho tôi một số thông tin về những gì bạn đang thực sự làm không? LAPACK đặc biệt là một thư viện khổng lồ .
Stephen Canon

Để đơn giản, giả sử tôi có một ma trận và tôi muốn nhân nó với một giá trị nhất định. Làm cách nào để kết hợp ATLAS và (LAPACK hoặc BLAS) trong C? Tôi chỉ muốn xem làm thế nào để thực hiện bất kỳ chức năng nào trong số này. Có một vài ví dụ trong netlib.org/lapack/lapacke.html nhưng không có đề cập đến ATLAS!
makhlaghi

Có bất cứ điều gì như BLAS, LAPACK hoặc MKL có thể hoạt động trong suốt với objetcs lớn hơn nhiều so với bộ nhớ không?
skan

1
@ MinhNghĩa: Có một tiêu chuẩn, netlib.org/blas/blast-forum , nhưng (a) không có sự thi hành - một tiêu chuẩn không có bộ kiểm tra thực sự không phải là một tiêu chuẩn - và (b) Tôi không nghĩ rằng bất cứ ai cũng thực hiện trọn bộ giao diện được mô tả bởi tài liệu đó. Đó là, uh, khát vọng.
Stephen Canon

40

Trong khi trước đây, khi tôi bắt đầu làm một số đại số tuyến tính trong C, nó đến với tôi như một bất ngờ cho thấy có rất ít hướng dẫn cho BLAS, LAPACKvà nền tảng khác APIs, mặc dù thực tế rằng họ là bằng cách nào đó những nền tảng của nhiều thư viện khác. Vì lý do đó, tôi bắt đầu thu thập tất cả các ví dụ / hướng dẫn tôi có thể tìm thấy tất cả qua internet cho BLAS, CBLAS, LAPACK, CLAPACK, LAPACKE, ATLAS, OpenBLAS... trong repo Github này .

Chà, tôi nên cảnh báo bạn rằng là một kỹ sư cơ khí, tôi có ít kinh nghiệm trong việc quản lý kho git hoặc GitHub như vậy. Đầu tiên nó sẽ có vẻ như là một mớ hỗn độn với các bạn. Tuy nhiên, nếu bạn xoay sở để vượt qua cấu trúc lộn xộn, bạn sẽ tìm thấy tất cả các loại ví dụ và hướng dẫn có thể giúp ích. Tôi đã thử hầu hết trong số họ, để chắc chắn rằng họ biên dịch. Và những cái không biên dịch tôi đã đề cập. Tôi đã sửa đổi nhiều trong số họ làm compilable với GNU compilers( gcc, g++gfortran). Tôi đã thực hiện MakeFiles mà bạn có thể đọc để tìm hiểu làm thế nào bạn có thể gọi cá nhân Fortran/FORTRANthói quen trong một Choặc C++chương trình. Tôi cũng đã đặt một số hướng dẫn cài đặt cho mac và linux (xin lỗi các bạn windows!). Tôi cũng đã làm một sốbash .sh các tập tin để tự động biên dịch một số các thư viện này.

Nhưng đi đến câu hỏi khác của bạn: BLASLAPACKkhá APIlà không cụ thể SDK. Chúng chỉ là một danh sách các thông số kỹ thuật hoặc phần mở rộng ngôn ngữ chứ không phải là một triển khai hoặc thư viện. Với những gì đã nói, có những triển khai ban đầu bằng cách Netlib trong FORTRAN 77, mà hầu hết mọi người tham khảo (mức gây nhầm lẫn!) Khi nói về BLASLAPACK. Vì vậy, nếu bạn thấy nhiều điều kỳ lạ khi sử dụng những điều này APIlà bởi vì bạn thực sự đang gọi FORTRANcác thói quen trong Cchứ không phải là Cthư viện và các chức năng. ATLASOpenBLASlà một số trong những triển khai tốt nhất BLASLACPACKtheo như tôi biết. Chúng phù hợp với bản gốc API, mặc dù, theo hiểu biết của tôi, chúng được thực hiện trênC/C++từ đầu (không chắc chắn!). Có các triển khai GPGPU của các APIs bằng cách sử dụng OpenCL: CLBlast , clBLAS , clMAGMA , ArrayFireViennaCL để đề cập đến một số. Ngoài ra còn có các triển khai cụ thể của nhà cung cấp được tối ưu hóa cho phần cứng hoặc nền tảng cụ thể, điều mà tôi không khuyến khích bất kỳ ai sử dụng chúng.

Đề nghị của tôi cho bất cứ ai muốn học sử dụng BLASLAPACKtrong Clà học FORTRAN-Clập trình hỗn hợp trước. Chương đầu tiên của repo được đề cập là dành riêng cho vấn đề này và ở đó tôi đã thu thập được nhiều ví dụ khác nhau.

PS Tôi đã làm việc trên nhánh dev của kho lưu trữ theo thời gian. Có vẻ hơi ít lộn xộn!


Trang Wikipedia cho LAPACK bắt đầu với "LAPACK (Gói đại số tuyến tính) là một thư viện phần mềm tiêu chuẩn". Bạn có nói rằng điều đó không chính xác, vì đó là một đặc tả API và không phải là triển khai?
Noah_S

1
Sau một số nghiên cứu, có vẻ như LAPACK và BLAS thực sự là những triển khai. Từ faq của NetLib trên BLAS: "BLAS (Chương trình con đại số tuyến tính cơ bản) là các thói quen cung cấp các khối xây dựng tiêu chuẩn để thực hiện các hoạt động vectơ và ma trận cơ bản". Từ trang GitHub của LAPACK: "LAPACK là một thư viện của chương trình con Fortran". Dựa vào đó và khi đọc qua dự án GitHub của LAPACK, ấn tượng của tôi là BLAS và LAPACK thực sự là các triển khai - LAPACK xây dựng trên BLAS để cung cấp chức năng tinh vi hơn.
Noah_S

1
@Noah_S Tôi sẽ không sử dụng Wikipedia làm "tài liệu tham khảo", nhưng theo hiểu biết hạn hẹp của tôi, có một số triển khai LAPACK. Tôi nghĩ bây giờ gọi nó là API chính xác hơn. nhưng xin vui lòng sửa cho tôi nếu tôi sai.
Foad

2
Tôi nghĩ một phần của sự nhầm lẫn là BLAS là một API / đặc tả, nhưng cũng có một "Triển khai tham chiếu" của BLAS (từ Netlib) cũng được gọi là "thư viện BLAS". Thông thường khi mọi người nói BLAS, họ có nghĩa là API, vì Triển khai tham chiếu không được tối ưu hóa, do đó, nó không được sử dụng nhiều trong thực tế / công nghiệp. ATLAS cung cấp một triển khai tối ưu hóa một vài chương trình con LAPACK và sau đó tùy ý lấy phần còn lại từ chính LAPACK để tạo ra một triển khai LAPACK hoàn chỉnh trong các tệp lib ATLAS được xây dựng.
Andrew Janke

1
@Noah_S Không có mâu thuẫn, mỗi thư viện có một API, điều này cho phép thực hiện lại chức năng thực tế trong khi vẫn tương thích API và đó là điều đã xảy ra với LAPACK.
Andrey

17

ATLAS bây giờ khá lỗi thời. Nó được phát triển vào thời điểm người ta nghĩ rằng tối ưu hóa BLAS cho các nền tảng khác nhau vượt quá khả năng của con người, và kết quả là tự phát và tự động hóa là cách để đi.

Đầu những năm 2000, cùng với Kazushige Goto, người đã cho thấy việc triển khai hiệu quả cao có thể được mã hóa bằng tay như thế nào. Bạn có thể thưởng thức một bài viết thú vị trên Thời báo New York: https://www.nytimes.com/2005/11/11/t Technology / Writing- the- fastest-code-by-hand-for-fun-a-human- giữ máy tính.html .

Một mặt của Kazushige có những hiểu biết tốt hơn về lý thuyết đằng sau việc triển khai hiệu suất cao của phép nhân ma trận, và mặt khác đã chế tạo những thứ này tốt hơn. Cách tiếp cận của ông, mà trên các CPU hiện tại thường có hiệu suất cao nhất, không nằm trong không gian tìm kiếm mà ATLAS tự động. Do đó, ATLAS vốn đã kém hơn. Việc triển khai BLAS của Kazushige được gọi là GotoBLAS. Nó được gọi là OpenBLAS khi anh gia nhập ngành.

Các ý tưởng đằng sau GotoBLAS đã được tái cấu trúc thành một triển khai mới, khung công tác Phần mềm khởi tạo thư viện (BLIS) giống như BLAS ( https://github.com/flame/blis ), thực hiện cùng một thuật toán, nhưng cấu trúc mã sao cho ít hơn cần phải được thực hiện tùy chỉnh cho một kiến ​​trúc mới. BLIS được mã hóa bằng C.

Những gì cuộc thảo luận này cho thấy là có nhiều triển khai BLAS. Bản thân BLAS là một tiêu chuẩn thực tế cho giao diện. ATLAS đã từng là trạng thái của nghệ thuật. Không còn nữa.


0

Theo như tôi biết, và sau khi làm việc thông qua kho ATLAS, có vẻ như nó bao gồm việc triển khai lại BLAS trong C. Có nhiều điều hơn thế nhưng tôi hy vọng nó trả lời được câu hỏi.

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.