CFD kitaplığının geliştirilmesi için C ++ veya Python


13

Hesaplamalı Süreklilik Mekaniği için genel (sonlu hacim, fem, dg) kütüphaneyi kodlamak için iki yaklaşımın avantajları / dezavantajları ne olurdu? Şu anda işleri şu şekilde görüyorum, bu yüzden lütfen kendi deneyimlerinizi sağlayın ve beni benim için alevlendirmeyin :):

1) C ++:

  • genel programlama, sanal fonksiyonlar, aşırı yük, hız ...: istediğiniz her şeyi inşa etmek için mevcut tüm jenerik + OOP araçları

  • düşük seviyeli kütüphaneler çoğunlukla mevcuttur (Python için olduğu gibi yaygın bir bilim ve mühendislik kütüphanesi gelişimi yoktur)

2) Paralel hesaplama için Python + sarmalayıcıları (pyOpenCL ve diğerleri)

  • muhtelif türde destekleyici kütüphaneler

  • düşündüğünüzü kodlayın: uygulama gerçekten hızlı yapılır

  • daha yavaş yürütme süresi

Çeşitli yöntemleri destekleyecek bir çerçeveyi kodlamak, karmaşık geometriler ve problemlerle çalışmak istiyorsanız, neyi seçerdiniz ve neden?


1
PyOpenCL'ye çok aşina değilim, ancak genel olarak Python, hesaplamalı "çekirdekleriniz" düşük seviyeli bir dilde (Fortran, C, vb. )
David Ketcheson

Yanıtlar:


14

Her iki dünyanın en iyisini elde etmeyi ve Python'da "kullanıcı arabirimini" (yani, kitaplığınızın kullanıcısının geometriyi ve sorunun diğer özelliklerini tanımlamak için çağıracağı işlevlerin çerçevesini) daha sonra simülasyon çalışma süresini C ++ 'da yazın.

Aslında, ben muhtemelen ilk Python simülasyon çalışma süresi kadar alay, sonra parça parça C ++ kodu ile değiştirin. Sonunda, Python kodunuzun derlenip çevrimiçi çalışma sürenize bağlı olması için C ++ kaynağı oluşturmasını düşünebilirsiniz, böylece gerçek simülasyonun Python'a hiç çağrı yapması gerekmez - yalnızca sonuçları sonunda döndürün. Bu kurulumla ilgili güzel olan şey, doğal olarak çevik olmasıdır: en hızlı ve en kolay çalışma çözümü ile başlarsınız, neyin işe yarayıp neyin işe yaramadığını hızlı bir şekilde öğrenirsiniz ve beğendiğiniz bir şeye sahip olduğunuzda hızlanmaya başlayabilirsiniz.

( Python yerine Maple kullanmak dışında Maple'ın ODE / DAE çözücüsü bu şekilde çalışır. Tam açıklama: Onlar için çalışıyorum.)


1
+1. Python'un güzel parçalarından biri, gerekirse "Pure Python" dan uzaklaşmaktır.
Fomite

3

Algoritmalarınız için Cython'u da kullanabilirsiniz . Temelde "hızlı" olması gereken bazı değişkenler için tür bilgisi eklenmiş Python'dur. Python kodunu daha sonra favori C derleyiciniz tarafından derlenebilen C koduna çevirir. Bu tür bilgilerin dikkatli bir şekilde eklenmesi, kodunuzu saf Python kodundan 150 kat daha hızlı hale getirebilir.


2

Bence bu soruda daha fazlası var. İlk ve en önemlisi bir geliştirici, önemli avantajlar (ör. Verimlilik, geliştirme süresi ve araçlarda) olmadığı sürece tipik olarak bildiklerini tercih edecektir. Şahsen, üretken olmaya öncelik veriyorum (zaman genellikle en az kaynaktır!) Ve bu, deneyim tabanımıza yakın olan seçimleri destekliyor.

Belki de dikkate alınması gereken

3) Geliştirme süresi

  • kalkınma için ne kadar zaman ayrılmıştır
  • çalışmanın sonuçları ne zaman teslim edilecek? ve nasıl?
  • işi yapabilen bir kod zaten var mı? (Tekliği?)

4) Bakım

  • bakım için kaç (kişi) kaynak ayrılmıştır?
  • kod üzerinde kaç kişi çalışacak?
  • Kod bir noktada serbest bırakılacak mı? (Kriterleri?)
  • kod üçüncü taraf kitaplıklarına mı dayanacak?

5) Lisans sorunu

  • kodu nedir?
  • uygulamalar için kod nedir?

6) Verimlilik ve Eğlence faktörü (genellikle göz ardı edilir!)

  • Nerede en verimli olabilir?
  • Nerede en eğlenceli gelişebilir?
  • (Sosyal) ağın bir parçası olma fırsatı var mı?

2

Bu, kodunuzun şu şekilde yazılabilir olup olmamasına bağlıdır:

some_library_specific_type grid;

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

daha doğrusu gerekir böyle bir şey olarak yazılabilir:

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

İlk durumda en çok neyi kodlamak istediğinizi seçin; ikinci durumda herhangi bir komut dosyası dili kullanmayın veya yürütme süresinden muzdarip olmaya hazırlanmayın.


2

Allan'ın cevabının bir sonucu olarak (kendi geliştirici zamanınızın en değerli kaynak olduğu): Başkalarının zaten yaptıklarını kullanın. Hesaplamalı süreklilik mekaniği için bir kütüphane geliştirmek istediğinizi söylüyorsunuz, ancak zaten o kadar büyük olan birkaç tane var ki, neredeyse her zaman ihtiyacınız olan her şeye sahip olacaklar. Örneğin sonlu eleman problemi, akışkanlar dinamiği için OpenFOAM veya hiperbolik problemler için PyCLAW / CLAWPACK olarak yazılabilen her şey için deal.II'ye bir göz atın. deal.II, örneğin, C ++ 'da program yapmanızı ister, ancak gerçekte programlama seviyesi o kadar yüksektir ki C ++ sözdizimini kullanan FEM kodları için alana özgü bir dil gibi diyebiliriz.


2
İhtiyacım olan her şeye sahip bir kütüphaneyle hiç karşılaşmadım ...
Jack Poulson

Şey, ama sanırım benim fikrimi anladın. Bazı kütüphanelerde ihtiyacınız olabilecek her şey vardır. Özellikle aşina olduğum bir örneği belirtmek için deal.II ve PETSc 126 kod satırlarını kullanarak 10.000'den fazla işlemcide çalışan tamamen kendinden uyarlamalı, 3B kafeslerde sonlu bir öğe çözücü. Bu açıkça sıfırdan fazla, ama aslında kaputun altında olanın karmaşıklığı göz önüne alındığında çok küçük bir sayı.
Wolfgang Bangerth

Şeytanın avukatını oynamak için 10.000 çekirdeğe bir kod çalıştırmak önemsizdir, ancak ölçeklenebilir hale getirmek tamamen farklı bir konudur. Eliptik olmayan denklemler için pek çok paralel önkoşul, 300 çekirdek üzerinde bile verimli bir şekilde çalışamaz.
Jack Poulson

Elbette. Ama alıntı örneği olan ölçeklenebilir: math.tamu.edu/~bangerth/publications/2010-distributed.pdf .
Wolfgang Bangerth

Tam açıklamanın yararına: Yukarıda hem makalenin hem de kodun ve genel olarak deal.II kütüphanesinin yazarlarından biriyim.
Wolfgang Bangerth
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.