Насколько медленнее petsc4py против c / c ++ / fortran?
Я понимаю, что это будет в значительной степени зависеть от выполняемого кода, но как насчет чего-то простого, такого как матрично-векторный продукт?
Насколько медленнее petsc4py против c / c ++ / fortran?
Я понимаю, что это будет в значительной степени зависеть от выполняемого кода, но как насчет чего-то простого, такого как матрично-векторный продукт?
Ответы:
Это широко распространенная проблема в научном сообществе программистов, и я считаю, что неопределенность производительности является одним из главных «мифов» в вычислительной науке.
Как говорит @fcruz , petsc4py
это обертка для библиотек PETSc, а не переопределение PETSc в Python. Таким образом, вы можете ожидать каких-либо потерь производительности из-за копирования массивов в и из PETSc или из-за накладных расходов при вызове кода драйвера / функции. petsc4py
очень тщательно реализовано, и пока вы понимаетеnumpy
Интерфейсы многомерного массива, вы можете избежать копирования. В большинстве случаев использования, в которых я работаю, снижение производительности при работе в Python составляет порядка 10-40%, и я часто существенно выигрываю другими способами, которые компенсируют это снижение производительности. Фактически, несколько более опытных разработчиков HPC Python, с которыми я говорил, придерживаются мнения, что эта разница в производительности обычно может быть уменьшена еще больше, и когда Python управляет вычислительно дорогими кодами, это, безусловно, будет иметь место.
Сам petsc4py
репозиторий содержит ряд полезных примеров, иллюстрирующих компромисс между производительностью и гибкостью. Посмотрите в petsc4py
репозитории исходного кода демо-версию perftest
, которая решает нелинейную систему уравнений с использованием как драйвера Python, так и драйвера C (поверх ядра Fortran, представленного App.f90
в этом каталоге). Снижение производительности здесь составляет порядка 10%.
В качестве конкретного примера, я являюсь частью команды ученых, работающих над PyClaw , программным пакетом, который взаимодействует с PETSc для параллельного управления сеткой и устаревшими ядрами Fortran для решения задач Римана на сотовых интерфейсах. Мы провели довольно тщательное исследование снижения производительности в результате переключения с драйвера Fortran, и вы можете увидеть результаты в нижней части страницы 5 таблицы 1 в документе конференции . В нашем случае мы потратили немного производительности на ядре на возможность легко связать наш код с PETSc и Fortran и эффективно работать параллельно на десятках тысяч ядер.
App.f90
Источник в perftest
). В I / O нет разницы в производительности. Вы смотрели на FEniCS для пакета более высокого уровня?
Petsc4py - это просто еще один способ получить доступ к PETSc, но из python , или то же самое: сказать, что petsc4py обеспечивает привязки, так что из python вы можете получить доступ к структурам данных и подпрограммам PETSc, предназначенным для сокращения усилий по разработке параллельных решателей PDE. (этот масштаб).
PETSc предоставляет несколько уровней абстракций для своих решателей, и вы даже можете использовать PETSc для реализации своего собственного решателя. На самом низком уровне программной абстракции PETSc использует BLAS, LAPACK и MPI, и в лучшем случае это будет так же быстро, как и их реализация.
Теперь pets4py использует cython для реализации привязок к PETSc. Затраты на использование Cython зависят от того, сколько вычислений будет сделано из PETSc. Если вы используете решатели PDE высокого уровня от PETSc, накладные расходы должны быть достаточно небольшими, чтобы вам не пришлось о них беспокоиться.
Возможно, более важный вопрос, чем сравнение производительности PETSc против GEMV, заключается в том, является ли PETSc подходящим инструментом для вашей работы. Если вам нужно внедрить нетривиальные параллельные решатели PDE, то, скорее всего, PETSc вам действительно поможет. Однако, если вам нужно сделать кучу GEMV, вам нужна библиотека BLAS. Удачи!