Quanto mais lento o petsc4py vs c / c ++ / fortran?
Sei que isso dependerá significativamente do código que está sendo executado, mas e algo simples como um produto de vetor de matriz?
Quanto mais lento o petsc4py vs c / c ++ / fortran?
Sei que isso dependerá significativamente do código que está sendo executado, mas e algo simples como um produto de vetor de matriz?
Respostas:
Essa é uma preocupação amplamente difundida na comunidade de programação científica, e eu consideraria a incerteza de desempenho um dos principais "mitos" da ciência computacional.
Como o @fcruz discute, petsc4py
é um invólucro para as bibliotecas PETSc, não uma reimplementação do PETSc no Python. Portanto, você pode esperar que qualquer penalidade de desempenho seja proveniente das matrizes de cópia para e do PETSc ou da sobrecarga nas chamadas de código / função do driver. petsc4py
é implementado com muito cuidado e desde que você entenda onumpy
interfaces de matriz multidimensionais, você pode evitar a sobrecarga da cópia. Para a maioria dos casos de uso em que trabalho, a penalidade de desempenho no trabalho em Python é da ordem de 10 a 40%, e geralmente ganho substancialmente de outras maneiras que mais do que compensam esse impacto no desempenho. De fato, vários desenvolvedores mais experientes do HPC Python com quem conversei sustentam a opinião de que essa diferença de desempenho geralmente pode ser reduzida ainda mais, e quando o Python está gerando códigos computacionalmente caros, esse certamente será o caso.
O petsc4py
próprio repositório apresenta vários exemplos úteis para ilustrar a troca de desempenho / flexibilidade. Procure no petsc4py
repositório de origem a demonstração chamada perftest
, que resolve um sistema não-linear de equações usando um driver Python e um driver C (em um kernel Fortran fornecido App.f90
nesse diretório). A sobrecarga de desempenho aqui é da ordem de 10%.
Como exemplo concreto, faço parte de uma equipe de cientistas trabalhando no PyClaw , um pacote de software que faz interface com o PETSc para gerenciamento de grade paralela e kernels Fortran herdados para resolver problemas de Riemann em interfaces de célula. Realizamos um estudo bastante cuidadoso da degradação do desempenho da troca de um driver Fortran, e você pode ver os resultados na parte inferior da página 5 na Tabela 1 no documento da conferência . No nosso caso, trocamos um pouco de desempenho no núcleo pela capacidade de interagir facilmente com nosso código com o PETSc e o Fortran e executar de forma eficiente em paralelo em dezenas de milhares de núcleos.
App.f90
fonte em perftest
). Não há diferença de desempenho em E / S. Você procurou no FEniCS um pacote de nível superior?
O Petsc4py é apenas outra maneira de acessar o PETSc, mas a partir do python , ou é o mesmo que dizer, o petsc4py fornece as ligações para que, a partir do python, você possa acessar estruturas e rotinas de dados do PETSc que visam reduzir o esforço de desenvolver solucionadores de PDE paralelos (nessa escala).
O PETSc fornece vários níveis de abstração para seus solucionadores, e você pode até usar o PETSc para implementar seu próprio solucionador. No nível mais baixo de abstração de software, o PETSc usa BLAS, LAPACK e MPI e, na melhor das hipóteses, será tão rápido quanto a implementação deles.
Agora, o pets4py usa o cython para implementar as ligações ao PETSc. A sobrecarga do uso do cython é relativa à quantidade de cálculos que serão feitos no PETSc. Se você usar os solucionadores de PDE de alto nível do PETSc, as despesas gerais deverão ser pequenas o suficiente para que você não precise se preocupar com elas.
Uma pergunta talvez mais importante do que a comparação de desempenho entre o PETSc e o GEMV é se o PETSc é a ferramenta certa para o seu trabalho. Se você precisar implementar solucionadores de PDE paralelos não triviais, provavelmente o PETSc realmente o ajudará. No entanto, se você precisar fazer um monte de GEMV, deseja uma biblioteca BLAS. Boa sorte!