C ++ vs HPC için Fortran


56

Hesaplamalı bilim doktora programımda neredeyse sadece C ++ ve Fortran'da çalışıyoruz. Bazı profesörler birbirlerini tercih ediyor gibi görünüyor. Hangisinin 'daha iyi' olduğunu ya da belirli bir durumda birinin diğerinden daha iyi olup olmadığını merak ediyorum.


12
Bence, yüksek ve düşük seviyeli bir dilin bir karışımı, yalnızca ikisinden birini kullanmaktan iyidir. Örneğin, Python + C ++ kullanıyorum.
Faheem Mitha

2
Bu sorunun cevapları neredeyse tamamen öznel olacak ve bu nedenle bu sorunun uygun olduğundan emin değilim.
Jeff,

Yanıtlar:


61

Sık sık, seçim (1) çözmeye çalıştığınız soruna, (2) sahip olduğunuz becerilere ve (3) birlikte çalıştığınız insanlara (yalnız bir proje değilse) bağlıdır. Anı bırakacağım (3) çünkü herkesin bireysel durumuna bağlı.

Problem bağımlılığı: Fortran dizi işlemede öne çıkıyor. Eğer probleminiz basit veri yapıları ve özellikle dizilerle açıklanabilirse, Fortran iyi adapte edilmiştir. Fortran programcıları, açık olmayan durumlarda bile (örneğin grafikleri göstermek için) dizileri kullanır. C ++, karmaşık ve oldukça dinamik veri yapıları için daha uygundur.

Beceri bağımlılığı: İyi C ++ programları yazmak, iyi Fortran programları yazmaktan çok daha fazla programlama deneyimi gerektirir. Küçük bir programlama deneyimi ile başlarsanız ve işinizin bu yönünü öğrenmek için sadece çok zamanınız varsa, Fortran öğrenim yatırımını C ++ öğrenmekten daha iyi bir şekilde alırsınız. Elbette, probleminizin Fortran için uygun olduğunu varsayarak.

Ancak, programlamada Fortran ve C ++ 'dan daha fazlası var. Herkesin hesaplamalı bilime girmesini Python gibi dinamik bir üst düzey dille başlamanızı öneririm. Unutma, zamanının CPU zamanından daha değerli olduğunu unutma!


17
"Zamanının CPU zamanından daha değerli olduğunu daima unutma!" HPC'de çalışan biri olarak bu bölüme katılmıyorum; her şey yerinde.
Levi Morrison,

19
"Her zaman, zamanınızın CPU zamanından daha değerli olduğunu unutmayın!" Bilimsel araştırmalarda çalışan biri olarak, o kısımla daha fazla hemfikir olamadım.
14:02

3
"Zamanının CPU zamanından daha değerli olduğunu daima unutma!" - 2 sentimi atmak istiyorum - birkaç hafta boyunca birkaç programı çalıştırmak için her biri 10'dan fazla çekirdeğe sahip birkaç yüz düğüm kullanarak, birkaç haftadan daha uzun bir süre içinde üretilebiliyorsa, en değerli kaynağın korkunç bir israfı olarak görülebilir. Sadece birkaç gün içinde çalışan kod. Bu HPC kümeleri, nadir ve pahalı bir ortak kaynaktır.
Dani_l 21:15

“Her zaman, zamanınızın CPU zamanından daha değerli olduğunu unutmayın!”, Bir hafta kodlayın, ancak bir ay boyunca çalıştırın, bu her zamanki gibi efendim!
fronthem

6
“Her zaman, zamanınızın CPU zamanından daha değerli olduğunu unutmayın!”, Bir ay kod yazmayı ve bir hafta çalıştırmayı tercih ederim! - Kod yazıldıktan sonra daha fazlası yapılabilir ve diğerleri yazdığınız kodu daha kullanışlı bulacaktır.
Charles,

37

Hem C ++ hem de Fortran'ın yeterince iyi olduğunu ve iyi çalıştığını düşünüyorum.

Ancak, Fortran'ın sayısal bilimsel hesaplama için, diziler kullanılarak ifade edilebilecek ve diğer karmaşık veri yapılarına ihtiyaç duymayan algoritmalar için daha iyi olduğunu düşünüyorum , bu nedenle sonlu farklar / elemanlar, PDE çözücüler, elektronik yapı hesaplamaları gibi alanlarda. Fortran, alana özel bir dildir. Özellikle Fortran’da hızlı programlar yazmanın C ++ 'dan ziyade bir bilim insanı (bilgisayar uzmanı olması gerekmez) tarafından daha kolay olduğunu düşünüyorum .

