Эффективность использования petsc4py против c / c ++ / fortran

11

Насколько медленнее petsc4py против c / c ++ / fortran?

Я понимаю, что это будет в значительной степени зависеть от выполняемого кода, но как насчет чего-то простого, такого как матрично-векторный продукт?

Эндрю Спотт
источник

Ответы:

11

Это широко распространенная проблема в научном сообществе программистов, и я считаю, что неопределенность производительности является одним из главных «мифов» в вычислительной науке.

Как говорит @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 и эффективно работать параллельно на десятках тысяч ядер.

Арон Ахмадия
источник
У меня также есть аналогичная проблема относительно небольшого неструктурированного кода. PETSc предоставляет только структуры данных и решатели, но мне все еще нужно прочитать в сетке (входной файл до 4 ГБ), разделить, создать сопоставления, выполнить циклический переход по элементам, вычислить локальные (элементные) жесткие матрицы и т. Д., Прежде чем PETSc сможет собрать и решить , Разве Python не будет медленнее для таких вещей, не связанных с PETSc, особенно для ввода-вывода, отображений и вычислений на уровне элементов. Потому что остальная часть кода в любом случае проста.
Стали
Расчеты на уровне элементов обычно передаются в виде ядра (см. App.f90Источник в perftest). В I / O нет разницы в производительности. Вы смотрели на FEniCS для пакета более высокого уровня?
Арон Ахмадиа
Вы правы. Я понял идею, но в моем конкретном случае есть много таких ядер (функций форм для различных типов элементов, вычислений на уровне элементов, отображений и т. Д.), Что составляет около 90% кода. Некоторое время назад я смотрел на Fenics, и многие детали, такие как работа с внешними сетками, наложение BC и т. Д., Были не совсем ясны на первый взгляд или казались более сложными (по крайней мере, для меня). Кроме того, я использую Fortran, который довольно прост в использовании (учитывая отличную документацию PETSc) для людей не из CS, как я. Я на самом деле нахожу это проще, чем Python :) для моей работы.
Стали
7

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. Удачи!

fcruz
источник