Создание дополнения для SMath Studio

Аватара пользователя
viacheslavmezentsev
Сообщения: 8
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Доброго.

Нашёл вашу библиотеку интересной в плане расширения возможностей математической программы SMath Studio в плане проектирования цифровых фильтров. Там пока есть всёго одна функция: FIR Filter Design .

Сама программа написана на c# и дополнения к ней также должны быть созданы на базе .Net. Однако, существует возможность подключать код на C/C++. У меня есть богатый для этого опыт. Основная цель - это иметь возможность использовать функции библиотеки без "программирования".

Есть вопросы. Я так понимаю, что в репозитории лежит самодостаточный набор исходников? Вижу там исходники на доисторическом фиксированном фортране. Есть ли какие подводные камни, если я хочу поменять компилятор на MSVC? У меня есть опыт сборки кода на фортране, тем более, что сейчас появился Intel one API для этого, встраиваемый в Visual Studio.
Т.е. правильно ли я понимаю, что для сборки мне нужно отдельно собрать код на фортране для двух библиотек (BLAS и LAPACK), а затем подключить их для сборки самой библиотеки? Существует ли в коде какая-то специфика расширений синтаксиса от gnu C компилятора?

Мне в результате нужен набор из двух dll (32 и 64 разрядные), которые не имеют никаких "лишних" зависимостей. Функции из этих библиотек через специальный "переходник" будут подключены к математической программе. В принципе, lib файлы также подойдут. Пока попробую создать сборочное окружение самостоятельно (смешанное решение в Visual Studio).

ПС. Всё собрал как хотел, простой пример с вызовом функции из библиотеки работает. К сожалению, немножко сложновато вышло. Фортрановский код собирается при помощи современного intel компилятора из oneAPI. Таким образом получается 3 библиотеки: libblas(32|64), liblapack_complex(32|64) и liblapack_double(32|64). Далее подсовываю их в проект libdspl, но у меня он на C++/CLI. Осталось "обернуть" нужные мне функции и вызывать обёртки из .Net.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение Бахурин Сергей »

Ну так и есть. Сначала собираются фортрановские либы линейной алгебры. После из них линкуются функции в dll. В результате получается самодостаточная dll с возможностью динамической линковки.

Аватара пользователя
viacheslavmezentsev
Сообщения: 8
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Выглядит вызов функций вот так. Осталось только аккуратно их все завести и создать примеры использования. Меня больше всего интересуют возможности проектирования цифровых фильтров.
Вложения
bessel_i0()
bessel_i0()

Аватара пользователя
viacheslavmezentsev
Сообщения: 8
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Оно работает :) Вот так выглядит пример с функцией filter_iir(). Как закончу, выложу тут ссылку на использование набора функций в этой программе.
Вложения
пример с filter_iir()
пример с filter_iir()

Аватара пользователя
viacheslavmezentsev
Сообщения: 8
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Попробовал заменить BLAS и LAPACK на OpenBLAS. Компилируется и работает пока. Жаль только библиотека OpenBLAS поставляется только как dll. Не нашёл статических lib-файлов. К сожалению, для сборки моего дополнения вместе со стандартными BLAS и LAPACK мне нужно таскать за собой 200 Мб статических фортрановских библиотек, если я компилирую интеловским компилятором. Как собрать эти библиотеки полностью статическими я не нашёл. Компилятор суёт зависимости и всё.
У нас сборка идёт на удалённом сервере из svn-репозитория и держать там 200 Мб неохота. Поэтому я пока остановился на OpenBLAS в качестве замены. Это утяжеляет дополнение до 17 Мб в сжатом состоянии. Дополнение работает для обеих разрядностей.