C ++ genel amaçlı bir dildir, bu nedenle herhangi bir algoritmayı ifade edebilir ve HPC alanından muhtemelen bazı grafiklerden, mesh üreteçlerinden, sembolik manipülasyondan, diziler kullanılarak ifade edilemeyen algoritmalar için kesinlikle daha iyidir.

Ayrıca C ++ 'ta dizi algoritmaları yazmak da mümkündür, fakat benim deneyimlerime göre, çok daha fazla bilgisayar bilimi bilgisi ve genel olarak daha fazla çalışma gerektirir (örneğin, bir dizi manipülasyonu için sınıfları oluşturmak veya yeniden kullanmak ve bellek yönetimini elle ya da bazı (Trilinos'tan Teuchos gibi). Uzman olmayanlar oldukça iyi Fortran programları yazma eğilimindedir, ancak korkunç C ++ programları (kendi tecrübelerime dayanarak konuşurken).

Yasal Uyarı: Ben kişisel olarak Fortran'ı çok seviyorum ve sayısal hesaplama için C ++ 'ı tercih ediyorum. Günlük C ++ 'da 2 yıldan fazla programlama, modern Fortran'da (sonlu elemanlar alanında) neredeyse bir yıllık programlama yaptım. Python ve Cython'u da çok kullanıyorum.


1
Birincisi ilk cevabın dengeli olması. C ++ ve Fortran'ın şu anki HPC'deki tek olasılık olmadığını düşünüyorum. Ben Fortran, C ++ veya Python (veya ne istersen) için karar verirken güçlü ve zayıf noktaları bilmek iyi olur. On yıl boyunca organik olarak yetiştirilen tek bir dosyada 20.000 satır Fortran gördüm. Şahsen izole edilmiş ağır dizilim hesaplamaları dışında başka hiçbir şey için kullanmazdım. Çıktıyla ilgili hiçbir şey için bile değil. Şimdiye kadar önyargılı bir yorum için.
shuhalo

6
Bu cevaba daha fazla katılmıyorum. Sonlu eleman kodumuz Fortran'da yazılamazdı. Aslında, 15 yıl önce düz C ve Fortran karışımı olarak başladı (ikincisi yöntemin sayısal olarak yoğun olan kısımlarıydı) ve birkaç yıl boyunca yavaş yavaş saf C'ye ve sonra C ++ 'a taşındı. Kod sürekli olarak daha kısa, daha hızlı ve anlaşılması kolaylaştı ve her yinelemeden sonra daha yetenekliydi. C ++ 'ın size ateş etmek için bol miktarda ip verdiğini belirten diğerleriyle aynı fikirdeyim. En rahat ettiğin dili seç.
Bill Barth

6
Bill, modern Fortran kullandın mı (90 ve üstü eklemeler?). Bu çok önemli (bu konuda cevabımda daha açık olması gerekirdi). Tabii ki, "20.000 Fortran" satırı veya f77 genellikle iyi yazılmış C ++ 'dan daha iyi değildir.
Ondřej Čertík

1
@ OndřejČertík: Modern sonlu eleman programlarının "basit" veri yapıları kullandığına inanıyorsanız, son zamanlarda bunlardan hiçbirine bakmadığınızı düşünüyorum. Basit veri yapıları kullanarak uyarlanmış sonlu elemanlar, hp yöntemleri veya yapılandırılmamış ağlara multigrid uygulamayı deneyin. Bill dikkat çekiyor ve onun için "modern Fortran" ı kullanmanın küçük bir farktan çok daha fazlasını yapacağını söyleyerek konuşabileceğime inanıyorum.
Wolfgang Bangerth

6
@WolfgangBangerth, bahsettiğiniz hemen hemen her şeyin bir Fortran uygulaması için mesela Phaml ( math.nist.gov/phaml ).
Ondřej Aprertík

31

Aynı zamanda iki kuruşumu da biraz geç atıyorum, ama sadece bu konuyu gördüm sadece, gelecek için umutsuzca yapılması gereken birkaç nokta olduğunu hissediyorum.

Aşağıda C ++ hakkında konuşmayacağımı ve C ++ hakkında konuşmayacağımı not edin. Neden? Aksi halde, tam teşekküllü ve dinamik olarak yazılmış nesne yönelimli bir dili Fortran kadar statik bir şeyle karşılaştırmak için elmalar ve portakallar var. Evet, en son Fortran standartlarının bazı modern uygulamaları bundan daha fazlasını yapabilir, ancak çok az insan aslında bunları kullanıyor ve bu yüzden Fortran'dan bahsederken basit, statik ve zorunlu bir dil düşünüyoruz. Orası C de, bu yüzden C'yi C ++ ile değiştireceğim.

