Eficiência do uso de petsc4py vs. c / c ++ / fortran

11

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?

Andrew Spott
fonte

Respostas:

11

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 onumpyinterfaces 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 petsc4pypróprio repositório apresenta vários exemplos úteis para ilustrar a troca de desempenho / flexibilidade. Procure no petsc4pyrepositó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.f90nesse 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.

Aron Ahmadia
fonte
Também tenho uma preocupação semelhante em relação a um pequeno código não estruturado. O PETSc fornece apenas estruturas e solucionadores de dados, mas ainda tenho que ler na malha (arquivo de entrada de até 4 GB), particionar, criar mapeamentos, fazer um loop sobre os elementos, calcular matrizes de rigidez local (elemento) etc. antes que o PETSc possa montar e resolver . O python não seria mais lento para esse material não relacionado ao PETSc, especialmente E / S, mapeamentos e cálculos no nível do elemento. Porque o restante do código é simples de qualquer maneira.
Stali #
Os cálculos no nível do elemento geralmente são passados ​​como um kernel (consulte a App.f90fonte em perftest). Não há diferença de desempenho em E / S. Você procurou no FEniCS um pacote de nível superior?
Aron Ahmadia
Você está certo. Eu entendi a idéia, mas no meu caso particular, existem muitos desses kernels (funções de forma para diferentes tipos de elementos, cálculos de nível de elemento, mapeamentos etc.), que representam cerca de 90% do código. Eu olhei para a Fenics há um tempo e muitos detalhes, como lidar com malhas externas e impor BCs, etc. não eram muito claros à primeira vista ou pareciam mais complicados (pelo menos para mim). Além disso, eu uso o Fortran, que é bastante simples de usar (dada a excelente documentação do PETSc) para pessoas que não são da CS, como eu. Na verdade, acho mais fácil do que python :) para o meu trabalho.
Stali #
7

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!

fcruz
fonte