Fortran'ı hızlı yapan nedir?


41

Fortran'ın sayısal programlamada özel bir yeri vardır. Diğer dillerde kesinlikle iyi ve hızlı yazılımlar üretebilirsiniz, ancak Fortran yaşına rağmen çok iyi performans gösteriyor. Üstelik Fortran'da hızlı programlar yapmak daha kolay. C ++ 'da hızlı programlar yaptım, ancak işaretçi takma gibi şeyler konusunda daha dikkatli olmalısınız. Öyleyse, bunun bir nedeni olmalı ve çok teknik bir tane olmalı. Derleyici daha fazlasını optimize edebileceğinden mi? Gerçekten teknik detayları bilmek isterim, bu yüzden başka bir dil kullanırsam bunları dikkate alabilirim.

Örneğin, biliyorum - ya da bence - bir şey, standardın işaretçilerin her zaman bellekte bitişik olduğunu belirtmesidir, bu da daha hızlı bellek erişimi anlamına gelir. Derleyiciye bir bayrak vererek C ++ 'ta yapabileceğinizi düşünüyorum. Bu şekilde, Fortran'ın neyin iyi yaptığını bilmek yardımcı olur, böylece başka bir dil kullanıyorsanız bunu taklit edebiliriz.


7
Bunun iyi bir soru olmasına rağmen, yığın akışı için daha iyi bir soru olabileceğini söyleyebilirim. Hızlı bir arama ( stackoverflow.com/search?q=fortran+fast ) bu konuda size yardımcı olabilecek bu soruyu bana yönlendirir: stackoverflow.com/questions/146159/is-fortran-faster-than-c
Yann

3
Hangi tür servet kullandığınızı belirtmeniz gerekir. 77 ile 90+ arasında önemli bir fark var. Eğer işaretçilerden bahsediyorsak en az 90 olduğunu varsayıyorum ...
bitiyor

Fortran'ı her zaman C'den daha hızlı olduğunu okudum. Eh, belki, ama% 2 gibi daha hızlı mı yoksa% 50 gibi daha hızlı mı?
Aralık'ta shuhalo

4
Bu bir şehir efsanesi. Derleyici özel talimatlardan faydalanmadıkça, derleyiciden bağımsız olarak hemen hemen her programı aynı makine dili için üretebilirsiniz.
Mike Dunlavey,

Yanıtlar:


50

Dil tasarımcıları birçok seçenekle karşı karşıya. Ken Kennedy iki tane vurguladı: (1) daha iyi soyutlamalar ve (2) daha yüksek veya daha düşük seviye (daha az veya daha fazla makine benzeri) kod. Haskell ve Scheme gibi fonksiyonel diller eski, Fortran ve C / C ++ gibi geleneksel bilimsel hesaplama dillerine odaklanırken, ikincisi üzerinde duruldu. Bir dilin diğerinden daha hızlı olduğunu söylemek genellikle oldukça yanıltıcıdır: Her dilin üstün olduğu bir sorun alanı vardır. Fortran, dizi temelli sayısal kodlar alanında iki temel nedenden ötürü diğer dillerden daha iyidir: dizi modeli ve açıklığı.

Dizi Modeli

Fortran programcıları büyük ölçüde dizi manipülasyonları yapar. Bunun için Fortran, diğer dillerde bulunmayan birçok derleyici optimizasyonunu kolaylaştırır. En iyi örnek vectorization'dır: veri düzenini bilmek, derleyicinin dizi üzerinde montaj düzeyinde intrinikleri çağırmasını sağlar.

Dil Açıklığı

Daha basit bir dilin daha karmaşık olandan daha "daha iyi" bir şekilde derlenmesi gerekiyor gibi gözükse de, durum böyle değil. Bir montaj dilinde yazıldığında, bir derleyicinin yapabileceği fazla bir şey yoktur: tüm gördüğü çok iyi ayarlanmış talimatlardır. Fortran, yalnızca dizi tabanlı hesaplama için gerçek ödüller veren durumlarda açıklık gerektirir (bu nedenle programcının daha fazla çalışması). Fortran basit veri türleri, temel kontrol akışı ve sınırlı ad alanları kullanır; Buna göre, bu yok değil (için gerekli olabilir kayıtlarını nasıl yerleştirileceğini bilgisayarı anlatmak gerçek zamanlı ). Fortran'ın açık olduğu yerlerde , acemilerin başlamasına yardımcı olan tam tip çıkarım gibi şeyleri mümkün kılar. Aynı zamanda C'yi yavaşlatır bir şeyi önler:opak işaretçiler .