Her şeyden önce, daha iyi derleyicilere sahip olan Fortran / C tartışmaları tartışmalıdır. Atanmış C / Fortran derleyicileri artık geçmişte kaldı. Hem gcc / gfortran hem de icc / ifc, aynı arka uca sadece farklı ön uçlar, yani programınız ön uç tarafından soyut bir tanımlamaya dönüştürülecek ve ardından arka uç tarafından optimize edilip birleştirilecektir. Anlamsal olarak, Fortran veya C de aynı kodu yazarsanız, derleyici her iki durumda da aynı hızda çalışacak olan aynı montajı üretecektir.

Bu şimdi ikinci noktama yol açıyor: neden hala farklılıklar görüyoruz? Sorun, çoğu kıyaslamanın Fortran programcıları tarafından C ya da tersi bir şey deneyen bir şekilde yapılmasıdır. Çoğu yazarın veya şairin ana dilinde nasıl yazmayı tercih ettiğini hiç farkettiniz mi? Kendinizi tamamen güvende hissetmediğiniz bir dilde veya evde şiir yazmak ister misiniz? Tabii ki hayır ... Kendimi C'nin "yerel" programlama dilim olduğunu düşünüyorum. Bununla birlikte, üç yılını sadece belirli bir akıcılık seviyesine ulaştığım Fortran kullanan bir grupta çalışarak da geçirdim. Ben, ancak, sonuç olarak ortaya çıkan kod olacak, C daha rahatım beri Fortran başıma bir şey yazmak ve asla daha iyi sen olarak belirlemeyi neyse.

Bu yüzden temel fark, programlayıcıda değil dildedir. Yani hiçbir fark yok mu? Pek iyi değil. İşte birkaç örnek:

  • SIMD: İster SSE, SSE3 veya AltiVec, ister Fortran'da kullanmak istiyorsanız, derleyicinin tam olarak ne istediğinizi tahmin etmesi ve bunu yapması için dua etmesini umarsınız ve dua edersiniz. İyi şanslar. C'de genellikle her bir mimari için kendine özgü fonksiyonlar veya daha yakın zamanda, gcc cinsinden genel SIMD vektör tipleri bulunur . Fortran derleyicilerinin çoğu, döngüleri açmak için yalnızca SIMD komutlarını kullanır, ancak kısa veri vektörleri üzerinde açık olmayan bir şekilde çalışan bir çekirdeğiniz varsa, derleyici bunu muhtemelen görmez.

  • Farklı donanım mimarileri: Tüm CUDA mimarisi, C'deki çekirdeklerin etrafına inşa edilmiştir. Evet, Portland Grubu artık CUDA özellikli bir fortran derleyicisine de sahip, ancak ticari ve en önemlisi, NVIDIA'dan değil. Aynı şey, bulabildiğim en iyi şeyin yalnızca birkaç temel çağrıyı destekleyen yeni bir proje olduğu OpenCL için de geçerli .

  • Paralel programlama: Evet, hem MPI hem de OpenMP hem C hem de Fortran ile gayet iyi çalışır. Bununla birlikte, iş parçacığınızın gerçek kontrolünü istiyorsanız, yani tamamen dinamik bir paylaşılan hafıza hesabınız varsa, Fortran ile soğukta dışarıda olacaksınız. C de, sıcak ve bulanık olmasa da sizi fırtınaya sokacak standart pthreads'a sahipsiniz. Genel olarak, işletim sistemine erişime dayanan çoğu hesaplama, örneğin iş parçacığı, süreçler, dosya sistemi vb. C ile daha iyi servis edilir ve Oh, Fortran ile kendi ağınızı kurmaya çalışmayın.

  • Kullanım kolaylığı: Fortran, Matlab'a C'den daha yakındır. Tüm farklı anahtar kelimeleri ve değişkenleri nasıl açıklayacağınızı öğrendikten sonra, kodun geri kalanı Matlab gibi görünür ve sınırlı programlama deneyimi olan kullanıcılar için daha erişilebilir hale gelir.

  • Birlikte çalışabilirlik: C'de bir yapı oluşturduğunuzda, gerçek verilerin yerleşimi doğrudan ve belirleyicidir. Fortran'da, işaretçi dizileri veya yapılandırılmış veriler kullanırsanız, verinin gerçek düzeni derleyiciye bağlıdır, doğrudan ileri sarılmaz ve genellikle tamamen belgelenmemiş durumdadır. C'yi Fortran'dan veya tam tersi olarak çağırabilirsiniz, ancak statik bir diziden başka bir şeyi birinden diğerine ve geriye geçirmenin daha kolay olduğunu düşünmeyin.

