Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > blas и lapack в python |
Автор: mrgloom 23.6.2014, 09:12 | ||||||
Допустим имеем обёртку вокруг BLAS на python (т.е. имеем numpy), можем ли руками написать ф-ии из LAPACK?(по минимуму мне надо eig, svd.) я знаю про numpy.linalg.svd и numpy.linalg.eig так же там можно посмотреть сорцы, которые показывают в случае svd
, а в случае eig
но там правда есть ссылка на
Для чего всё это нужно: переписать стандартные функции из numpy (svd и eig) с использованием numpy.memmap и cudamat (тот же blas обертка вокруг cublas как я понимаю). Так же для поддержки больших матриц можно использовать блочное перемножение матриц (хотя может еще какие то ф-ии blas придется переделать? и я чего то не учёл?) Что точнее нужно: может быть есть lapack собранный только из вызовов blas? (так ли это и возможно ли это?) возможно есть примеры на других языках? (т.к. нет никакого желания разбираться в фортран коде и ф-иях с названиями типа dgemm) какие книги по линейной алгебре(для инженеров скорее, а не для математиков) лучше читать, которые более близки к реальности и рассказывают о подводных камнях(например вырожденные случаи (типа сингулярная матрица) или там потеря точности (типа таким методом никто не считает, а вот более точный) и т.д.), опять же учитывая, что blas и обёртки у нас уже есть и требуется написать только высокоуровневые алгоритмы. |
Автор: _Y_ 24.6.2014, 19:27 |
Даже интересно: а при чем здесь ветка "Алгоритмы"? |
Автор: mrgloom 25.6.2014, 08:42 |
ну во-первых тут алгоритмы svd и eig и может кто то поделиться информацией, если их реализовывал руками. а во-вторых нужна рекомендация книги по практической линейной алгебре, которая как бы тоже про алгоритмы. |
Автор: Фантом 25.6.2014, 23:52 | ||||||
Нет, и это невозможно.
Это тоже обертки исходного фортрановского кода. Это не настолько уж страшно, но все-таки здравое зерно в этом утверждении есть. При необходимости в написании софта такого рода куда проще (и полезнее для дела) разобраться в Фортране, чем пытаться наперекор судьбе чесать правой ногой левое ухо и реализовывать вычислительные алгоритмы на языке, совершенно не предназначенном для подобных задач. Я уж не говорю о том, что даже если почесаться удастся, то работающий результат из-за всех промежуточных оберток будет иметь производительность раз так в десять меньшую, чем нормальный код. |
Автор: Pavia 26.6.2014, 05:28 | ||||
Нет не обёртка, а с транслированный код.
Это вы просто программировать не умете. Язык этот как раз хорошо подходит для подобных задач.
Нет обёртки влияют на производительность как 0.01-0.001 раз и то обычно даже ещё меньше. Нет никаких 10 раз. А вот Python не быстрый язык и писать на нём я бы не стал. |
Автор: mrgloom 26.6.2014, 09:13 | ||||||
ну так вот я и не понял, по сути blas это набор разных частных случаев перемножения матриц? что еще присутствует в lapack? какие то дополнительные ф-ии хэлперы? т.е. я не понимаю достаточно ли ф-ии из blas для использования их как минимальных неделимых кирпичиков для построение стандартных алгоритмов линейной алгебры? код действительно есть транслированный на С, но в нем так же сложно разобраться(ф-ии с 15 аргументами и т.д.) можно использовать прямой вызов http://docs.scipy.org/doc/scipy-dev/reference/linalg.blas.html http://wiki.scipy.org/PerformanceTips единственный способ похоже это поковыряться в самих ф-иях lapack https://groups.google.com/forum/#!topic/julia-dev/mmgO65i6-fA кстати пишут, что
|
Автор: Фантом 26.6.2014, 11:25 | ||||
Вы исходники CBLAS когда-нибудь видели? Если нет - я покажу. Вот, например, cblas_dtbmv.c (случайно ткнул в первый попавшийся файл), начальные строки:
Как, похоже на самостоятельный код? Или все-таки на обертку?
![]() |
Автор: Фантом 26.6.2014, 12:04 | ||||||
Практически да (еще сложения).
Поскольку в природе есть f2c, то формально получить код C несложно, но он будет, во-первых, почти нечитаем, во-вторых, неэффективен. Честно же писать все это заново на C желающих нет - долго, сложно и никому не нужно. |
Автор: mrgloom 25.7.2014, 09:49 | ||
Появился вопрос как сравнить работу 2-х SVD алгоритмов, т.е. один точный стандартный, но медленный ,его берем за основу ,второй допустим использует некие аппроксимации и поэтому менее точный, но более быстрый. 1.Можно сравнить собственные векторы и значения: Тут показана разность полученных результатов:
2. Можно сравнить ошибку реконструкции изначальной матрицыhttp://en.wikipedia.org/wiki/Matrix_norm#Frobenius_norm 3. Можно проверить вектора на ортогональность. Но вопрос в том, какая точность\разность в выдаваемых значениях приемлема для реальных задач? |