[Из песочницы] Так ли быстр ваш любимый С или нативная реализация линейной алгебры на D

Тем, кто занимается системами машинного обучения и компьютерным зрением, хорошо знакома такая библиотека как 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.

Тестовая конфигурация будет состоять из:

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

Результаты (больше — лучше):

33e52597d7384a57b3ceee7dbfa6d546.png
d522ea45104649afa844946be05973b7.png
39918bf129654a788fdd1a304c2c8423.png
1faa37d9183d4febaf3ba471fe892f1c.png
02a3eb53c85c4e2692117fdaa6ebf406.png
b07cff8e9269473fbb3d53634a1b52b8.png
e53891e0a8cf478b82bae8e2b85203c7.png
10ad721a3e304ce2bfc54819034e86ee.png

Итоги:

— Mir GLAS значительно опережает OpenBLAS и Apple Accelerate по всем показателям.
 — Mir GLAS оказывается быстрее почти в два раза чем Eigen и Apple Accelerate при работе с матрицами.
 — По скорости Mir GLAS оказывается сопоставим с проприетарным Intel MKL, который является самым быстрым в своем роде.
 — Благодаря своему дизайну Mir GLAS легко может быть адаптирован для новых архитектур.

P.S. В настоящий момент на базе GLAS активно развивается система компьютерного зрения DCV.

» Оригинальная статья расположена в блоге автора.

Комментарии (3)

  • 3 октября 2016 в 10:12

    0

    У меня только два вопроса:
    1. Почему сравнивалась однопоточная реализация? MirGLAS не умеет в многопоточность?
    2. Почему такие игрушечные матрицы? 2000×2000 в double = 30,5 мегабайт. Все три матрицы 100 мегабайт занимают. Т.е. данные неплохо закэшированы будут, может этим и объясняются почти одинаковые результаты многих тестов. Хотелось бы тест на матрицах бОльших размеров, хотя бы 10К*10К. А то компьютер с 16ГБ оперативки и используете 100МБ.
    • 3 октября 2016 в 10:17

      0

      Сюда же можно добавить, что нет исходников кода тестов для остальных библиотек, нет информации о версиях и ключах компилятора. Да и сравнение только на макбуке выглядит не очень логично, стоило бы добавить хотя бы Федора.
  • 3 октября 2016 в 10:13 (комментарий был изменён)

    0

    > Для компиляции библиотеки Mir GLAS нам потребуется компилятор LDC (LLVM D Compiler). Компилятор DMD официально не поддерживается т.к. он не поддерживает инструкции AVX и AVX2.

    Следует думать, что и остальные участники теста были скомпилированы из исходников, с поддержкой всех инструкций целевого процессора? А то как бы не оказалось, что чемпион собран со всеми оптимизациями, а остальные пакеты — стоковые, собранные под generic i586.

    P.S.: За openBLAS как-то обидно.

© Habrahabr.ru