Показ дописів із міткою бібліотеки лінійної алгебри. Показати всі дописи
Показ дописів із міткою бібліотеки лінійної алгебри. Показати всі дописи

понеділок, 12 листопада 2012 р.

Вступ до технології CUDA

7 листопада 2011 року, рік тому, я розповідав про CUDA на семінарі нашого інституту, присвяченому суперкомп'ютерним обчисленням. Однак, з того часу ніяк не вдавалося зібратися запостити розповідь тут. Цього року під час того ж семінару, знову повернувся до теми CUDA, акцентуючи увагу на готових рішеннях -- бібліотеках. Паралельно усвідомив, що відтягувати далі не варто.

Презентація доповіді 2011-го року можна скачати тут. Звичайно, з того часу вона встигла вже дещо застаріти. Нова, яка містить скорочений та оновлений варіант попередньої доповіді, плюс розповідь, із прикладами, про деякі бібліотеки CUDA -- тут. І одна і друга містить певну кількість помилок та неточностей. Побачите їх -- пишіть мені!

Ліцензія, як і всіх матеріалів у цьому блозі, якщо не сказано іншого -- Creative Commons Attribution ShareAlike.

Перейду до того, що розповідалося. Текст нижче відповідає доповіді, писався так, щоб мені було зручно його промовляти, у наслідок чого не завжди підходить для представлення на письмі. Модифікував його зовсім трохи, тому сильно не гнівайтеся. :-)

пʼятниця, 20 липня 2012 р.

Робота з матрицями в С++ -- бібліотека eigen

(c) Eigen FAQ
Багато років я шукав зручну і швидку бібліотеку лінійної алгебри для використання з C++ (*1). Вимоги ніби скромні -- щоб вміла створювати, додавати, віднімати матриці, множити їх на скаляр, множити між собою, шукати обернені та детермінанти. Все. При чому, для зовсім маленьких матриць -- розміром до 8х8, а в основному взагалі 2х2. (*2) Ну, ще Open Source ліцензія була б бажаною. :-) Але ця вимога не критична.

Відволікаючись поки від теми продуктивності, С++ має всі засоби, щоб зробити роботу з матрицями зручною. Однак більшість авторів матричних бібліотек вдавалися в пояснення, чому писати: add_matrix(A,B) багато крутіше, ніж A+B. Завершилося все тим, що я, на базі простенької бібліотеки Slate, склепав свою матричну бібліотеку -- Slate2, зручну для моїх потреб, хоча й доволі повільну (*3). Подивитися на останню версію цього чуда можна тут (ніяким іншим чином не розповсюджував). Щастя наступило лише кілька років тому -- натрапив на eigen!

Виникла eigen всередині проекту KDE. Зараз вона надзвичайно зручна, швидка, та вміє доволі багато. Зокрема, використовує шаблонне метапрограмування, щоб обійти деякі проблеми матричних бібліотек в C++ (*4). Вміє самостійно векторизувати, використовуючи SIMD-інструкції, такі як SSE, AltiVec і ARM NEON. Eigen3 -- третя версія, векторизує навіть роботу з матрицями комплексних чисел. Працює із фіксованими, динамічними та розрідженими матрицями. В ролі елементів матриць можуть бути числа з плаваючою крапкою, комплексні числа, цілі числа, користувацькі типи. Що вміє робити над матрицями? Багато, перераховувати довго, див. краще сюди: 1, 2, 3. Надійна -- містить більше півтисячі власних тестів, проходить стандартні тести BLAS та LAPACK , використовується багатьма проектами.

З того часу, як я натрапив на eigen ситуація покращилася -- з'явилися Armadillo, MTL4 (її попередня версія, MTL2 -- якраз наглядний приклад згадуваного вище багатослівного підходу), тощо. Як на мене, вони безперечно вартують уваги, але поступаються eigen, хоча фахово не скажу -- багато тестів не писав, багато часу на ознайомлення з ними не витрачав. Щоб відобразити своє, хай не до кінця науково перевірене, ставлення до eigen, зацитую її розробників:

Some other libraries do satisfy very well certain specialized needs, but none is as versatile as Eigen, has such a nice API, etc.

*** skipped ***

The state of existing matrix libraries before Eigen is that:
 some are Free Software
 some are fast
 some have a decent API
 some handle fixed-size matrices, some handle dynamic-size dense matrices, some handle sparse matrices
 some provide linear algebra algorithms (LU, QR, ...)
 some provide a geometry framework (quaternions, rotations...)

However Eigen is the first library to satisfy all these criteria.

Ну і ліцензія хороша -- LGPL3+.