Fortran Yavaş Olabilir

Fortran her görev için hızlı değildir : bu yüzden çoğu insan bunu GUI'leri oluşturmak için veya hatta yapılandırılmamış bilimsel bilgi işlem için kullanmaz. Grafikler, karar ağaçları ve diğer alemler için diziler dünyasını terk ettiğinizde, bu hız avantajı hızla ortadan kalkar. Bazı örnekler ve sayılar için bilgisayar dili kriterlerine bakınız .


7
GUI / IO sorunları Fortran çatırdamasını "daha genel amaçlı" bir dilde sararken kolayca çözülebilir. Bu amaçla R'yi sıklıkla kullanırım.
mbq

2
shootout.alioth.debian.org artık mevcut değil! Ve yeni sürüm çok daha az bilgiye sahip :(
astrojuanlu

23

Fortran'ın tasarımı derleyicinin bazı durumlarda daha güçlü optimizasyonlar yapmasına, genellikle C için mevcut olmayan optimizasyonlara izin verir.

Ünlü bir örnek, takma işlemin kullanılmasıdır . Fortran'da, belirli bir hafıza alanına ancak o hafıza alanıyla ilişkilendirilmiş olan belirli sembole erişebilirsiniz. Bu bilgi derleyicinin önbelleklenme zamanı geldiğinde akıllı hileler kullanmasına izin verir: bir değerin potansiyel olarak değişip değişmediğini bilir. F90'a kadar bu kolayca doğrulandı. Fortran 90 piyasaya sürüldüğünde pointers, varsayım artık doğru değildi: aynı hafıza alanına iki (veya daha fazla) sembolle erişebiliyordunuz. Bu, targetişaretçilerle adreslemek istediğiniz dizileri belirtmenizin nedenidir .

Bir başka ilginç gerçek, birçok yapının derleyicinin kullanıcı müdahalesi olmadan paralelleştirme gerçekleştirmesine izin vermesidir. Bu lüks, Fortran'ın göreceli "platform agnostisizmi" nedeniyle bir dil olarak mümkündür.

Bunun gibi birçok başka ince hileler var. Ek olarak, sayısal hesaplamalar dışında, bugün hiç kimsenin Fortran kullanmadığını, Fortran derleyicilerinin temel özelliği ve satış noktasının sonuç kod hızı olduğu anlamına geldiğini unutmayın. Sonuç olarak, satıcılar buna odaklandı.

Bununla birlikte, diğer dillerle de performans kodu üretebilirsiniz. Bununla birlikte, özel bakım veya insan müdahalesi gerektirebilir. Ancak genel nokta, performansın bir sorun yaşanıncaya kadar sorun olmadığı ve erkek zamanının bilgisayar zamanından çok daha pahalı olduğu. Bu yüzden kodlama uygulamaları bilgisayar zamanından ziyade insan zamanından tasarruf etmeye odaklanmalıdır.


2
Bilgisayarlarınız> 100 milyon dolarlık alana girdiğinde, insanlar zamanı (yüksek lisans öğrencileri) karşılaştırıldığında oldukça pahalı görünmeyi bıraktı.
Phil Miller,

6
@Novelocrat: üzerinde çalışır bu kodu miktarı $ 100 milyon bilgisayarın ötesine gitmek sayılamayan adam saat yazılmıştır $ bile grad öğrenci fiyata 100 milyon mark. Bir kişinin masraflarının gelirinin iki katı olduğunu unutmayın. Gerisi vergilere girer ve ilişkilendirilir. Ayrıca, bir bilgisayar yanma deneyimi yaşamaz. Bir kişi yapar ve işi değiştirir.
Stefano Borini

1
@StefanoBorini yanma deneyimi olan uzun bir PC geçmişine
sahibim

1
"Ek olarak, sayısal hesaplamalar dışında bugün hiç kimsenin Fortran kullanmadığını unutmayın," Fortran = "FORmula TRANslation". Fortran her zaman öncelikle sayısal hesaplamalar için kullanılmış ve kullanılmıştır. Fortran, yüksek performanslı bilgisayarların zamanından büyük bir paya sahiptir.
user21387

Bugün, her zaman olduğu gibi, Fortran da aynı amaç için kullanılır - sayısal hesaplamalar.
dizi

12

Fortran'ın metale bu kadar yakın olduğunu sanmıyorum (diğer cevaba bakınız) ama çok kolay bir şekilde optimize etme eğilimindedir. Döngüler basittir ve dil kolayca vektörleştirme uzantılarını destekler (tamam, ilk işimde kullandığımda geniş bir vektör büyük demir yelpazesini hedefledik).

Ayrıca büyük atalet faktörü de vardır. Fortran'da bir çok sayısal kod vardır, bu yüzden üst seviye sunucuların ve süper bilgisayarların üreticileri Fortran derleyicilerini iyi bir şekilde optimize etmelerini sağlar. Derleyiciler iyidir (göreceli olarak yüksek kaliteli derleyicilerden yoksun olan makinelerde bile), kullanıcılar Fortran'ı kullanmaya devam eder ve hatta içine yeni kodlar yazar. Böylece inşaatçılar gelecek nesillerin iyi derleyicilere sahip olduğundan emin olurlar ...


8

Buradaki şehir mitlerine dikkat et. İki derleyici aynı montaj kodunu oluşturursa, ortaya çıkan programlar aynı performansa sahip olur.

Herhangi bir mantık parçası için, assembly dilinde yürütme süresini en aza indiren bir program vardır. Bu program hangi derleyicinin ürettiğini önemsemez.

Bununla birlikte, derleyici diller programcının hayatını kolaylaştırmak için var. Bunun maliyetinin bir kısmı, kullanıcıyı minimum yürütme süresi ile sonuçlanmayan özellikleri kullanmaya teşvik edebilmeleridir. Bunun ana örneği newC ++ 'dadır. (Ne kadar yavaş olabilirdi - sadece üç karakter mi?) Pratik olarak, belleği dinamik bir şekilde ayırmanız ve çalışma zamanı maliyetine hiç aldırmamanız için size yalvarır. Eğer yapmak istediğin buysa, bu müthiş, ama Fortran daha hızlı olabilirdi çünkü seni bunu içine çekmedi.

Ancak, bunun ötesinde, ilk yazdığı gibi , derleyicinin sizin için asla temizleyemeyeceği türden performansın iyileştirilmesi için yeterli alana sahip olmayan bir program görmedim . Bir örnek olarak, aynı argümanla art arda expve / veya logtekrar tekrar arayarak çok fazla zaman harcamak . Başka bir örnek olarak, matrisleri çarpmak için DGEMM'i aramak ve çok fazla zamanın sadece giriş karakteri argümanlarını deşifre etmek için LSAME'i çağırmaya gittiğini bulmak.

Bu, insanların Fortran'ın işaretçi takma ya da döngü açma işleminden dolayı daha hızlı olduğunu söylediği gibi aynı zamanda. Bu Porsche tarafından yapılan bir otobüsün kesinlikle Chevrolet tarafından yapılan bir otobüsten daha hızlı olacağını söylemek gibi. Biraz sağduyulu olmalı.


4
Bunun sadece bir şehir efsanesi olduğunu sanmıyorum. Fortran'ın tüm dizi işlemleri, PURE / ELEMENTAL işlevleri vb. Desteği, derleyicilerin kolayca optimize edilmesine / vektörleştirilmesine ve hatta paralelleştirilmesine yardımcı olabilir. Örneğin, bkz. Thinkparallel.com/2007/08/14/… . Derleyicilerin gerçekte yaptıkları farklı bir hikaye (satıcıya bağlı).
stali

@stali: Bu satıcıya daha fazla bağlıdır. Derlenmekte olan programa bağlıdır. İnsanların "Fortran'ın hızlıca koşabileceği bir program var" dan "Fortran'ın herhangi bir programda daha hızlı" olduğunu genelleştirdiğini gördüm. Bunu işaret ederseniz, insanlar tüyleri alıp satabilir ve saçlarını bölebilir ve sonunda gerçekte ortaya çıkan şey temelde insanların düşünmek istediğinden daha fazla bir şey değildir.
Mike Dunlavey
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.