fixfix
2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Использовать lapack в C#
Сообщение04.12.2022, 18:43 


31/08/22
183
Всем доброго здоровья и хорошего настроения.
Пытаюсь использовать lapack собранный в смежной ветке в C#
Нашел несколько примеров в инете, один из них подправил под C#

(Оффтоп)



Что бы я не делал, выдает ошибку:
Код:
System.BadImageFormatException
  HResult=0x8007000B
  Сообщение = Была сделана попытка загрузить программу, имеющую неверный формат. (Исключение из HRESULT: 0x8007000B)
  Источник = TensorDecompositionSolver
  Трассировка стека:
   at TensorDecompositionSolver.Program.dgetrf(Int32& m, Int32& n, Double[,] A, Int32& lda, Int32[] ipiv, Int32& info)
   at TensorDecompositionSolver.Program.Test1() in E:\ProgLab\TensorDecompositionSolver\Program.cs:line 66
   at TensorDecompositionSolver.Program.Main(String[] args) in E:\ProgLab\TensorDecompositionSolver\Program.cs:line 30

Определение функций я уже как только не писал...

Хорошо в C# не работает, попробовал в C++.
Прописал пути к liblapack.dll, libblas.dll соответствующие хедеры, пробовал и *.a в качестве *.lib...
Теперь выдает тысячу ошибок "требуется круглая скобка ")"" и указывает на места типа таких
Код:
typedef lapack_logical (*LAPACK_C_SELECT1) ( const lapack_complex_float* );

Выделяет * в конце.

Исследовал Dependency Walker'ом собранные dll. Lapack ожидаемо ссылается на blas. Кроме того есть ссылки на системные либы и на кучу таких, часть удалил

(Оффтоп)


Эта куча ссылок, это нормально?
В чем может быть проблема?
Помогите пожалуйста создать любой рабочий пример использующий lapack желательно под C#. С++ тоже пойдет на худой конец, пока что не работает вообще никак.

Все файлы собранные в смежной ветке

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение05.12.2022, 07:56 


12/07/21
108
https://www.codeproject.com/Tips/709270 ... C-Librarie

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение05.12.2022, 13:46 


31/08/22
183
traffic_lights благодарю за ссылку, прочитал обе части статьи, они не по теме. Я спрашивал как конкретно lapack заюзать, можно и mkl раз вы говорите функции одинаковые.
Что такое DllImport в C# я знаю, собственно в примере выше им и пользовался, так же пробовал указывать прямо EntryPoint, по разному пробовал писать сигнатуру функций, знаю что в lapack все передается по указателю, даже переменные...
Следующий простой пример работает на ура
Код:
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
 
static void Main()
{
    MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
}


Уверен, если я свою собственную dll со своей функцией сделаю она так же хорошо отработает.

А вот lapack работать отказывается, то ли сама либа какая то кривая... почему в ней столько ссылок каких то левых библиотек напичкано... то ли у меня руки кривые, то ли что то еще...

ПС: Было проще освоить CNTK с TensorFlow чем запустить 2 функции из lapack'а... :D

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение05.12.2022, 21:07 


27/08/14
207
Проверьте, что в настройках проекта C# случайно не стоит собирать x86, а то старые версии VS любили по дефолту так выставлять.

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение06.12.2022, 08:56 


31/08/22
183
Progger, да, на стек оверфлов кажется, находил рекомендации поменять архитектуру, пробовал и х86 и х64 не помогает.
Следующее пишу по памяти, вечером перепроверю:
Но ошибка меняется. На х64 он в принципе не может найти модуль, а на х86 ошибка что у меня в посте, "Была сделана попытка загрузить программу, имеющую неверный формат.".

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение07.12.2022, 22:12 


31/08/22
183
Schrodinger's cat в сообщении #1572765 писал(а):
Следующее пишу по памяти, вечером перепроверю:
Но ошибка меняется. На х64 он в принципе не может найти модуль, а на х86 ошибка что у меня в посте, "Была сделана попытка загрузить программу, имеющую неверный формат.".

Проверил, да все так.

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение19.12.2022, 22:27 


11/08/18
363
Если говорить только о С++ в вижуалстудии, то самым простым способом будет подцепить Intel Math Kernel Library, там внутри весь лапак и бласы есть. Если совсем религия не позволяет, то цепляйте AOCL от АМДшника - там тоже и лапак и бласы имеются :) Мне когда-то какой-то местный сисадмин так за десять минут все настроил и я потом весть свой софт на вижуал студию прикомпилил. А из шарпа они потом цельные мои модули вызывали. Детали как конкретно - не знаю, я реально в винде полный ноль. По скорости АМДшная и Интеловская библиотеки одинаково хорошо на всех платформах оптимизированы, и разница по скорости реально проценты то в одну, то в другую сторону. И то, и другое, вроде бесплатное.

(Оффтоп)


 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение20.12.2022, 09:40 


31/08/22
183
Простите за может тупой вопрос но Intel Math Kernel Library его где брать? Просто тут уже рекламировали Intel OneAPI, я его поставил но как использовать не допер, а человек рекламировавший это молчит :D, так же поиск выдает какие то NuGet пакеты (в С++ есть NuGet? я в этом отстал от жизни), еще можно встретить непонятные сборки и mkl и типа Armadillo...
Откуда качать нативный MKL?

