Оптимізація математичних виразів для CPU і GPU
Коли я створював MathSharp , Я переслідував цілком просту мету - мені потрібно було щоб рівняння, які записали інженери, могли бути точно і акуратно переведені з мови формул на мову C #. На практиці, це означає, що написавши красиве рівняння на кшталт його можна автоматично конвертувати в щось подібне:
public void y (double a, double b, double c, double x) {return x * (a * x + b) + c; }
Код вище, як ви бачите, оптимізує кількість множень, і в загальному випадку, MathSharp намагається зрізати вартість обчислень до абсолютного мінімуму, не вдаючись в цьому до особливо збоченим методам .
Код вище легко генерувати, і створене AST дозволить вам створити код на будь-якій мові, будь то на C #, F # або C ++. Але навіщо зупинятися на цьому?
Нещодавно, я почав працювати з GPU.NET . Незважаючи на спостереження автора однієї не особливо добре відрецензованих статті на RSDN, бібліотека працює, і підхід мені подобається. А тому, мені прийшла в голову (геніальна?) Думка - MathSharp може оптимізувати код не тільки для CPU але і для GPU! В результаті, наша функція вище може виглядати ось так:
public void y (double a, double b, double c, double x) {return DeviceMath.MultiplyAndAdd (DeviceMath.MultiplyAndAdd (a, x, b), x, c); }
Суть тут в тому, що деякі GPU обробляють обчислення ще швидше, ніж ці операції окремо (типу пруф ). І це тільки вершина айсберга - по-хорошому, варіантів для оптимізації - маса.
До речі, MathSharp - це такий невеликий пруф того, що додаток може бути написано на F #, використовувати функціональні фішки (алгебраїчні типи, рекурсивний частковий патерн-матчінг) і при цьому жити, продаватися, розвиватися. Правда якщо хочете tool support то вам швидше за сюди - на жаль, я вирішив що робити з FSharper комерційний продукт - занадто складно. Основна причина - що F # не «тягне" щоб парсити сам себе. За швидкістю не тягне. На GPU може і можна, але це потрібно досліджувати.
Ну і наостанок - хто-небудь може порадити workflow engine для коротких операцій? Чи не workflow foundation з усім його багажем, а що-небудь легковаге, щоб можна було "самодокументіровать" алгоритми через якийсь нть fluent interface або dsl. Заздалегідь дякую.
Але навіщо зупинятися на цьому?Геніальна?
Ну і наостанок - хто-небудь може порадити workflow engine для коротких операцій?