C ++ ou Python para um desenvolvimento da biblioteca CFD

13

O que você diria que seriam as vantagens / desvantagens de duas abordagens para codificar uma biblioteca geral (volume finito, fem, dg) para Mecânica Computacional de Contínuo? É assim que vejo as coisas agora, então, forneça suas próprias experiências e não me chame pelas minhas :):

1) C ++:

  • programação genérica, funções virtuais, sobrecarga, velocidade ...: todas as ferramentas genéricas + OOP disponíveis para criar o que você quiser

  • bibliotecas de baixo nível disponíveis na maior parte (não existe amplo desenvolvimento de bibliotecas de ciência e engenharia, como a do Python)

2) Wrappers Python + para computação paralela (pyOpenCL e outros)

  • enorme quantidade de bibliotecas de suporte de vários tipos

  • codifique o que você pensa: a implementação é feita muito rapidamente

  • tempo de execução mais lento

Se você deseja codificar uma estrutura que suporte vários métodos, trabalhe com geometrias e problemas complexos, o que você escolheria e por quê?

tmaric
fonte
1
Eu não estou muito familiarizado com o pyOpenCL, mas geralmente o Python será muito lento para problemas de tamanho moderado em 2D ou 3D, a menos que seus "kernels" computacionais sejam implementados em uma linguagem de baixo nível (Fortran, C, etc. )
David Ketcheson

Respostas:

14

Eu pretendia obter o melhor dos dois mundos e codificar a "interface do usuário" (ou seja, a estrutura de funções que o usuário da sua biblioteca chamará para descrever a geometria e outras propriedades do problema) no Python para obter o rápido tempo de resposta e, em seguida, escreva o tempo de execução da simulação em C ++.

De fato, eu provavelmente zombaria até do tempo de execução da simulação no Python primeiro e depois o substituia pelo código C ++, peça por peça. Eventualmente, você pode considerar que seu código Python gere a fonte C ++, para ser compilado e vinculado ao seu tempo de execução on-line, para que a simulação real não precise acessar o Python - apenas retorne os resultados no final. O bom dessa configuração é que ela é inerentemente ágil: você começa com a solução de trabalho mais rápida e fácil, descobre rapidamente o que funciona e o que não funciona e, depois de ter algo que gosta, pode começar a acelerar.

(É assim que o solucionador ODE / DAE do Maple funciona, exceto usando o Maple em vez do Python. Divulgação completa: trabalho para eles.)

Erik P.
fonte
1
+1. Um dos bons bits do Python é a capacidade de se afastar do "Pure Python", se necessário.
Fomite
3

Você também pode usar o Cython para seus algoritmos. É essencialmente Python com informações de tipo adicionadas para algumas variáveis ​​que precisam ser "rápidas". Ele converte o código Python em código C, que pode ser compilado posteriormente pelo seu compilador C favorito. A adição cuidadosa dessas informações de tipo pode tornar seu código 150 vezes mais rápido que o código Python ingênuo.

Daniel Eberts
fonte
2

Eu acho que há mais nessa questão. Em primeiro lugar, um desenvolvedor prefere tipicamente o que ele / ela está familiarizado, a menos que haja vantagens significativas (por exemplo, em produtividade, tempo de desenvolvimento e ferramentas). Pessoalmente, priorizo ​​ser produtivo (o tempo é geralmente o recurso mais escasso!) E isso favorece escolhas próximas da minha base de experiências.

Talvez também seja relevante levar em consideração

3) tempo de desenvolvimento

  • quanto tempo é reservado para o desenvolvimento
  • quando os resultados do trabalho serão entregues? e como?
  • já existe um código que pode fazer o trabalho? (singularidade?)

4) Manutenção

  • quantos recursos (pessoas) são dedicados à manutenção?
  • Quantas pessoas devem trabalhar no código?
  • O código será lançado em algum momento? (critério?)
  • o código dependerá de bibliotecas de terceiros?

5) Problema de licenciamento

  • é o código para pesquisa?
  • é o código para aplicativos comerciais?

6) Fator de produtividade e diversão (muitas vezes esquecido!)

  • Onde alguém pode ser mais produtivo?
  • Onde alguém pode se divertir mais desenvolvendo?
  • Alguma oportunidade de fazer parte de uma rede (social)?
Allan P. Engsig-Karup
fonte
2

Isso depende se o seu código pode ser escrito como:

some_library_specific_type grid;

for t=0 to T do
    library_function_1(grid,...);
    library_function_2(grid,...);
end

ou melhor, deve ser escrito como algo assim:

some_home_made_mixture_of_native_types grid;

for t=0 to T do
    for all grid elements as g do
        some_function(g,...);
        library_function(g,...);
    end
end

No primeiro caso, escolha o que você mais gosta de codificar; no segundo caso, não use nenhuma linguagem de script ou prepare-se para sofrer com o tempo de execução.

mbq
fonte
2

Como corolário da resposta de Allan (que seu tempo de desenvolvedor é o recurso mais valioso): Use o que os outros já fizeram. Você diz que deseja desenvolver uma biblioteca para mecânica de continuum computacional, mas já existem várias que são tão grandes que quase invariavelmente já possuem tudo o que você precisa. Dê uma olhada em deal.II, por exemplo, para tudo o que pode ser escrito como um problema de elemento finito, o OpenFOAM para dinâmica de fluidos ou o PyCLAW / CLAWPACK para problemas hiperbólicos. deal.II, por exemplo, solicita que você programe em C ++, mas, na realidade, o nível de programação geralmente é tão alto que se pode dizer que é como uma linguagem específica de domínio para códigos FEM usando a sintaxe C ++.

Wolfgang Bangerth
fonte
2
Eu não encontrei uma biblioteca que tinha tudo que eu precisava ...
Jack Poulson
Bem, mas você entendeu o ponto, suponho. Algumas bibliotecas têm "quase tudo" que você pode precisar. Para citar apenas um exemplo, estou particularmente familiarizado com, um solucionador de elementos finitos em malhas 3D totalmente auto-adaptáveis, rodando em mais de 10.000 processadores usando as linhas de código deal.II e PETSc 126. Isso é claramente mais do que zero, mas na verdade é um número muito pequeno, dada a complexidade do que está por trás.
Wolfgang Bangerth
Para interpretar o advogado do diabo, é trivial executar um código em 10.000 núcleos, mas é uma questão totalmente diferente torná-lo escalável. Poucos pré-condicionadores paralelos para equações não elípticas podem funcionar com eficiência em 300 núcleos.
Jack Poulson
Certo. Mas o exemplo que cito é escalável: math.tamu.edu/~bangerth/publications/2010-distributed.pdf .
precisa saber é o seguinte
No interesse da divulgação completa: sou um dos autores do artigo e do código mencionado acima, bem como da biblioteca deal.II em geral.
Wolfgang Bangerth