AOCL надо полагать тут:
https://developer.amd.com/amd-aocl/#downloads

ilghiz в сообщении #1574459 писал(а):
С++ в вижуалстудии

Преимущественно им и пользовался когда то давно. Настолько давно, что уже успели несколько стандартов плюсов выпустить. А C# расслабляет в этом плане, кнопочку нажал в NuGet и нужна либа уже в проекте.

Как вызвать из C# это уже вопрос второй, с этим разберусь.
Для вызова простых функций уже много раз использовал DllImport для системных dll.
Есть еще 2 способа, через CLR и COM но про них только читал, использовать не приходилось.

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение20.12.2022, 10:24 


11/08/18
363
Так это, с сайта интела разве не дают? Intel® oneAPI Math Kernel Library, у меня ссылка на закачку открывается с https://www.intel.com/content/www/us/en ... ons=online
Там единственно - логин должен быть у интела и сейчас могут быть проблемы, если указать свое местонахождение в РФ.

У АМДшника в общем все также.

То есть ИМХО, качать то, что дадут, они мало друг от друга отличаются, а лапак у них одинаковый.

-- 20.12.2022, 09:32 --

Schrodinger's cat в сообщении #1574470 писал(а):
Для вызова простых функций уже много раз использовал DllImport для системных dll.

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

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение22.12.2022, 15:53 


31/08/22
183
В общем нашел, установил, теперь это запихали в OneAPI. Какие то библиотеки установились. Да, теперь без VPN никак.
У АМД попроще, только либы и ничего лишнего.

Спасибо. Буду пробовать.

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение25.12.2022, 20:10 


31/08/22
183
Получилось использовать mkl в проекте с++, скалярное произведение cblas_ddot отрабатывает верно. Фактически это мой первый опыт работы напрямую с mkl. Урааа, работает.

А вот AMD AOCL выдает необработанное исключение, асмовый код указывает на вызов инструкции vmovaps в функции cblas_dgemm, насколько я понимаю это инструкция AVX, а у меня нет AVX. Но код компилируется и запускается.
Версию без AVX не нашел.

Всем спасибо за помощь.

Может кто порекомендовать вменяемый путеводитель по функциям данных либ?
Нативные гайды я конечно смотрел, и примеры но они как то не составили общего представления.

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение26.12.2022, 00:34 


11/08/18
363
Странно, что с амдшной либой так получилось - у меня недавно свежая их либа встала на линуксе под старым (десятилетнем) интеловском лаптопе - вроде же AVX с сандибриджа, что в 2011 году вышел, поддерживается.

По лапаку - лучше оригиналы:
https://netlib.org/lapack/lug/node25.html
и все в общем
https://netlib.org/lapack/lug/lapack_lug.html
не пугаться, что там 1999 (он еще даже в 1990 был таким же), с того момента интерфейс практически не менялся, правда плавно переехал с Фортрана на С, а вот внутренность очень сильно пооптимизировалась.

По Фурье - любой юзермануал из FFTW, по остальному - только свои родные мануалы, хотя всего остального там реально кот наплакал.

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение26.12.2022, 21:35 


31/08/22
183
ilghiz пойдет, спасибо.

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение27.12.2022, 02:03 


12/07/21
108
ilghiz
ilghiz в сообщении #1575064 писал(а):
плавно переехал с Фортрана на С

Не соответствует действительности. Хотя некоторое действительно реализовано только на C (этого нет в LAPACK): например, post1571898.html#p1571898

 Профиль  
                  
 
 Re: Использовать lapack в C#
Сообщение27.12.2022, 04:27 


11/08/18
363
traffic_lights в сообщении #1575168 писал(а):
ilghiz
ilghiz в сообщении #1575064 писал(а):
плавно переехал с Фортрана на С

Не соответствует действительности. Хотя некоторое действительно реализовано только на C (этого нет в LAPACK): например, post1571898.html#p1571898

Из контекста вырванная фраза - я имел ввиду интерфейс. И он - то есть интерфейс, и в MKL, и в AOCL сейчас уже поддерживается в синтаксисе С (на С-шные инклюды взгляните), хотя конечно для любителей его можно и в фортраносвской нотации дергать.

Да и бласы уже никто на фортране не оптимизирует, сорсы ATLAS вам в руки - там на фортране - только заглушки, чтобы атлас из фортрана вызывать.

А вот сингулярное - да, как было на фортране, так и осталось, и ничего не поделать. Мне кстати реально не понятно, почему, имея еще с 99 года поддержку многомерных массивов в С (С99 стандарт), народ до сих пор полностью не отказался от фортрана, так как фортран отличался от остальных языков только этим фактом - получил память в подпрограмму и замаппил ее в двухмерный массив с ведущей размерностью из аргументов этой функции. Раньше (до С99) такое делать нельзя было, с С99 - это тоже можно сделать в С, и писать на фортране сейчас реально моветон из-за его ограничений по указателям и способам аллокации памяти.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group