Дмитpий Hecтepук

Блог о программировании — C#, F#, C++, архитектура, и многое другое

Оптимизация математических выражений для CPU и GPU

4 комментария

Когда я создавал MathSharp, я преследовал вполне простую цель — мне нужно было чтобы уравнения, которые записали инженеры, могли быть точно и аккуратно переведены из языка формул на язык C#. На практике, это означает, что написав красивое уравнение вроде y = ax^2+bx+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 обрабатывают вычисление ax+b еще быстрее, чем эти операции отдельно (типа пруф). И это только вершина айсберга — по-хорошему, вариантов для оптимизации – масса.

Кстати, MathSharp — это такой небольшой пруф того, что приложение может быть написано на F#, использовать функциональные фишки (алгебраические типы, рекурсивный частичный паттерн-матчинг) и при этом жить, продаваться, развиваться. Правда если хотите tool support то вам скорее сюда — увы, я решил что делать из FSharper коммерческий продукт – слишком сложно. Основная причина – что F# не “тянет” чтобы парсить сам себя. По скорости не тянет. На GPU может и можно, но это нужно исследовать.

Ну и напоследок – кто-нибудь может посоветовать workflow engine для коротких операций? Не workflow foundation со всем его багажом, а что-нибудь легковесное, чтобы можно было “самодокументировать” алгоритмы через какой-нть fluent interface или dsl. Заранее спасибо.

Advertisements

Written by Dmitri

14 июля 2011 в 22:47

Опубликовано в Technology

комментария 4

Subscribe to comments with RSS.

  1. может быть Вам поможет Irony http://irony.codeplex.com

    Сергей

    15 июля 2011 at 10:27

  2. Дмитрий, что — то сайт activemesa недоступен, хотя и пингуется.

    Вася

    16 июля 2011 at 0:34


Оставить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: