Информация об изменениях

Сообщение Re[3]: Производительность .Net на вычислительных задачах от 24.10.2020 16:50

Изменено 24.10.2020 18:19 Evgeny.Panasyuk

Re[3]: Производительность .Net на вычислительных задачах
Здравствуйте, Sinclair, Вы писали:

S>Хочется-то иметь компактный, понятный, легко отлаживаемый пользовательский код. А уж разворачиванием его в килобайты бинаря под конкретную архитектуру пусть занимается тупая машина.

S>Может быть, и на С++ тоже можно написать какой-то подобный аналог.

Кончено — есть compile-time EDSL'и — например expresion templates, на них например построен Eigen — пользовательский высокоуровневый код работающий с матрицами, оптимизируется библиотекой на этапе компиляции, причём на разных уровнях, начиная с того как эффективней расставить скобки в выражении, и заканчивая разкруткой циклов, параллелизацей и векторизацией под конкретную платформу.
Эта техника вообще старше C#: статья из 1995. И даже есть не просто библиотеки использующие expression templates, а есть библиотеки для построения таких библиотек:

https://www.boost.org/doc/libs/1_74_0/doc/html/proto.html
In short, Proto is an EDSL for defining EDSLs.


Также есть варианты построения runtime-EDSL'ей, они ещё более выразительные, в бэкенде дёргается обычный компилятор, здесь возможности вообще безграничны, вплоть до оптимизации кода под конкретные runtime данные. Это всё например реализовано в библиотеке TaskGraph.
Re[3]: Производительность .Net на вычислительных задачах
Здравствуйте, Sinclair, Вы писали:

S>Хочется-то иметь компактный, понятный, легко отлаживаемый пользовательский код. А уж разворачиванием его в килобайты бинаря под конкретную архитектуру пусть занимается тупая машина.

S>Может быть, и на С++ тоже можно написать какой-то подобный аналог.

Кончено — есть compile-time EDSL'и — например expresion templates, на них например построен Eigen — пользовательский высокоуровневый код работающий с матрицами, оптимизируется библиотекой на этапе компиляции, причём на разных уровнях, начиная с того как эффективней расставить скобки в выражении, и заканчивая разкруткой циклов, параллелизацей и векторизацией под конкретную платформу.
Эта техника вообще старше C#: статья из 1995. И даже есть не просто библиотеки использующие expression templates, а есть библиотеки для построения таких библиотек:

https://www.boost.org/doc/libs/1_74_0/doc/html/proto.html
In short, Proto is an EDSL for defining EDSLs.


Также есть варианты построения runtime-EDSL'ей, они ещё более выразительные, в бэкенде дёргается обычный компилятор, здесь возможности вообще безграничны, вплоть до оптимизации кода под конкретные runtime данные. Это всё например реализовано в библиотеке TaskGraph.
Собственно ты это и делаешь — самописная трансляция из EDSL'я в векторные инструкции. Только для этого Linq не нужен — runtime дерево выражений строится практически на любом языке на минимальном наборе языковых фич — смотри например SymPy. Если бы ты сам себя не ограничивал Linq'ом — получилось намного более выразительней и мощнее