Так швидкий ваш улюблений З нативна або реалізація лінійної алгебри на 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

Результати (більше — краще):










Підсумки:

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

p.s. В даний момент на базі GLAS активно розвивається система комп'ютерного зору DCV.

» Оригінальна стаття розташована в блозі автора.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.