Bunların hepsi biraz garip, düşük seviyeli şeyler, ama bu konuştuğumuz Yüksek Performanslı Bilgi İşlem. Temel donanım paradigmalarından en iyi şekilde nasıl yararlanacağınızla ilgilenmiyorsanız, yani paylaşılan / dağıtılmış hafıza, iş parçacıkları, SIMD vektörleştirmesi, SIMT kullanan GPU'lar ve benzerleri için en iyi algoritmaları uygulamak ve / veya geliştirmek, sadece bilgisayarda matematik yapıyorum.

Bu benim girdiğim her şeyden çok daha uzun bir süre önce ortaya çıktı, bu yüzden işte bir özet - bir tür ev mesajı al:

  • En iyi kod yazacak sen dilde can sen daha iyi bilirsin.
  • Aynı arka ucu kullanan iki derleyici tarafından üretilen kodun kalitesinde fark yoktur - bir kodu veya başka bir dilde kötü kod yazan biziz .
  • Daha düşük seviye hissetmesine rağmen, Fortran oldukça üst seviye bir soyutlamadır ve doğrudan SIMD, iş parçacıkları, ağ, vb. Gibi donanım / işletim sistemi özelliklerine doğrudan erişmenize izin vermez.

5
İyi tepki. Son yorumunuzun mutlaka doğru olduğunu sanmıyorum. Ben bir C programcısıyım ama Fortran'daki düşük seviyeli şeylere iyi programlama uygulamaları ile erişebiliyorsunuz. SIMD ops gibi şeyleri kullanmanın ideal yolu, şiddetle öneren bir kod yazmaktır (örneğin, engelleme döngüsünü engeller) ve derleyicinin sizin için yapmasına izin verir. Iş parçacığı için, yalnızca openMP kullanın (pthreads ayrıca bazı ekstra işlerde kullanılabilir). Fortran, bahsetmediğin her şeye sahiptir, sadece tipik kullanıcısı için önemli bir seviyede: sayısal.
Reid.Atcheson,

@ Reid.Atcheson: Derleyicinin yakalayacağı şekilde her şeyi engellerseniz, hem C hem de Fortran'da otomatik olarak çalışacaktır. Sorun şu ki, derleyicinize ne kadar güvenmek istiyorsunuz? Ve tam olarak ne yapmak istediğinizi bildiğiniz durumlarda neden güvenmek zorundasınız ? OpenMP diş açıyor, evet, fakat blok şeklinde. Farklı şeyler yapmak için farklı iş parçacığı havuzları almak için onu kandırabilirsiniz, ancak bu sadece yanlış kullanan OpenMP'dir. Fortran için Pthreads sadece C fonksiyonlarına göre ayarlanmıştır. Yine de, eğer ayrıntılara girmezseniz Fortran'ın daha kolay olduğunu kabul ediyorum.
Pedro,

1
Derleyiciye güvenerek tam gelişmiş% 99 en yüksek verimlilik elde edemeyeceğinizden emin olabilirsiniz, ancak kolayca oldukça yaklaşabilirsiniz. Bunun ötesinde ya içsel ya da satır içi ASM kullanmak zorundasınız. Genel olarak programcının verimliliği için bir yerde taviz vermeniz gerekir, bu nedenle programlama dilleri her şeyden önce vardır. Aslında, içsel veya ASM (birkaç kez oldum) ayrıntılarına girecek kadar delirmiş olduğunuz aşamada, Fortran bir koltuk değneği değildir. Her halükarda, el ile optimize edilmiş kodunuzda nasıl bağlantı kuracağınızı biliyorsunuz.
Reid.Atcheson,

@ Reid.Atcheson: Paralel HPC uygulamaları için% 99 zirve verimliliğin çok altında kalabileceğinizi savunuyorum ... Ve gcc vektör tipleri, intrinikleri kullanarak sorun çıkarmaz :)
Pedro

1
@Pedro, Mükemmel yazı. Kesinlikle harika. Paylaşım için çok teşekkürler. Sadece ilginç konular arasında rastgele dolaşırken buldum.
Soruşturma

16

