Một điểm khởi đầu tốt là cuốn sách tuyệt vời Khoa học về tính toán ma trận lập trình của Robert A. van de Geijn và Enrique S. Quintana-Ortí. Họ cung cấp một phiên bản tải xuống miễn phí.
BLAS được chia thành ba cấp độ:
Mức 1 xác định một tập hợp các hàm đại số tuyến tính chỉ hoạt động trên vectơ. Các chức năng này được hưởng lợi từ vectơ hóa (ví dụ như từ việc sử dụng SSE).
Các hàm cấp 2 là các phép toán vectơ-ma trận, ví dụ một số tích vectơ-ma trận. Các chức năng này có thể được thực hiện theo các chức năng Cấp 1. Tuy nhiên, bạn có thể tăng hiệu suất của các chức năng này nếu bạn có thể cung cấp một triển khai chuyên dụng sử dụng một số kiến trúc đa xử lý với bộ nhớ dùng chung.
Các hàm cấp 3 là các hoạt động giống như sản phẩm ma trận-ma trận. Một lần nữa, bạn có thể triển khai chúng theo các chức năng Cấp 2. Nhưng các hàm Level 3 thực hiện các phép toán O (N ^ 3) trên dữ liệu O (N ^ 2). Vì vậy, nếu nền tảng của bạn có hệ thống phân cấp bộ đệm thì bạn có thể tăng hiệu suất nếu bạn cung cấp một triển khai chuyên dụng được tối ưu hóa bộ đệm / thân thiện với bộ đệm . Điều này được mô tả độc đáo trong cuốn sách. Sự thúc đẩy chính của các chức năng Level3 đến từ việc tối ưu hóa bộ nhớ cache. Sự gia tăng này vượt quá đáng kể mức tăng thứ hai từ tính năng song song và các tối ưu hóa phần cứng khác.
Nhân tiện, hầu hết (hoặc thậm chí tất cả) việc triển khai BLAS hiệu suất cao KHÔNG được triển khai trong Fortran. ATLAS được triển khai trong C. GotoBLAS / OpenBLAS được triển khai trong C và các phần quan trọng về hiệu suất của nó trong Assembler. Chỉ triển khai tham chiếu của BLAS được thực hiện trong Fortran. Tuy nhiên, tất cả các triển khai BLAS này cung cấp một giao diện Fortran để nó có thể được liên kết với LAPACK (LAPACK nhận được tất cả hiệu suất của nó từ BLAS).
Các trình biên dịch được tối ưu hóa đóng một vai trò nhỏ trong khía cạnh này (và đối với GotoBLAS / OpenBLAS, trình biên dịch không quan trọng chút nào).
Triển khai IMHO no BLAS sử dụng các thuật toán như thuật toán Coppersmith – Winograd hoặc thuật toán Strassen. Tôi không chắc chắn chính xác về lý do, nhưng đây là suy đoán của tôi:
- Có thể không thể cung cấp triển khai tối ưu hóa bộ nhớ cache của các thuật toán này (tức là bạn sẽ mất nhiều thời gian hơn thì bạn sẽ thắng)
- Các thuật toán này không ổn định về mặt số học. Vì BLAS là hạt nhân tính toán của LAPACK, đây là điều không nên làm.
Chỉnh sửa / Cập nhật:
Bài báo mới và mang tính đột phá cho chủ đề này là bài báo BLIS . Chúng được viết rất tốt. Đối với bài giảng của tôi "Khái niệm cơ bản về phần mềm cho máy tính hiệu suất cao", tôi đã triển khai sản phẩm ma trận-ma trận sau bài báo của họ. Trên thực tế, tôi đã triển khai một số biến thể của sản phẩm ma trận. Các biến thể đơn giản nhất được viết hoàn toàn bằng C đơn giản và có ít hơn 450 dòng mã. Tất cả các biến thể khác chỉ tối ưu hóa các vòng lặp
for (l=0; l<MR*NR; ++l) {
AB[l] = 0;
}
for (l=0; l<kc; ++l) {
for (j=0; j<NR; ++j) {
for (i=0; i<MR; ++i) {
AB[i+j*MR] += A[i]*B[j];
}
}
A += MR;
B += NR;
}
Hiệu suất tổng thể của sản phẩm ma trận chỉ phụ thuộc vào các vòng lặp này. Khoảng 99,9% thời gian được dành ở đây. Trong các biến thể khác, tôi đã sử dụng bản chất và mã trình hợp dịch để cải thiện hiệu suất. Bạn có thể xem hướng dẫn về tất cả các biến thể tại đây:
ulmBLAS: Hướng dẫn về GEMM (Sản phẩm Ma trận-Ma trận)
Cùng với các bài báo BLIS, khá dễ hiểu làm thế nào các thư viện như Intel MKL có thể đạt được hiệu suất như vậy. Và tại sao nó không quan trọng cho dù bạn sử dụng lưu trữ chính hàng hay cột!
Các điểm chuẩn cuối cùng ở đây (chúng tôi gọi là dự án của mình là ulmBLAS):
Điểm chuẩn cho ulmBLAS, BLIS, MKL, openBLAS và Eigen
Chỉnh sửa / Cập nhật khác:
Tôi cũng đã viết một số hướng dẫn về cách BLAS được sử dụng cho các bài toán đại số tuyến tính số như giải một hệ phương trình tuyến tính:
Hệ số hóa LU hiệu suất cao
(Ví dụ, phép phân tích LU này được Matlab sử dụng để giải hệ phương trình tuyến tính.)
Tôi hy vọng sẽ có thời gian để mở rộng hướng dẫn để mô tả và trình bày cách thực hiện song song khả năng mở rộng cao của phép phân tích nhân tử LU như trong PLASMA .
Ok, bạn bắt đầu: Mã hóa bộ nhớ cache tối ưu hóa LU song song thừa số
Tái bút: Tôi cũng đã thực hiện một số thử nghiệm về việc cải thiện hiệu suất của uBLAS. Nó thực sự khá đơn giản để tăng (vâng, chơi chữ :))) hiệu suất của uBLAS:
Thử nghiệm trên uBLAS .
Đây là một dự án tương tự với BLAZE :
Thử nghiệm trên BLAZE .