Гарною відправною точкою є чудова книга «Наука програмування матричних обчислень » Роберта А. ван де Гейна та Енріке С. Кінтана-Орті. Вони надають безкоштовну версію для завантаження.
BLAS ділиться на три рівні:
Рівень 1 визначає набір лінійних функцій алгебри, які працюють лише на векторах. Ці функції виграють від векторизації (наприклад, від використання SSE).
Функції рівня 2 - це матричні векторні операції, наприклад, деякі матричні векторні вироби. Ці функції можуть бути реалізовані з точки зору функцій Level1. Однак ви можете підвищити продуктивність цих функцій, якщо зможете забезпечити спеціальну реалізацію, яка використовує деяку багатопроцесорну архітектуру зі спільною пам'яттю.
Функції рівня 3 - це операції, подібні до матрично-матричного продукту. Знову ви зможете їх реалізувати з точки зору функцій рівня 2 Але функції Level3 виконують операції O (N ^ 3) над даними O (N ^ 2). Отже, якщо на вашій платформі є ієрархія кешу, ви можете підвищити продуктивність, якщо забезпечите спеціальну реалізацію, оптимізовану під кеш / кеш . Це добре описано в книзі. Основний приріст функцій Level3 - це оптимізація кешу. Цей приріст значно перевершує друге поштовх за рахунок паралелізму та інших апаратних оптимізацій.
До речі, більшість (або навіть усі) високоефективних реалізацій BLAS НЕ реалізовані у Fortran. ATLAS реалізований в C. GotoBLAS / OpenBLAS реалізований в C, а його критичні показники - в Assembler. У Fortran реалізована лише опорна реалізація BLAS. Однак усі ці реалізації BLAS забезпечують інтерфейс Fortran таким, що його можна пов’язати з LAPACK (LAPACK отримує всю свою ефективність від BLAS).
Оптимізовані компілятори відіграють незначну роль у цьому відношенні (а для GotoBLAS / OpenBLAS компілятор взагалі не має значення).
Реалізація IMHO no BLAS використовує такі алгоритми, як алгоритм Coppersmith – Winograd або алгоритм Strassen. Я не точно впевнений у причині, але це моя здогадка:
- Можливо, неможливо забезпечити оптимізовану кешами реалізацію цих алгоритмів (тобто ви втратите більше, ніж ви виграєте)
- Ці алгоритми чисельно не стійкі. Оскільки BLAS - це обчислювальне ядро LAPACK, це не працює.
Редагування / оновлення:
Новим та першочерговим документом для цієї теми є документи BLIS . Вони винятково добре написані. На моїй лекції "Основи програмного забезпечення для високоефективних обчислень" я реалізував матричний матричний продукт, слідуючи їхньому документу. Насправді я реалізував кілька варіантів матрично-матричного продукту. Найпростіші варіанти повністю написані на простому С і мають менше 450 рядків коду. Усі інші варіанти просто оптимізують петлі
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;
}
Загальна продуктивність продукту матриця-матриця залежить лише від цих циклів. Тут проводиться близько 99,9% часу. В інших варіантах я використовував властивості та код асемблера для підвищення продуктивності. Тут ви можете ознайомитись з навчальним посібником:
ulmBLAS: Підручник з GEMM (матриця-матричний продукт)
Разом з документами BLIS стає досить легко зрозуміти, як такі бібліотеки, як Intel MKL, можуть отримати таку продуктивність. І чому не важливо, чи використовуєте ви основне сховище рядків чи стовпців!
Остаточні орієнтири тут (ми назвали наш проект ulmBLAS):
Орієнтовні показники для ulmBLAS, BLIS, MKL, openBLAS та Eigen
Ще одне редагування / оновлення:
Я також написав підручник про те, як BLAS звикає до чисельних задач лінійної алгебри, таких як рішення системи лінійних рівнянь:
Високопродуктивна факторизація LU
(Ця LU-факторизація, наприклад, використовується Matlab для вирішення системи лінійних рівнянь.)
Я сподіваюся знайти час, щоб розширити підручник, щоб описати та продемонструвати, як реалізувати високомасштабну паралельну реалізацію LU-факторизації, як у PLASMA .
Добре, ось що: Кодування кешованої оптимізованої кешем паралельної LU-факторизації
PS: Я також робив кілька експериментів над підвищенням продуктивності uBLAS. Це насправді досить просто (так, грайте на словах :)) ефективність uBLAS:
Експерименти на uBLAS .
Ось подібний проект з BLAZE :
Експерименти на BLAZE .