Bilimsel yazılım hakkındaki 15 yıllık düşüncelerime göre: Eğer kodunuz Fortran'a yazdığınız için% 25 daha hızlı çalışıyorsa, ancak yazmanız 4 kat daha uzun sürer (STL yok, karmaşık veri yapılarını uygulamada zorluk çeker), sonra Fortran, sonra Ancak, gününüzün önemli bir bölümünü küçük parmakları kırarak ve hesaplarınızın bitmesini beklerken harcarsanız kazanırsınız. Neredeyse hepimiz için en değerli şeyin kendi zamanımız olduğuna bakılırsa, sonuç şudur: Kodunuzu en hızlı şekilde geliştirmenize, hata ayıklamanıza ve test etmenize izin veren dili kullanın; Fortran'da yazdın.


13

Benim yaklaşımım, C ++ 'ı her şey için, genellikle en iyi şekilde derleme yazılan hesaplama çekirdeği; Bu, geleneksel HPC yaklaşımının tüm performansını size kazandırır ancak örneğin SGEMM / DGEMM / CGEMM / ZGEMM gibi hesaplama çekirdeklerini tek bir rutine aşırı yükleyerek arabirimi basitleştirmenize olanak tanır, Gemm. Açıkça görülüyor ki, ham işaretçilerden kaçınarak ve opak sınıflara geçiş yapılarak soyutlama seviyesi çok daha yükseğe çıkarılabilir, ancak bu güzel bir ilk adımdır.

C ++ 'ın en büyük dezavantajını ezici bir şekilde derleme süresindeki artış olarak buluyorum, ancak deneyimlerime göre, geliştirme süresindeki tasarruf bunu telafi etmekten daha fazla. Diğer bir dezavantajı, satıcı C ++ derleyicilerinin, satıcı C ve Fortran derleyicilerinden daha fazla hataya sahip olma eğiliminde olmasıdır. Geçen yıl, C ++ derleyicilerinde neredeyse on hatayla karşılaştığımı düşünüyorum.

Bunların hepsiyle birlikte, düşük seviyeli dillerde (ve Fortran) yazılmış bilimsel paketlerin geri alınmasının, karmaşık veri yapıları için uygun arayüzleri ortaya çıkarmakta isteksiz olduğunu düşünüyorum: çoğu insan, Fortran BLAS arayüzünden memnun, sadece ihtiyaç duyduğu gibi matrisleri tanımlamak için işaretçiler ve öncü boyutlar, ancak çok az kişi, her zamanki 40 tamsayılı Fortran seyrek doğrudan çözücünün arabiriminin uygun olan herhangi bir şey olduğunu iddia eder (bkz. UHM, SuperLU, PETSc ve Trilinos).

Özet olarak, düşük seviyeli hesaplama çekirdeği için derleme, ancak özellikle önemsiz olmayan veri yapılarında çalışırken her şey için daha yüksek seviye dilleri kullanmayı savunuyorum.

y:=αx+y


2
Küçük çekirdekleri derlemek için neden uygun optimizasyona sahip standart bir C derleyicisine güvenmiyorsunuz? Bu kod boyutu ve karmaşıklık düzeyinde, bir derleyicinin bundan ne çıkardığı arasındaki fark belirsizdir.
Peter Brune

1
Bana, uygun kısıtlı kullanımla bile, Fortranlarının açık bir matris devri gibi bir işlem için hala C ve / veya C ++ kodlarından daha hızlı olduğunu söyleyen birkaç kişiyle konuştum. C veya C ++ kodunu hızlı yapmanın imkansız olduğunu söylemiyorum, fakat Fortran derleyicisinin daha iyi bir iş çıkarmaya meyilli olduğunu söylüyorum.
Jack Poulson

"Restrict" anahtar kelimesiyle aynı deneyime sahibim (basit Fortran kodum her zaman biraz daha hızlıydı). Ancak uzmanlığım sınırlıdır ve üretilen derlemeyi gcc'den anlamaya yatırım yapacak zamanım yok. Bu yüzden sadece Fortran'ı kullanıyorum, basit ve hızlı.
Ondřej Čertík

@ JackPoulson: Derleyici argümanı Fortran topluluğundan biraz duyduğum bir şey. Ne yazık ki çoğu derleyici, örneğin, gcc veya ifc / icc, aynı arka uç için farklı dil ön uçları kullanır. Optimizasyon ve kod oluşturma işlemini yapan makineler aynıdır ve bu nedenle sonuçlardaki farklılıklar büyük olasılıkla programcının temel dilin aşina olduğu farklılıklardan kaynaklanmaktadır ...
Pedro

