Тем, кто занимается системами машинного обучения и компьютерным зрением, хорошо знакома такая библиотека как OpenBLAS (Basic Linear Algebra Subprograms). OpenBLAS написан на C и используется повсеместно там где нужна работа с матрицами. Так же у него есть несколько альтернативных реализаций таких как Eigen и двух закрытых имплементацией от Intel и Apple. Все они написаны на С\С++.
В настоящий момент OpenBLAS используется в матричных манипуляциях в таких языках как Julia и Python (NumPy). OpenBLAS крайне хорошо оптимизирована и значительная её часть вообще написана на ассемблере.
Однако так ли хорош для вычислений чистый C, как это принято считать?
Встречайте Mir GLAS! Нативная реализация библиотеки линейной алгебры на чисто D без единой вставки на ассемблере!
Для компиляции библиотеки Mir GLAS нам потребуется компилятор LDC (LLVM D Compiler). Компилятор DMD официально не поддерживается т.к. он не поддерживает инструкции AVX и AVX2.
Тестовая конфигурация будет состоять из:
» Код самого теста можно получить тут.
» Mir GLAS базируется на библиотеке mir.ndslice
Mir GLAS может быть легко использован в любом языке поддерживающим C ABI. Делается это элементарно:
Для сравнения в OpenBLAS потребуется написать следующий код:
При проведении теста установлено следующее значение переменных:
Eigen собран с флагами `EIGEN_TEST_AVX` и `EIGEN_TEST_FMA`:
Результаты (больше — лучше):
![](https://habrastorage.org/r/w1560/files/33e/525/97d/33e52597d7384a57b3ceee7dbfa6d546.png)
![](https://habrastorage.org/r/w1560/files/d52/2ea/451/d522ea45104649afa844946be05973b7.png)
![](https://habrastorage.org/r/w1560/files/399/18b/f12/39918bf129654a788fdd1a304c2c8423.png)
![](https://habrastorage.org/r/w1560/files/1fa/a37/d91/1faa37d9183d4febaf3ba471fe892f1c.png)
![](https://habrastorage.org/r/w1560/files/02a/3eb/53c/02a3eb53c85c4e2692117fdaa6ebf406.png)
![](https://habrastorage.org/r/w1560/files/b07/cff/8e9/b07cff8e9269473fbb3d53634a1b52b8.png)
![](https://habrastorage.org/r/w1560/files/e53/891/e0a/e53891e0a8cf478b82bae8e2b85203c7.png)
![](https://habrastorage.org/r/w1560/files/10a/d72/1a3/10ad721a3e304ce2bfc54819034e86ee.png)
Итоги:
— Mir GLAS значительно опережает OpenBLAS и Apple Accelerate по всем показателям.
— Mir GLAS оказывается быстрее почти в два раза чем Eigen и Apple Accelerate при работе с матрицами.
— По скорости Mir GLAS оказывается сопоставим с проприетарным Intel MKL, который является самым быстрым в своем роде.
— Благодаря своему дизайну Mir GLAS легко может быть адаптирован для новых архитектур.
P.S. В настоящий момент на базе GLAS активно развивается система компьютерного зрения DCV.
P.P.S. Оригинальный автор присутствует в комментах под ником 9il
» Оригинальная статья расположена в блоге автора.
В настоящий момент OpenBLAS используется в матричных манипуляциях в таких языках как Julia и Python (NumPy). OpenBLAS крайне хорошо оптимизирована и значительная её часть вообще написана на ассемблере.
Однако так ли хорош для вычислений чистый C, как это принято считать?
Встречайте Mir GLAS! Нативная реализация библиотеки линейной алгебры на чисто D без единой вставки на ассемблере!
Для компиляции библиотеки Mir GLAS нам потребуется компилятор LDC (LLVM D Compiler). Компилятор DMD официально не поддерживается т.к. он не поддерживает инструкции AVX и AVX2.
Тестовая конфигурация будет состоять из:
CPU | 2.2 GHz Core i7 (I7-4770HQ) |
L3 Cache | 6 MB |
RAM | 16 GB of 1600 MHz DDR3L SDRAM |
Model Identifier | MacBookPro11,2 |
OS | OS X 10.11.6 |
Mir GLAS | 0.18.0, single thread |
OpenBLAS | 0.2.18, single thread |
Eigen | 3.3-rc1, single thread (sequential configurations) |
Intel MKL | 2017.0.098, single thread (sequential configurations) |
Apple Accelerate | OS X 10.11.6, single thread (sequential configurations) |
» Код самого теста можно получить тут.
» Mir GLAS базируется на библиотеке mir.ndslice
Mir GLAS может быть легко использован в любом языке поддерживающим C ABI. Делается это элементарно:
// Performs: c := alpha a x b + beta c
// glas is a pointer to a GlasContext
glas.gemm(alpha, a, b, beta, c);
Для сравнения в OpenBLAS потребуется написать следующий код:
void cblas_sgemm (
const CBLAS_LAYOUT layout,
const CBLAS_TRANSPOSE TransA,
const CBLAS_TRANSPOSE TransB,
const int M,
const int N,
const int K,
const float alpha,
const float *A,
const int lda,
const float *B,
const int ldb,
const float beta,
float *C,
const int ldc)
При проведении теста установлено следующее значение переменных:
openBLAS | OPENBLAS_NUM_THREADS=1 |
Accelerate (Apple) | VECLIB_MAXIMUM_THREADS=1 |
Intel MKL | MKL_NUM_THREADS=1 |
Eigen собран с флагами `EIGEN_TEST_AVX` и `EIGEN_TEST_FMA`:
mkdir build_dir
cd build_dir
cmake -DCMAKE_BUILD_TYPE=Release -DEIGEN_TEST_AVX=ON -DEIGEN_TEST_FMA=ON ..
make OpenBLAS
Результаты (больше — лучше):
![](https://habrastorage.org/files/33e/525/97d/33e52597d7384a57b3ceee7dbfa6d546.png)
![](https://habrastorage.org/files/d52/2ea/451/d522ea45104649afa844946be05973b7.png)
![](https://habrastorage.org/files/399/18b/f12/39918bf129654a788fdd1a304c2c8423.png)
![](https://habrastorage.org/files/1fa/a37/d91/1faa37d9183d4febaf3ba471fe892f1c.png)
![](https://habrastorage.org/files/02a/3eb/53c/02a3eb53c85c4e2692117fdaa6ebf406.png)
![](https://habrastorage.org/files/b07/cff/8e9/b07cff8e9269473fbb3d53634a1b52b8.png)
![](https://habrastorage.org/files/e53/891/e0a/e53891e0a8cf478b82bae8e2b85203c7.png)
![](https://habrastorage.org/files/10a/d72/1a3/10ad721a3e304ce2bfc54819034e86ee.png)
Итоги:
— Mir GLAS значительно опережает OpenBLAS и Apple Accelerate по всем показателям.
— Mir GLAS оказывается быстрее почти в два раза чем Eigen и Apple Accelerate при работе с матрицами.
— По скорости Mir GLAS оказывается сопоставим с проприетарным Intel MKL, который является самым быстрым в своем роде.
— Благодаря своему дизайну Mir GLAS легко может быть адаптирован для новых архитектур.
P.S. В настоящий момент на базе GLAS активно развивается система компьютерного зрения DCV.
P.P.S. Оригинальный автор присутствует в комментах под ником 9il
» Оригинальная статья расположена в блоге автора.