Soru:
FORTRAN hesaplamalı kimyada neden bu kadar yaygın olarak kullanılmaktadır?
Melanie
2015-02-06 07:58:01 UTC
view on stackexchange narkive permalink

Araştırma için komut dosyaları yazmak için Ruby'yi kullanıyorum, ancak Ruby'nin çok yavaş olduğu bazı ağır konulara girmek istiyorum. C ve C ++ ile yazılmış birkaç şey olduğunu fark ettim, ancak hesaplamalı kimyada kullanılan yazılımın garip bir şekilde büyük bir kısmı FORTRAN'da yazılmıştır (burada sıfır deneyimim var.)

Neden FORTRAN? hesaplamalı kimyada kullanılır? Anladığım kadarıyla, FORTRAN biraz eski ("delikli kart" eski). FORTRAN için oldukça yakın zamanda yazılmış dersler bulduğumda biraz şok oldum.

Bu bir tür "bu bunu her zaman nasıl yaptık, "FORTRAN'ın gözden kaçırdığım bir şey mi yoksa verimlilik yönü var mı?

Not: FORTRAN'ı daha sonra benzer adlara sahip programlama dilleriyle karıştırmış olabilirim.

Çünkü insanlar uzun zaman önce kod yazmaya başladılar ve Fortran formül çevirisi için (örneğin Hesaplamalar) büyük ölçüde optimize edildi (ve hala öyle).
Modern Fortran'ın (95, 2003, 2008) FORTRAN 66 veya 77'den çok farklı olduğunu unutmayın.
Evet, bir şeyi gözden kaçırıyorsun. 1) Fortran biraz farklı anlamlara sahiptir. Gerçek işaretçileri yoktur, bu nedenle derleyici optimizasyonlarda biraz daha liberal olabilir. 2) birçok eski fortran kodu vardır 3) fortran, C'den ve özellikle de 'nesne yönelimli' dillerden çok daha basittir.
Belirli dizi hesaplamaları için, Fortran, [işaretçilerin hiçbir zaman birbirinin adını değiştirmediği varsayımı] nedeniyle potansiyel olarak C / C ++ 'dan daha hızlıdır. (Http://stackoverflow.com/questions/146159/is-fortran-faster-than-c)
"tam olarak delikli değil" https://upload.wikimedia.org/wikipedia/commons/5/58/FortranCardPROJ039.agr.jpg
Bu özel dil savaşı (http://en.wikipedia.org/wiki/Software_wars) Stackoverflow http://stackoverflow.com/questions/13078736/fortran-vs-c-does-fortran-still- üzerinde birkaç kez ortaya çıktı sayısal analizde herhangi bir avantajı tut? lq = 1 http://stackoverflow.com/questions/31672/learning-fortran-in-the-modern-era/168565#168565 http: // stackoverflow. com / Questions / 953869 / öğrenmede-yatırımın geri dönüşü mü? lq = 1 http://stackoverflow.com/questions/146159/is-fortran-faster-than-c 30 yıl geriye giden ve bunu düşünen insanlar hala burada olduğu gibi FORTRAN yazıyor.
FORTRAN, hesaplamaya özel programlar geliştirmek için mevcut birkaç seçenekten biriydi. Delikli kartlarla ilgili olarak, sütun formatı (dil özelliğinin bir parçası olan) delikli kartlar düşünülerek tasarlanmıştır.
@DavidZhang Bu, 16 yıl önce eklenmiş olan restrict anahtar kelimesinin kullanımıyla kolayca düzeltildi.
Pek çok bilimsel programcının aslında korkunç programcılar olduğunu unutmayalım ve Fortran'da mantıklı bir şeyler yazmak C ++ 'dan çok daha kolaydır.
https://www.quora.com/What-is-the-most-popular-programming-language-used-in-computational-chemistry?share=1
LOL - İlk programımı 1971'de FORTRAN'da delikli kartlar kullanarak yazdım. Kaç kişinin bir tuş vuruşu için kontrol kartını nasıl ayarlayacağını bildiğini merak ediyorum. İnek olmanın bir başka kayıp işareti de, teletip delgi okuyucu için bir kağıt bandın nasıl sarılacağını bilmekti.
Altı yanıtlar:
Geoff Hutchison
2015-02-06 08:35:30 UTC
view on stackexchange narkive permalink

Bunun artık doğru olduğunu sanmıyorum.

Bazı Fortran kullanımları tarihseldir (yani, erken kodlar FORTRAN'da geliştirilmiştir çünkü bu 70'ler ve 80'lerde sayı hesaplaması için en iyi programlama diliydi) . Heck, adı "formül çevirisi" anlamına geliyor.

Fortran kullanımının bir kısmı performans nedeniyledir. Dil şu şekilde tasarlandı:

özellikle sayısal hesaplama ve bilimsel hesaplama için uygun.

Çoğu zaman kimya kodlayıcılarının Fortran'a yapıştığını görüyorum çünkü biliyorlar ve mevcut son derece optimize edilmiş sayısal kod tabanlarına sahip.

Modern, yüksek düzeyde optimize C ve C ++ derleyicileri kullanırken performans yönünün artık doğru olmadığını düşünüyorum.

Bir Python ile performans ve birçok şeyi yapıştırmak için C ve C ++ 'da çok sayıda kod. Bazı kuantum programlarının özel olarak veya öncelikle C ++ ile yazıldığını biliyorum. İşte birkaç açık kaynak örneği:

  • Psi4 - C ++ ve Python ile yazılmıştır
  • MPQC - Yazılmıştır C ++
  • LibInt - Verimli kuantum integralleri için C ++ ile yazılmıştır.
  • LibXC - C ile Fortran "bağlamaları" ile yazılmıştır. DFT değişim-korelasyon işlevleri

Bu benim düşüncem, ancak kimyada daha hızlı performans için tavsiyem, içinde C veya C ++ bulunan Python olacaktır.

Buluyorum Python'da daha verimli kodlama yapıyorum, kısmen dil nedeniyle, kısmen de birçok paket nedeniyle, kısmen derlemem gerekmediğinden ve bunların hepsi önemli.

Ayrıca, Python komut dosyalarını çalıştırabilirsiniz. ve GPU'da paralel olarak çalışır ve hatta bunları derler, örn. Numba ile. Dediğim gibi, performansın çok önemli olduğunu düşünüyorsam, parçaları C veya genellikle C ++ dilinde yazıp gerektiğinde Python ile bağlantı kuracağım.

Tamamen kullanıma dayalı olarak, şu anda bilimsel programlama için Python'u * şiddetle * tavsiye ediyorum. Yeni bir projenin bazı parçaları, verimli NumPy veya SciPy fonksiyonları olarak zaten mevcuttu. :-)
Python'da cidden satıldım. Python'da pek yazmadım, ancak içinde yazılmış gerçekten yararlı birçok komut dosyası buldum. C veya C ++ söz konusu olduğunda, hangisini önerirsiniz? Sadece Ruby ve Perl (ve biraz da Python) kullandım ve Perl'e gerçekten aldırmadım.
Dil öğrenmek için önerim, ihtiyacın olan yerde bir projeye sahip olmak. Son zamanlarda Python'a sadece NumPy görüntü işlemeyi kullanmayı öğrettim. Python'u bir süre kullanmanızı öneririm, o zaman performans açısından kritik bir bölüm varsa, C veya C ++ ile yeniden yazmayı deneyin. Birçok "X dilini öğrenin" kılavuzu çevrimiçi ve kitap biçiminde mevcuttur.
@GeoffHutchison, Sadece kendi kullanımıyla ilgili bir şeyi * asla * tavsiye etmem.
Yine de, yaygın QC paketlerinin çoğu fortran dilinde yazılmıştır.
@Wildcat Tekerleği yeniden icat etmenize gerek yoksa daha hızlı prototipleme açısından avantajları vardır.
@permeakra Bunun büyük ölçüde tarihe bağlı olduğuna inanıyorum. Gauss, 70'lerde Pople tarafından başlatıldı. GAMESS, C'nin çok kabul görmesinden çok önce benzer şekilde başlatıldı. Daha modern projeler büyük ölçüde karışık veya C ++ 'dır.
@permeakra Ne olursa olsun, Pople'ın Q-Chem'e başladığında kendine biraz C ++ öğrettiğini biliyorum. Libint gibi projelerdeki şablon meta programlamasının bazılarının Fortran'da kopyalanması zor veya imkansız olacaktır.
@GeoffHutchison C / C ++, bellek okuma ve yazma işlemlerinin yeniden sıralanmasını kısıtlayan anlambilimde (özellikle işaretçiler ve dizi adı = işaretçi kullanarak dolaylı erişim) bazı tuhaflıklar içerir. Bu nedenlerle, fortran kodu çok daha iyi optimize edilebilir. Bu nedenle Fortran, tüm yaygın dillerden sayı hesaplaması için en iyi dildir. Modern açıklık zamanlarında, ana dil daha az önemli hale gelir, bu nedenle diğer seçenekler kullanılabilir hale gelir.
@permeakra Katılıyorum, ancak hangi dilin en iyi olduğu konusunda tartışmak istemiyorum. Elbette her ikisi de yüksek performanslı kimya kodları yapmak için kullanılır ve OpenCL ve diğer özellikler dil seçimini daha az önemli hale getirir.
Fortran, çağlar boyunca, derleyici ve optimize edici desteği olan yerel çok boyutlu dizilere sahiptir. Öte yandan C / C ++, bunu vektörlerin vektörleriyle simüle eder. Pek çok insan tam da bu nedenle Fortran'ı kimya ve diğer bilimsel amaçlarla kullanmaya devam etti.
Aslında Python yorumlanmış bir betik dilidir, yani kodunuz çalışma zamanında bir yorumlayıcı tarafından çevrilir. Dolayısıyla geliştirme süresi ve hız arasında bir denge vardır. Matematiksel / kimyasal hesaplamalar için hiçbir programlama dili c / c ++ 'yı geçmez. Paralel olarak kod çalıştırmak istiyorsanız, programlarınızı çok iş parçacıklı yapmayı öğrenmelisiniz.
Verimli ve etkili c / c ++ için bir öğrenme eğrisi olduğunu söylemem gerekse de, sizden aksini göstermeye davet ediyorum.
@AlanZ2223 Yeni programın açıklık özellikli yazılımda çalışması amaçlanıyorsa, açıklığın hangi dilden kullanılacağından pek bir farkı yoktur. Ve C ++ şimdiye kadarki en kötü mevcut dillerden biridir.
Wildcat
2015-02-06 15:56:58 UTC
view on stackexchange narkive permalink

Biraz alternatif bir görüş sunmanın ve konuyu açıklığa kavuşturmanın mantıklı olduğunu düşünüyorum.

FORTRAN'a karşı Fortran

Öncelikle, eski FORTRAN'ı yeni Fortran, burada geleneksel olarak eski dilin adı genellikle büyük harflerle yazılır. Eski FORTRAN (FORTRAN 77'ye kadar) gerçekten de tonlarca eski kod nedeniyle hala kullanılıyor, ancak yeni Fortran (Fortran 90'dan başlayarak) esas olarak çok zarif ve basit ama güçlü ve verimli bir şekilde uygulanan bir dil olduğu için kullanılıyor. numara hesaplama için .

DSL ile genel olarak GPL karşılaştırması

Özellikle, bence modern Fortran'ın bile alana özgü bir dil em olduğuna dikkat edin > (DSL) ve burada bahsedilen C ++ gibi bazı genel amaçlı diller (GPL) ile karşılaştırıldığında görece zayıflığı yatmaktadır: Fortran belirli bir görev için (sayı hesaplaması) uzmanlaşmıştır ve bunlar için çok uygun olmayabilir. ilgili bazı görevler (örneğin, nihai sonuçların otomatik analizi, grafiksel gösterimleri vb.)

C ++ gibi genel amaçlı diller size daha fazla esneklik sağlar (dil özelliklerinde, 3. taraf kitaplıklarında, vb.) böylece yalnızca birincil görevi (sayı hesaplama) değil, aynı zamanda aynı dili kullanarak ilgili görevi de çözebilirsiniz. Bununla birlikte, sayı hesaplaması için Fortran'ı seçerseniz, bu ilgili görevler için genellikle bir dil daha (ör. Python) kullanmanız gerekir. Bunu iki farklı DSL kullanıyormuş gibi düşünün: biri birincil görev için, diğeri ilgili görevler için. Tabii ki, Python'u C ++ ile birlikte de kullanabilirsiniz, ancak deneyimli bir C ++ geliştiricisi (içinde bir miktar hesaplama yapmayı seçerseniz olmanız gerekir), C ++ canavarı yerine başka bir dil kullanmaktan yararlanmayacaktır.

Fortran ve C ++ özellikle

Bütün bunlar biraz öznel, ama neyse, işte benim 5 sentim. Genel olarak, Fortran C ++ 'dan daha basittir , ancak (ve çünkü) C ++ daha fazla özellik açısından zengindir . Temel olarak, çünkü Fortran DSL, C ++ ise GPL'dir. Ve dediğim gibi, bu bir dereceye kadar özneldir ve ayrıca karmaşıklık, evrendeki en karmaşık şeylerden biridir, bu yüzden onun hakkında bir tartışma başlatabiliriz, ama hey, sadece bir kelime: şablonlar ve tartışma prensip bitti. Şablonlar C ++ 'yı canavar yapar, ancak her şey bedeli karşılığında gelir.

Bana göre "daha zengin özelliklere sahip" her zaman "anlamına gelmediği için C ++' nın daha güçlü olduğunu söylemedim. daha güçlü". Her şeyden önce, bu ek özelliklere gerçekten ihtiyacınız var mı, yoksa gerekmiyor mu? Cidden, cömertlik düzeyine (ve meta programlamaya) ihtiyacınız var mı C ++ şablonlarının sayıları hesaplamak için sağladığı? Şart değil. Ve eğer öyleyse, C ++ Fortran'dan daha güçlü olmaz, ancak yine de daha zengin özelliklere sahip olacaktır.

Şablonlar, Fortran'ın sahip olmadığı tek C ++ özelliği değildir. İstisnalar ve Standart Kitaplık - Fortran'ın sahip olmadığı diğer iki göze çarpan özelliktir. Yine, sayı hesaplaması için bu özelliklerden büyük ölçüde yararlanmanız pek olası değildir. Ancak diğer bazı görevler çok yardımcı olabilirler, bu nedenle GPL bunları içerdiğinden C ++, sayı hesaplaması için DSL olarak Fortran bunu yapmaz. Fortran'ı sadece numara hesaplaması için bir "çanta dili" ve her şey için bir "gövde dili" olarak C ++ olarak düşünün.

Fortran dilinin C ++ 'nın hala yakalayamadığı harika bir özelliği de var: modüller. Demek istediğim, beni her şeyden daha çok rahatsız eden eski önişlemci makineleri değil, gerçek modüller .

C ++ gerçek modüllere sahiptir; uygulama ayrıntılarını beğenmezseniz, #pragma'yı bir kez kullanın.
Jonathon
2015-02-06 08:38:05 UTC
view on stackexchange narkive permalink

FORTRAN, kısmen göreceli basitliği nedeniyle, derleyicilerin çok daha iyi optimize edilmesi nedeniyle hız söz konusu olduğunda bir avantaja sahipti. Artık C ve C ++ derleyicileri neredeyse eşit (ve bazen daha iyi) olduğundan, programlanabilirlik gibi diğer faktörler devreye giriyor. Bununla birlikte, pek çok eski kod var.

Kuantum kimyasında çalışıyorum ve birlikte çalıştığım programların çoğunun bir karışımı var, ancak daha fazla C ++ kullanmaya başlıyor. PSI4 paketi, her birinin hız ve kullanılabilirlik avantajlarından yararlanmak için Python ve C ++ 'yı bile karıştırır.

Burada, çeşitli programların ve kullandıkları dillerin bir listesi.

  • ORCA - C ++
  • MPQC - C ++
  • PSI4 - C ++, Python
  • PySCF - Python
  • Q-Chem - FORTRAN, C ++
  • CFour / ACES - FORTRAN, son zamanlarda bazı C ++
  • NWChem - FORTRAN, C
  • GAMESS (US) ve GAMESS (UK) - FORTRAN
  • Gaussian - FORTRAN
  • Molpro - FORTRAN
  • Dalton - FORTRAN, biraz C
  • MRCC - FORTRAN
  • MOLCAS / OpenMOLCAS - FORTRAN
  • DIRAC - FORTRAN
  • ADF - FORTRAN
  • CASINO - FORTRAN
  • COLUMBUS - FORTRAN
  • CP2K - FORTRAN
  • TURBOMOL - FORTRAN

Kuantum kimyası paketleri

Bilgisayar Dili Kıyaslama Oyunundaki C / C ++ kodu çok "hacky" bir şekilde yazılmıştır. Böyle bir kod neredeyse sürdürülemez olduğu için kimse bunu "üretimde" yapmayacaktır. Sürdürülebilir C / C ++, Fortran'ı yenemez.
Ne yazık ki bu bazen doğrudur. Bununla birlikte, C ve C ++ en iyileştirme derleyicileri yakaladığından, kullanılabilirlik gibi başka hususlar da vardır.
@Wildcat Katılmıyorum; İfade şablonlarının kullanıldığı Blitz ++ gibi kitaplıklar ne hack'lidir ne de sürdürülemez; kullanımı ve bakımı çok kolaydır ve FORTRAN'ı doğrusal cebirde düzenli olarak yenerler.
@Alice, ilk olarak, C ++ kitaplıklarının karmaşıklığı hakkında hiçbir şey söylemedim. İkincisi, gerçekten çok karmaşıklar. 10 yıllık C ++ geliştirmeniz varsa, muhtemelen ifade şablonlarını anlayabilirsiniz, ancak nerede olduğunuza bakın: orada kimya sitesi.
@Alice: Blitz ++ 'yı hiç duymadım.Belki iyidir, ancak geniş kullanıcı tabanı da önemlidir.
@Alice: Blitz ++ 'nın FORTRAN'ı geçtiği bir örnek verebilir misiniz?
Cort Ammon
2015-02-06 11:30:43 UTC
view on stackexchange narkive permalink

FORTRAN, C ++ 'dan daha az ifade edici bir dildir ve bu, eski derleyicilerin çok daha verimli bir şekilde optimizasyon yapmasına olanak tanır. Modern derleyicilerde performansta çok az fark vardır veya hiç yoktur. FORTRAN'ın daha zayıf güvenlik garantilerinin daha aşırı optimizasyonlara izin verdiği sadece birkaç yer var. FORTRAN'ı geliştirmek için 6-10 yıl harcamadığınız sürece büyük olasılıkla farkı fark etmeyeceksiniz.

Genel olarak konuşursak, modern bilgi işlem yeteneklerinden daha iyi yararlandıkları için yeni dillerde geliştirme yapmak daha kolaydır. FORTRAN, format olarak çok katıdır çünkü 1970'lerin ortasındaki bilgisayarlar tarafından derlenmesi gerekiyordu. Ne yapmak istediğinizi daha insan tarafından okunabilir bir dilde söylemek yerine, bilgisayara tam olarak ne yapması gerektiğini söylüyorsunuz.

FORTRAN, ortaya çıkarabileceğim iki ana nedenden dolayı hala kullanılıyor:

  • C ++ 'nın ifade gücünün boşa gittiği bazı problemler yeterince basittir ve daha basit FORTRAN ile aslında daha net bir program yapabilirsiniz.
  • Birçok program önceki nesil tarafından yapılmıştır. FORTRAN geçmişte hesaplamalı işler için daha iyiydi.
Saf fikir olarak, belki bir düzine dilde geliştirmiş bir geliştirici olarak, arayüz için eski bir FORTRAN kod tabanı yoksa, herhangi bir görev için FORTRAN'ı herhangi bir geliştirici için tavsiye etmem için hiçbir neden yoktur. İnsanlar artık dili öğrenmiyorlar, yani yazdığınız herhangi bir kodu sonsuza kadar sürdürmeniz gerekecek. Kimseye devretmek zor olacak.
@CortAmmon Bu gerçek olmaktan o kadar uzak ki entelektüel olarak sahtekarlıktır. Modern FORTRAN, tanrı aşkına LHC'de CERN'de kullanılıyor ve eski bir tabanı kullanan yeni kod da değil; birçok şey kapsamlı bir şekilde yeniden yazılmış veya sıfırdan yazılmıştır. FORTRAN, kullandığı sayısız kütüphane ve görevin gösterdiği gibi, C ++ 'dan daha az anlamlı bile değildir. Dahası, tonlarca insan hala öğreniyor; bazı ortamlarda (çoğunlukla bilimsel) gerekli bir programlama dilidir.
Bu bir olumlu oy aldı ve dikkatimi tekrar ona çekti.[2019'dan StackExchange programcı anketine] (https://insights.stackoverflow.com/survey/2019#technology) bir bağlantı göndermenin yararlı olacağını düşündüm.Alice'in kredisine göre, FORTRAN'ı geliştiren birbirine sıkı sıkıya bağlı küçük popülasyonlar olabilir ve bu popülasyonlarda bu sürdürülebilir bir dil olabilir.Ancak daha büyük geliştirici popülasyonunda, o kadar popüler değil ki, insanların geliştirdiği dillerin listesini bile yapmadı (listedeki en düşük oran% 1,1 ile WebAssembly idi)
Buttonwood
2017-05-31 18:18:22 UTC
view on stackexchange narkive permalink

J'de bir makaleye rastladım. Appl. Cryst. kısmen orijinal soruyla ilgili. Fortran'ı, yeniden kullanılabilir bir yazılım çerçevesinde kristalografik algoritmalar bağlamında diğer programlama dilleriyle karşılaştırmak, şu kısaltılmış diyagramı verir:

enter image description here

( doi 10.1107 / S0021889801017824)

Makalenin eski Fortran 77 lehçesiyle yazılmış yazılım paketleri ile ilgili olduğu da eklenmelidir.

Python gibi diller özellikle hızlı olmasa da (temelde derlenmemiş olarak yorumlanır) bu yanıltıcıdır. Python, belirli hesaplama görevleri için son derece optimize edilmiş derlenmiş kitaplıklara erişmeyi kolaylaştırır. Böylece, programlama kolaylığını birleştirebilir ve yine de yüksek hızda hesaplama elde edebilirsiniz. Bu, popülaritesinin artmasının bir nedenidir.
Pierpy
2017-04-03 01:39:44 UTC
view on stackexchange narkive permalink

Hesaplamalı kimya topluluğunda Fortran'ın geniş kullanımının iki ana nedeni olduğuna inanıyorum. Birincisi verimliliği yüzündendi: FORTRAN, Formül Çeviricisi anlamına gelir ve bilimsel / sayısal hesaplama, bu kodu geliştirmenin ana nedeniydi.

Günümüzde, Fortran hala çok verimli, ancak diğer bazı diller örnek) Fortran kadar etkilidir. Peki neden hala Fortran'da kod yazıyoruz? Temel olarak, Elektronik yapı yazılımının çoğu Fortran'da yazılmıştır ve hiç kimse milyonlarca satırı çevirmek için bu kadar çılgın değildir. Bu nedenle kod blokları eklerken Fortran'da yazmaya devam ediyoruz! Öte yandan, yeni bir yazılımın yazılması gerekiyorsa, dil olarak Fortran'ı seçmenin pratik bir nedeni olmayacaktır. Örneğin, nükleer dalga fonksiyonlarını elde etmek için en son yazılım MIDAS (Aarhus Üniversitesi) tamamen C ++ ile yazılmıştır. Şahsen ben Fortran90'ı dil olarak kullanıyorum ve eski FORTRAN77 kadar katı değil ... ve hoşuma gidiyor! :) Doktora programıma başladığımda gönderdiğiniz soruyu kendime sordum aslında.

+1.Çok güzel cevap.Özellikle de buradaki ilk ve tek cevabınız olduğu için.Bu yanıtın, olduğundan çok daha fazla olumlu oyu olması gerekir.


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...