1
Sadece sık sık tekrarlanan, nadiren onaylanmış Fortran'ın sayısal çekirdeğe göre daha hızlı olduğu iddiasına biraz bakış açısı vermek için: Bir süre önce, Trilinos 'Epetra paketindeki seyrek matris-vektörünün çoğaldıklarından% 30 daha yavaş olduğunu fark ettik. deal.II. İlki, ileriye doğru Fortran 77'ye yazılmıştır; ikincisi, 'kısıtlama' kullanılmadan doğrudan C'ye doğru. Her ikisinde de yaklaşık 10-15 kod satırı vardı. Bugün, Trilinos anlaşmadan alınan kod parçasını kullanmaktadır. Eminim F77'nin C'den daha hızlı olduğu birçok vaka bulabiliriz. Mesele şu ki, artık evrensel değil.
Wolfgang Bangerth

8

Burada yeni olduğum için eski sorulara bakıyordum ve bunu buldum. Umarım eskilere cevap vermek tabu değildir!

Kimsenin bundan bahsetmediğinden, yapacağımı düşündüm. Fortran 2003 neredeyse en büyük derleyicilerden (intel, ibm, cray, NAG, PCG) neredeyse tamamen destekleniyor (en yakın zamanda) en yeni sürüm 4.7. Fortran 2003 (ve 2008), C ++ 'dan biraz daha ayrıntılı olsa da, nesne yönelimli bir dildir. Fortran hakkında güzel olduğunu düşündüğüm şeylerden biri, standart komitenin bilimsel bilgisayarını birincil izleyici kitlesi olarak görmesidir (bunu geçen gün bana işaret ettiği için Damian Rouson'a teşekkür ederim).

Bunların hepsini C ++ programcılarının Fortran programcıları olması için değil, Fortran halkının Fortran 90 / 95'te nesneye yönelik kavramları taklit etmenin veya C ++ 'a geçmenin yanı sıra daha fazla seçeneğe sahip olduklarını bilmelerini sağladım.

Ekleyeceğim bir uyarı, derleyicilerde uygulananların kanama kenarında olmanın bir maliyeti olduğu. Eğer şu an Fortran 2003'te büyük bir proje üstlenirseniz, hatalar arasında rastlayacaksınız ve derleyicinizi sürekli güncellemeniz gerekecek (özellikle de gcc kullanıyorsanız), bu durum son birkaç ay içinde önemli ölçüde iyileşmiş olsa da!


7

C ++ ile ilgili sorun, örneğin, STL'yi, istisnaları, sınıfları (sanal genel gider artı hizalama sorunları), operatör aşırı yüklemesini (yedekli yeni / silmeleri) veya şablonları (hiç bitmeyen derleme ve kriptik hataları) kullanarak, performansı kısma şansınız olabilir. iyi huylu görünüyorsun, ama saatlerini bu şekilde harcayabilirsin).

