Рекомендації щодо легкого / не встановленого C або C ++ на основі щільного лінійного алгебри


9

Більшість моїх програмувань - це одноразові дослідницькі коди на C для мого власного використання. Я ніколи не поширював жодного коду, окрім близьких співробітників. Я розробив алгоритм, який публікую у науковому журналі. Я хочу надати вихідний код та, можливо, виконуваний код в онлайн-додатку до статті. Колега попросив мене зробити узагальнення до алгоритму, який вимагав від мене запису в C ++ (ack!) І який вимагає вирішити невеликі щільні лінійні системи. Якщо мені вдасться отримати базу користувачів для алгоритму, це буде частково тому, що рядок входу для його використання низький (як на підлозі). Потенційні користувачі не встановлюватимуть бібліотеки тощо для використання коду. Я хочу, щоб код був повністю самостійним і взагалі не обмежений будь-якою ліцензією. Я можу просто написати власний вирішувач, взявши щось із Голуба та Ван Позики, але я б скоріше скористався ванільним рішенням, який хтось уже написав, якщо там є якісь. Пропозиції високо оцінені. Дякую!



Шановний джипе, ласкаво просимо на форум. Ваше питання дуже схоже на те, що тут: scicomp.stackexchange.com/questions/351/…
GertVdE

Бібліотечні рішення, як правило, є складними та великими заради надійності, ефективності та загальності. Якщо ваших проблем дуже мало і досить добре обумовлені, я б запропонував вам написати власну міні-реалізацію.
Стефано М

@GertVdE, дякую за швидку відповідь на це питання. Мені незручно посилатися на питання "Рекомендації ...", оскільки і питання, і найвища відповідь занадто загальні, щоб надати будь-яку допомогу в таких ситуаціях. Якщо ви хочете далі обговорити це, я пропоную перенести його до кімнати чатів scicomp .
Арон Ахмадія

@AronAhmadia: Я думаю, що єдиний спосіб почати врегулювати деякі з цих дебатів - це почати впроваджувати хрестоматію з програмування обчислювальної науки, яка залежить від мови та бібліотеки. Якщо код зрозумілий, а проблеми з конфігурацією можна вирішити (використовуючи скрипт оболонки, шеф-кухар чи лялечку), то дебати щодо продуктивності можна потурбуватись (або зробити конкретним), просто запустивши код і встановивши його часу на довідкова машина. Дебати про ясність можна вирішити (або принаймні зробити більш конкретними), подивившись на код. Інакше ми все одно будемо мати однакові аргументи.
Джефф Оксберрі

Відповіді:


7

Я б запропонував точно дублювати інтерфейс Lapack на потрібну вам функцію, швидше за все, вам просто потрібно dgesv. Таким чином, люди, у яких встановлений Lapack, можуть просто посилатися на нього, і він просто працюватиме. Для людей, у яких не встановлено Lapack, ви надаєте власну просту реалізацію цієї функції або, можливо, реалізуєте її за допомогою Eigen або FLENS, як пропонують інші.

У землі Фортран бібліотека Lapack є таким стандартом, що більшість людей просто використовують його, і це все, а не надавати власні реалізації.


+1 Додайте до нього той факт, що у більшості дистрибутивів Linux (принаймні на основі Debian) у сховищі є двійкові пакети, і всі перекладені математичними бібліотеками постачаються постачальниками (MKL, SunPerf, ACML, ESSL тощо). Ви завжди повинні використовувати стандартні лібри якнайбільше, хоча якщо ви перебуваєте в Windows / Mac, вам може бути краще з чим-небудь на базі C, як встановлення на них безкоштовного компілятора Fortran (gfortran) - це якась робота, або я так чув.
stali

Я багато разів користувався лапаком, але зараз не перебуваю на землі Фортран. Я сподіваюся, що статистичний розподіл платформ, на яких працює моя база користувачів, буде подібний до світу у великому сенсі, головним чином windows, менший відсоток Mac і ще менший відсоток * nix. Мій досвід роботи з вікнами мінімальний, і я вважаю за краще тримати це таким чином. З цієї причини я хочу самостійний код C ++. Я думаю, що мені доведеться надати деяким моїм користувачам допомогу в отриманні коду для збирання та запуску. Мені потрібно мінімізувати роботу, необхідну для цього.
СЕП

Якщо ваша база користувачів - це Windows / Macs, то вам краще використовувати просту C (можливо, навіть власну) реалізацію. Пакет, який важко встановити або залежить від 5 інших ліб, особливо коли немає наявного сховища бінарних пакетів першого класу (наприклад, Debian), надовго відключить користувачів. Пам'ятайте, що більшість користувачів Windows / Mac використовуються для встановлення одним кліком. Простота використання перемагає все інше.
stali

5

Дуже рання помилка, яку роблять багато людей, починаючи наукові обчислення, - це припущення, що потрібно писати весь код однією мовою. Я думаю, що це багато в чому пов’язано з історичними причинами, коли не було зрозуміло, як змусити складені програми спілкуватися між собою через рівні версії одного компілятора. Це означає, що в цьому випадку, якщо ви все одно будете використовувати C ++, існує кілька дуже хороших бібліотек шаблонів лише для заголовків C ++, які можуть відповідати вашим потребам.