Залил проект дополнения в общедоступный репозиторий: DSP Library (C#, C++/CLI, VS2019). Он настроен для сборки как дополнение для SMath Studio.
Страничка на форуме SMath Studio с описанием дополнения: DSP Library. Вся справочная информация по нему теперь будет там.
Вложения
Генерация псевдослучайных чисел
Генерация псевдослучайных чисел

Аватара пользователя
viacheslavmezentsev
Сообщения: 8
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Сборочный сервер что-то заглючил, не могу собрать текущую версию исходников. Выглядит многообещающе. После добавления функций нужно ещё описать как их применять в математическом пакете. Есть некоторые отличия.
Вложения
dspl_fir_linphase.pdf.zip
dspl_fir_linphase.sm
(238.46 КБ) 208 скачиваний
Пример с dspl_fir_linphase()
Пример с dspl_fir_linphase()

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение Бахурин Сергей »

Очень приятно, что библиотека приносит пользу. В ней кстати, еще довольно шустрые FFT алгоритмы реализованы и свертки если что. Вообще если есть необходимость в каких-то функциях, то вполне могу дописать. Надо только знать какие именно нужны.

Аватара пользователя
viacheslavmezentsev
Сообщения: 8
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Спасибо, что выложили. Я постараюсь по возможности "обернуть" максимальное количество функций, кроме тривиальных. Кстати, я использую динамическое связывание, но немного в другом смысле. Для .Net используется свой механизм загрузки и нет необходимости в экспортировании имён функций, как это делается обычным способом. Да и текущий код, отвечающий за механизм инициализации указателей на функции, я бы подсократил.

Существует один приём на случай, когда в библиотеке несколько сотен функций и можно ошибиться, если по нескольку раз одно и то же имя должно присутствовать в нескольких частях кода. Для C++ я использую такой приём здесь: ppp.cpp
Вкратце, там создаётся глобальный список и функции при определении уже попадают в этот список "неявным" образом. Т.е. формирование списка функций получается как бы само собой при начальной загрузке (подключении библиотеки). Тонкость основана на том, что компилятор позволяет вызывать функции в инициализаторах. Поэтому можно декларировать каждую функцию (прототип) только один раз, а при динамической загрузке просто перебирать их массив, как это сделано в коде в самом низу (EnumerateExistingFunctions). Но это для C++, там есть удобный тип vector для этой цели. В случае же C нужен простой список или статический массив. Короче говоря, я думаю, что можно существенно подсократить и упростить содержимое подключаемых файлов. В моём случае функций было больше 200 и очень легко было ошибиться при copy-paste. Пришлось придумать полуавтоматический метод.

По поводу использования быстрых FFT алгоритмов. Я там заметил кое-где использование структуры fft_t. В каких-то случаях её нужно специальным образом инициализировать. В математическом пакете нужно скрыть этот механизм и я пока не понял как. Т.е. пользователь не должен задумываться, что нужно делать какую-то подготовительную работу для вызова этих функций. Вот у меня и возник вопрос: можно ли как-то это автоматизировать для любого размера входного вектора?
Вложения
БИХ фильтры
БИХ фильтры
КИХ фильтры
КИХ фильтры

Аватара пользователя
viacheslavmezentsev
Сообщения: 8
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Исходники: Изображение Изображение

Вот примеры. Нужно установить программу для их просмотра. Ссылки указывают на конкретный релиз в svn. Документы могут улучшаться по мере устранения багов и прочего.

Изображение Изображение Изображение Изображение
Вложения
dspl_examples_pdf.zip
Примеры в pdf
(1.37 МБ) 181 скачивание

Аватара пользователя
viacheslavmezentsev
Сообщения: 8
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Нашёл, наконец, отвязанную от фортрана человеческую LAPACK библиотеку: CLAPACK. Там есть библиотека с проектом под Windows для Visual Studio. Его нужно собрать для нужной (ых) разрядностей и описать в зависимостях (там 4 статических библиотеки будет). Свой проект я уже переделал и стало гораздо проще и размеров в 10 раз меньше. Если лень собирать или не знаете как, то можете по ссылкам выше в репозитории найти комплект библиотек, а также там нужен один заголовочник: blaswrap.h.
Проверил, работает. В этом можно также убедиться, если провести расчёты по указанным выше документам, предварительно обновив плагин в программе.

Ответить