Bununla birlikte, daha çok genel kütüphanelere daha iyi erişir ve kodunuzun görünürlüğünü arttırırsınız (bu, alana şiddetle bağlıdır ve yine de saf C'ye sahipsiniz). Ayrıca, kodunu R, Lush, Matlab / Scilab veya hatta Python, Ruby veya Lua gibi bir betik dilinde silerek Fortran'ın esneklik eksikliğini telafi edebilirsiniz.


1
Düşük seviyeli teknikleri yüksek seviyeli dillerde uygulamak genellikle kötü bir fikirdir. Örneğin, STL çok soyut bir seviyede çalışacak şekilde tasarlanmıştır. Arayüzün ne için tasarlandığının farkında olmalı, bu görev için kullanmalı ve daha sonra derleyicilerden çıkmalı.
shuhalo

2
Bence hem mbq hem de Martin noktaları haksızlık. Evet, std :: list <double> komutunu kullanarak doğrusal cebir amaçlı sayısal bir vektör uygulamaya çalışırsanız, kendinizi ayağınızdan vurmanın yolları vardır. Ama bu aptalca bir argüman: en azından C ++ , kullanabileceğiniz bağlantılı bir liste sınıfına sahipken Fortran kullanmıyor. "Arabalar o kadar hızlı sürüyor ki, bir duvara çarpıp yaralanabilirsin; bunun yerine atlı araba kullanmalısın." Üst düzey özelliklere sahip olmak için düşük seviyeli şeyleri (örneğin C ++) destekleyen üst düzey bir dili çöpe atmak saçma bir fikirdir .
Wolfgang Bangerth 23.03

@WolfgangBangerth Hayır, şimdi Fortran'a zarar veriyorsunuz - bu bakteriler insanlardan daha az evrimleşen "düşük seviye" dir. Eğer bir araba benzetmesi istiyorsanız, daha çok "bir bataklık yolunu geçmek için hem Jeep'i hem de Lexus'u kullanabilirsiniz, ancak ilkini kullanmak daha az acıtır" gibi olmalıdır.
Mart'ta mbq

1

7

Üç gerçek:

  • F77-tarzı n-boyutlu diziler C: CnD'yi kullanırken sorun değil (utanmaz bir fiş)

  • F90'ın modül sistemi kötü tasarlanmış ve ortamlar oluşturmak için düşmanca. (Bir modülün adı, dosya adıyla eşleşmek zorunda değildir, örn.)

  • Fortran refactoring'i iyi desteklemiyor. İşlevselliğin bir bitini işlevden çıkarmak, dört yere dokunmanızı gerektirir: Gerçek kod, değişken bildirimleri, bağımsız değişken bildirimleri ve bağımsız değişken listesi. C dokunulacak iki yerden geçiyor. Bu, verileri iyi yönetememenin etkisini artırır (aşağıda açıklanmaktadır): Küçük ölçekli modülerlik çok acı verici olduğu için hemen hemen herkes devasa alt programlar yazıyor.

Bir kişisel izlenim:

  • Fortran veri yönetimi için iyi çalışmıyor. İşaretçiyi F77 veya F90'daki kullanıcı opak veri yapısına döndürmeyi deneyin. ( transfer(), işte geliyoruz)

Selam Andreas! CnD ilginç, bunu bilmiyordum. Ah, sen yazdın. :) (f90 ayrıca dilimleme, diziler için ayrılabilir ve en önemlisi - çarpma, toplama vb. için dizi sözdizimini de destekliyor.) CMake'i Fortran ile kullanıyorum ve modüller ile harika çalışıyor. Tam olarak "argüman listesi" nedir? Bunları kullandığımı sanmıyorum, bu yüzden sadece 3 yer değiştirmek gerekiyor. C'de, genellikle gerçek kodu, parametreleri ve bir başlık dosyasını değiştirmeniz gerekir, bu yüzden aynı zamanda 3 basamaktır (kesinlikle C ++ ile). Evet, transfer () süper hoş değil, ancak genellikle pratikte ihtiyacınız yok.
Ondřej Čertík

3
Modern fortran'ı yeniden düzenlemek, tutulmada Photran gibi uygun IDE'ler ile önemsizdir.

2
"Bir modülün adı, dosya adıyla eşleşmek zorunda değildir, örneğin" Şaka yapıyor olmalısınız, bir dosyada birçok modül olabilir. Bazıları sadece birkaç çizgiyi kapsıyor. Her biri için bir dosya oluşturmanız gerekmiyorsa, oluşturulması çok daha kolaydır.
Vladimir F,

1
Sadece @ user389'ın söylediklerini eklemek istedim, Photran mükemmel ve yeniden yapılanmalara izin veren tek Fortran IDE iken, çözümleyici her zaman başarısız oluyor. Öte yandan, Eclipse’in belleğe aç olduğu konusunda yorum yapmaya gerek yoktur.
astrojuanlu

5

Fortran dizi / matris hesaplamaları için optimize edilmiştir ve herhangi bir tür metin ayrıştırma için çalışmak için tam bir acıdır. C ve C ++, sayısal hesaplamada Fortran ile eşleşmeyebilir (yakındır), ancak metin işlemeyi ve verileri (örn. Özel veri yapıları) C / C ++ ile düzenlemeyi çok daha kolay buluyorum.

Diğerlerinin de belirttiği gibi, dinamik yorumlanmış dilleri saymayın (Python et al). Fortan'ın yüz erime hızını öne çıkaramayabilirler, ancak hesaplama probleminizi uygulama detaylarından daha fazla çözmeye odaklanmanıza izin verir. Genellikle Python'da bir çözüm uygulayabilirsiniz ve performans kabul edilemezse, bazı profiller oluşturabilir, sorunlu alanları tanımlayabilir ve bu kodu Cython kullanarak optimize edebilir veya tüm programı derlenmiş bir dilde yeniden uygulayabilirsiniz. Problem çözme mantığını bir kez çözdüğünüzde, geri kalan sadece uygulamadır ve hesaplama temellerini iyi bir şekilde anlayarak, herhangi bir programlama dilini temsil etmek için basit olmalıdır.


Doğru. Metin ayrıştırma için Python da kullanıyorum.
Ondřej Decertík