Оскільки ви поширюєте свій код з академічних причин, і ви хотіли б вставити у свій код щільний лінійний алгебр, я настійно рекомендую розглянути Eigen . Eigen отримав ліцензію згідно з публічною ліцензією Mozilla і є бібліотекою, призначеною лише для заголовка. Це означає, що ви можете поширити Eigen разом із кодом у вихідній формі (це не накладає жодних ліцензійних обмежень на ваш код), і ви отримаєте доступ до його загальних можливостей, включаючи надзвичайно ефективні щільні лінійні рішення. Як згадує GertVdE, у вас є кілька інших варіантів .


Я сподівався на один файл. Я займався науковим програмуванням досить довгий час. У мене змішані мови, такі як C і fortran, небагато, але для цього проекту я просто хочу один файл, що містить весь мій вихідний код. Я думаю, що я міг би поставити розв’язувач C у код C ++, що не було б великою справою. В основному я хочу зберегти код максимально простим. LU з поворотом має бути адекватним. Я погляну на Ейґена. Дякую!
СЕП

@jep, ви також можете спробувати вишкнути підпрограми, які вам потрібні від CLAPACK, якщо ви насправді не переймаєтесь продуктивністю.
Арон Ахмадія

Є вагомі причини для написання всього залежного коду тією ж мовою, зокрема, у середовищах HPC, у вас є дивні компілятори / проблеми зв’язку та 32/64-бітні проблеми інтерфейсу. Наприклад, як я знаю ширину цілого числа вбудованих бібліотек? Як я точно знаю, який компілятор використовувався для вбудованої бібліотеки, і чи можу я пов’язати його з цим іншим компілятором? Наявність всього однією мовою спрощує багато з цих питань. І так, має бути документація, надана сервісниками кластерів, але більшість часу там немає.
Віктор Лю

@VictorLiu - Проблеми, на які ви посилаєтеся, більш щільно поєднані з реалізаціями, ніж з мовами. Простір для коментарів є поганим місцем для серйозної дискусії, але я радий залучати вас до чату чи деінде, якщо ви хочете, щоб я розширив свої думки з цього приводу.
Арон Ахмадія

4

Якщо ви хочете надійного рішення для систем лінійних рівнянь, я рекомендую FLENS . Він містить точну повторну реалізацію LAPACK (вона навіть відтворює ті ж помилки округлення, що і LAPACK, якщо використовується однопотокова реалізація BLAS). Це справедливо для всіх функцій FLENS-LAPACK (разом з утилітами функціонує близько 100 процедур).

FLENS знаходиться під ліцензією BSD і тому дозволяє включати у власні продукти.

FLENS - це лише заголовки, і якщо вам потрібен лише підмножина FLENS, я можу надати вам зменшену версію, що містить лише ті функції, які вам потрібні. FLENS постачається з власною базовою реалізацією BLAS. Але необов'язково ваші користувачі можуть зв’язуватися з оптимізованими бібліотеками BLAS, такими як ATLAS, OpenBLAS або GotoBALS. Для великих матриць це дає збільшення продуктивності приблизно на 40% порівняно з Eigen.

І так, Eigen також використовує тестовий набір LAPACK для перевірки їх результатів. Вони роблять це для 3-х функцій (Лу, Чолескі та Власні значення / вектори симетричної матриці). Однак їх обчислення власних значень / -векторів несиметричної матриці не вдасться до тестового набору LAPACK.

Відмова: Так, ФЛЕНС - це моя дитина! Це означає, що я зашифрував близько 95%, і кожен рядок коду того вартий.


1
Михайло - Будь ласка, вважайте це доброзичливим попередженням про те, що вам потрібно дотримуватися правила у файлі щодо розкриття приналежності .
Арон Ахмадія

Звичайно, але ви також можете переформулювати свої повідомлення з "Я б настійно рекомендую вам розглянути Eigen" на щось на зразок "є, наприклад, Eigen". У цьому випадку я видаляю свої зауваження щодо Ейґена (хоча всі вони підтверджені правдою), включаючи цю.
Майкл Лен

1
Ваші зауваження щодо Eigen тут не підлягають сумніву (хоча вони здаються мені поза темою). Ви є первинним розробником FLENS, якщо ви збираєтесь рекомендувати це у відповіді тут, ви повинні розкрити свою приналежність як розробника проекту.
Арон Ахмадія

Ага, добре тоді. Я думав, що це неявно зрозуміло під назвою "... я можу тобі дати ...". Чи розкриття інформації в цій формі нормально?
Майкл Лен

2
Я просто хочу сказати подяку за це; У мене були подібні плани повторно впровадити значну частину Lapack в C ++. Однак, здається, що для більшості вдосконалених (власних) процедур ви просто відмовляєтесь від виклику в Lapack, тому трохи помилкової реклами можна сказати, що ви повторно реалізуєте все. З іншого боку, я фактично переніс джерело ZGEEV до C ++ в RNP , хоча деякі частини все ще знаходяться в індексації на основі 1 на основі автоматичного перетворення.
Віктор Лю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.