Хорошей отправной точкой является великая книга Наука программирования матричных вычислений Роберта А. ван де Гейна и Энрике С. Кинтана-Орти. Они предоставляют бесплатную версию для загрузки.
BLAS делится на три уровня:
Уровень 1 определяет набор функций линейной алгебры, которые работают только с векторами. Эти функции выигрывают от векторизации (например, от использования SSE).
Функции уровня 2 - это матрично-векторные операции, например, некоторое матрично-векторное произведение. Эти функции могут быть реализованы в терминах функций уровня 1. Однако вы можете повысить производительность этих функций, если сможете обеспечить выделенную реализацию, которая использует некоторую многопроцессорную архитектуру с разделяемой памятью.
Функции уровня 3 - это операции, подобные матрично-матричному произведению Опять же, вы можете реализовать их в терминах функций уровня 2. Но функции уровня 3 выполняют O (N ^ 3) операций с данными O (N ^ 2). Поэтому, если ваша платформа имеет иерархию кеша, вы можете повысить производительность, если предоставите выделенную реализацию, оптимизированную для кеша / дружественную для кеша . Это хорошо описано в книге. Основной импульс функций уровня 3 связан с оптимизацией кэша. Это усиление значительно превышает второе усиление от параллелизма и других аппаратных оптимизаций.
Кстати, большинство (или даже все) высокопроизводительных реализаций BLAS НЕ реализованы на Фортране. ATLAS реализован на C. GotoBLAS / OpenBLAS реализован на C, а его критически важные компоненты - на Ассемблере. Только эталонная реализация BLAS реализована на Фортране. Однако все эти реализации BLAS предоставляют интерфейс Fortran, так что он может быть связан с LAPACK (LAPACK получает всю свою производительность от BLAS).
Оптимизированные компиляторы играют незначительную роль в этом отношении (и для GotoBLAS / OpenBLAS компилятор не имеет никакого значения).
ИМХО в реализации BLAS не используются такие алгоритмы, как алгоритм Копперсмита-Винограда или алгоритм Штрассена. Я не совсем уверен в причине, но это мое предположение:
- Возможно, невозможно обеспечить оптимизированную кэш-памятью реализацию этих алгоритмов (т. Е. Вы потеряете больше, чем выиграете)
- Эти алгоритмы численно нестабильны. Поскольку BLAS является вычислительным ядром LAPACK, это не нужно.
Редактировать / Update:
Новая и новаторская статья по этой теме - BLIS paper . Они исключительно хорошо написаны. Для своей лекции «Основы программного обеспечения для высокопроизводительных вычислений» я реализовал матрично-матричный продукт, следуя их статье. На самом деле я реализовал несколько вариантов матрично-матричного продукта. Простейшие варианты полностью написаны на простом C и содержат менее 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;
}
Общая производительность матрично-матричного продукта * только 1042 * зависит от этих циклов. Около 99,9% времени проводится здесь. В других вариантах я использовал встроенный код и ассемблерный код для повышения производительности. Вы можете увидеть учебник, который рассматривает все варианты здесь:
ulmBLAS: Учебное пособие по GEMM (Matrix-Matrix Product)
Вместе с документами BLIS становится довольно легко понять, как такие библиотеки, как Intel MKL, могут добиться такой производительности. И почему не важно, используете ли вы главное хранилище строк или столбцов!
Финальные тесты здесь (мы назвали наш проект ulmBLAS):
Тесты для ulmBLAS, BLIS, MKL, openBLAS и Eigen
Другое редактирование / обновление:
Я также написал учебник о том, как BLAS используется для решения задач численной линейной алгебры, таких как решение системы линейных уравнений:
Высокая производительность LU Факторизация
(Эта факторизация LU, например, используется Matlab для решения системы линейных уравнений.)
Я надеюсь найти время для расширения учебного руководства, чтобы описать и продемонстрировать, как реализовать масштабируемую параллельную реализацию факторизации LU, как в PLASMA .
Хорошо, вот и все: Кодирование кэш-оптимизированной параллельной LU-факторизации
П.С .: Я также провел несколько экспериментов по улучшению производительности uBLAS. На самом деле довольно просто повысить (да, играть словами) производительность uBLAS:
Эксперименты на uBLAS .
Здесь похожий проект с BLAZE :
Эксперименты на BLAZE .