Ayrıca bir Python betiğinin bir kısmını derlenmiş bir dilde, örneğin C ++ ile uygulayabilir ve bağlayabilirsiniz. Örneğin, Boost Python, Swig vb.
Faheem Mitha

4

Şu anda ulusal laboratuarlardan birinde çalışıyorum. Etrafımdaki insanların çoğu makine mühendisi. HPC gruplarındaki bazı kişilerle sohbet ederken, çoğunlukla Linux ve çoğunlukla C ++ yapıyorlar. Şu anda bulunduğum grup çoğunlukla masaüstü uygulamalarını kullanıyor ve biz Windows kullanıyoruz ve azalan sırayla kullanıyoruz: C #, FORTRAN, Python, VBA ve VB (6, .NET değil). Kullandığımız simülasyon motorlarından bazıları FORTRAN'daki diğer ulusal laboratuarlarda yazılmıştır.


4

Eski bir iş parçacığını kaztığım için üzgünüm ama görünen o ki 2015 yılında bile Fortran çok kullanılıyor.

Sadece rastladım bu (alternatif bağlantı temelde ben kullanılan ana dilini bulmaya çalıştılar 2018 yılında araştırmacılara sunulacaktır 300 petaflop Zirve makinede çalıştırmak için DOE OCLF tesisi tarafından onaylanan 13 kodlarının bir listesi) listesinde kod için (hızlı bir google aramasına göre) ve işte bulduklarım:

XGC Fortran

SPECFEM Fortran

ACME Fortran (Bunch of climate codes)

DIRAC Fortran (Mostly)

FLASH Fortran

GTC Fortran

HACC C/C++

LS-DALTON Fortran (some C)

NAMD C/C++

NUCCOR Fortran

NWCHEM Fortran

QMCPACK C++

RAPTOR Fortran

Bu yüzden 13 koddan en az 10 tanesi (hızlı aramama dayanarak) Fortran'da yazılmış gibi görünüyor. 50 yıllık bir dil için fena değil.

NOT: Dil karşılaştırmalarının faydasız olduğunun farkındayım, ancak kötü ağızlı Fortran'a söylenen kişi sayısına bakıldığında (özellikle C ++ kullanıcıları), bunu söylemenin faydalı olacağını düşündüm.


3
Kabul etmiyorum, çünkü ulusal laboratuarlardaki deneyimim, eğer bir şey olursa, bunun tersi oldu. Lawrence Livermore'da gördüğüm yeni projelerin çoğu, C ++ dilinde yazılmış ve çoğu ODE çözücüsü, FEM'in takdir hakkı ve genel amaçlı bilimsel bilgi işlem kütüphanelerindeki en yeni (veya aktif olarak tutulan) en yeni açık kaynaklı kütüphaneler C veya C ++ gibi görünüyor. Fortran, çoğunlukla mevcut / eski kütüphaneleri kullanan projelerde kullanılıyor gibi görünüyor; Dil hakkında düşündüklerimden bağımsız olarak Fortran'ı kullanan pek çok büyük, yeni proje göremiyorum.
Geoff Oxberry

Fortran'da da yazılmış bazı yoğunluk fonksiyonel teori kodları VASP ve CASTEP'i içerir , ancak @GeoffOxberry'nin işaret ettiği gibi, yeni projeler belki C ++ 'a yönelir.
dr.blochwave

@blochwave Bağlantıda okuyabileceğiniz gibi, projeler 2018'de çevrimiçi olacak yeni bir makine (hızlandırıcılarla vb.) içindir. verim. Yukarıdaki listede yer alan kodların büyük bölümlerinin yeni kodda olduğu gibi yeniden yazılmış olduğundan eminim. Bir dizi "yeni" iklim kodu Fortran'dadır ve birçok ülkede birçok ülkede kullanılmaktadır.
stali

0

Jack P.'nin söylemeye çalıştığı şey, karıştırıp eşleştirmeniz gerektiğidir. İyi bir yazılım parçası dikkatlice katmanlanmıştır. Farklı katmanlar, farklı dillerle daha doğal veya verimli bir şekilde eşlenebilir. Her katman için en uygun dili seçmelisiniz. Dillerin nasıl bir arada çalışabileceğini de anlamalısınız; bu, hangi katman için hangi dili seçtiğinizi etkileyebilir.

Daha iyi bir soru, mükemmel tasarlanmış yazılımların hangi örneklerin bulunduğu, katmanlı yazılımı nasıl tasarlayacağınızı öğrenmek için çalışmaya değer.

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.