Fortran, ağır hesaplamalar için C'den daha kolay optimize edilebilir mi?


410

Zaman zaman Fortran'ın ağır hesaplamalar için C'den daha hızlı olduğunu veya daha hızlı olabileceğini okudum. Bu gerçekten doğru mu? Fortran'ı neredeyse bilmediğimi itiraf etmeliyim, ancak şimdiye kadar gördüğüm Fortran kodu, dilin C'de bulunmayan özelliklere sahip olduğunu göstermedi.

Eğer doğruysa, lütfen bana nedenini söyle. Lütfen bana hangi dillerin veya kitapların sayı kırma için iyi olduğunu söyleme, bunu yapmak için bir uygulama veya lib yazmak niyetinde değilim, sadece merak ediyorum.


53
Aşağıda verilen cevaplardan oldukça öznel. Doğru başlık "Bir Fortran derleyicisinin bir C derleyicisinden daha iyi optomize kod üretebilmesinin temel mimari nedenleri var mı?" Ama bu sadece nit toplama.
Martin Beckett

3
Başlık sorusu bir yanlış anlama kadar öznel değil bence. Daha ayrıntılı soru öznel değildir.
jfm3

1
Cevabın yanı sıra kimsenin bundan çok şey öğreneceğini sanmıyorum, aynı zamanda "Evet" ve "Hayır" ve derleyici, kaynak, CPU, bellek düzeni vb.
user7116

1
Soru veya cevapların öznel olduğunu düşünmüyorum. Ama bu bayrağın herkese yardım ettiğini düşünüyorsanız, iyiyim.
quinmars

2
@sixlettervariables Cevabı zaten bildiğimiz halde, çoğu insanın kariyerinin başlarında ortaya çıkan bir soru ve cevabı anlamak önemlidir.
Yoksul edici

Yanıtlar:


447

Diller benzer özellik setlerine sahiptir. Performans farkı, bir EQUIVALENCE ifadesi kullanılmadığı sürece Fortran'ın takma adlara izin verilmediğini söylemesi gerçeğinden kaynaklanmaktadır. Takma adı olan herhangi bir kod geçerli Fortran değildir, ancak bu hataları algılamak için programcıya ve derleyiciye bağlı değildir. Böylece Fortran derleyicileri, bellek işaretleyicilerinin olası örtüşmesini görmezden gelir ve daha verimli kod üretmelerine olanak tanır. C'deki bu küçük örneğe bir göz atın:

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

Bu işlev, optimizasyondan sonra Fortran muadilinden daha yavaş çalışır. Neden öyle? Çıktı dizisine değerler yazarsanız, matrisin değerlerini değiştirebilirsiniz. Sonuçta, işaretçiler üst üste gelebilir ve aynı bellek yığınını gösterebilir ( intişaretçi dahil !). C derleyicisi, tüm hesaplamalar için dört matris değerini bellekten yeniden yüklemeye zorlanır.

Fortran'da derleyici matris değerlerini bir kez yükleyebilir ve bunları kayıtlara kaydedebilir. Bunu yapabilir, çünkü Fortran derleyicisi işaretçilerin / dizilerin bellekte çakışmadığını varsayar.

Neyse ki, restrict bu sorunu çözmek için C99 standardına anahtar kelime ve katı kenar yumuşatma eklendi. Bugünlerde de çoğu C ++ derleyicisinde desteklenmektedir. Anahtar kelime derleyiciye, programlayıcının bir işaretçinin başka bir işaretçiyle takma olmadığını vaat ettiğine dair bir ipucu vermenizi sağlar. Sıkı örtüşme, programcının farklı türdeki işaretçilerin asla örtüşmeyeceğine söz verdiği anlamına gelir, örneğin a double*, bir int*ile örtüşmeyecektir (belirli bir istisna dışında char*ve void*herhangi bir şeyle örtüşebilir).

Onları kullanırsanız, C ve Fortran'dan aynı hızı elde edersiniz. Ancak, restrictanahtar kelimeyi yalnızca performans açısından kritik işlevlerle kullanma yeteneği , C (ve C ++) programlarının daha güvenli ve daha kolay yazılması anlamına gelir. Örneğin, geçersiz Fortran kodunu düşünün:CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30) çoğu Fortran derleyicisinin uyarı vermeden mutlu bir şekilde derleyeceği ancak yalnızca bazı derleyicilerde, bazı donanımlarda ve bazı optimizasyon seçeneklerinde görünen bir hata getiren .


26
Hepsi doğru ve geçerli, jeff. Ancak, "hiçbir örtüşme kabul" - anahtar güvenli düşünmüyorum. Diğer projelerden miras alınan kodu o kadar ince yollarla kırabilirim ki kullanmak istemem. Ben bu nedenle bir kısıtlayıcı nazi oldum :-)
Nils Pipenbrinck

3
İkinci noktama, hiçbir diğer ad derleyici anahtarını kullanmak zorunda değilsiniz. İşaretçi tabanlı yüklerin önce otomatik bir değişkene atanması için kodu yazmanız ve oradan otomatiklerle çalışmanız yeterlidir. Daha ayrıntılı görünecek, ancak derleyici tarafından mükemmel şekilde optimize edilecektir.
Uzun Jeff

33
Bunun iyi bir örneği sadece memcpy () ve memmove () 'nin varlığıdır. Memcpy () 'den farklı olarak, memmove () çakışan alanlarla baş eder, bu nedenle memcpy () memmove ()' dan daha hızlı olabilir. Bu sorun, birisinin standart kitaplığa bir yerine iki işlev eklemesi için yeterli bir nedendi.
jfs

12
Sanırım bu Sebastian'ın amacı - C bellek işlemenin karmaşıklığı / esnekliği nedeniyle, hareketli bellek kadar basit bir şey bile zor.
Martin Beckett

3
Örneğinizin call transformpek bir anlamı yok.
Vladimir F

163

Evet, 1980'de; 2008 yılında? bağlı olmak

Profesyonel olarak programlamaya başladığımda Fortran'ın hız hakimiyeti henüz sorgulanıyordu. Dr. Dobbs'ta bunun hakkında okuduğumu hatırlıyorum ve eski programcılara makaleyi anlattığını - güldüler.

Bu konuda teorik ve pratik olmak üzere iki görüşüm var. Teoride, Fortran'ın bugün C / C ++ 'a ve hatta montaj koduna izin veren herhangi bir dile karşı hiçbir avantajı yoktur. Uygulamada Fortran bugün hala sayısal kod optimizasyonu üzerine inşa edilmiş bir tarih ve kültür mirasının avantajlarından yararlanmaktadır.

Fortran 77'ye kadar ve dahil olmak üzere, dil tasarımı konuları ana odak noktası olarak optimizasyona sahipti. Derleyici teorisi ve teknolojisinin durumu nedeniyle, bu genellikle derleyiciye kodu en iyi duruma getirme konusunda en iyi çekimi sağlamak için özelliklerin ve kapasitenin kısıtlanması anlamına geliyordu . İyi bir benzetme, Fortran 77'yi hız için özellikleri feda eden profesyonel bir yarış arabası olarak düşünmektir. Bu gün derleyiciler tüm dillerde daha iyi hale geldi ve programcı verimliliği için özellikler daha değerli. Bununla birlikte, hala insanların bilimsel hesaplamada hız ile ilgili olduğu yerler vardır; bu insanlar büyük olasılıkla Fortran programcıları olan kişilerden kod, eğitim ve kültürü miras almışlardır.

Bir kod optimizasyonu hakkında konuşmaya başladığında pek çok sorun vardır ve bunun için bir fikir edinmenin en iyi yolu, insanların işi hızlı sayısal koda sahip olmak nerede olduğu pusuda etmektir . Ancak, bu kadar kritik kodların genellikle genel kod satırlarının küçük bir kısmı olduğunu ve çok özel olduğunu unutmayın: Fortran kodunun birçoğu, diğer dillerdeki diğer kodların çoğu kadar "verimsiz" ve optimizasyon bile olmamalıdır böyle bir kodun birincil kaygısı .

Fortran'ın tarihi ve kültürünü öğrenmeye başlamak için harika bir yer wikipedia. Fortran Wikipedia girişi mükemmel ve Fortran topluluğu için değer yaratmak için zaman ve çaba harcayanları çok takdir ediyorum.

(Bu cevabın kısaltılmış hali, tarafından başlatılan mükemmel konuya bir yorum olurdu. Nils ancak bunu yapmak için karmam yok. Aslında, muhtemelen hiçbir şey yazmazdım ama bunun için bu konu gerçekti Bu konudaki ana deneyimim olan alev savaşları ve dil bağnazlığının aksine bilgi içeriği ve paylaşım. Bunalmıştım ve aşkı paylaşmak zorunda kaldım.)


1
bağlantı: web.archive.org/web/20090401205830/http://ubiety.uwaterloo.ca/… artık çalışmıyor. Alternatif bir bağlantı var mı?
nathanielng

64

Fortran bir dereceye kadar derleyici optimizasyonunu göz önünde bulundurarak tasarlanmıştır. Dil, derleyicilerin paralellikten yararlanabileceği tüm dizi işlemlerini destekler (özellikle çok çekirdekli işlemcilerde). Örneğin,

Yoğun matris çarpımı basitçe:

matmul(a,b)

X vektörünün L2 normu:

sqrt(sum(x**2))

Ayrıca FORALL, PUREve ELEMENTALprosedürler gibi ifadeler de kodu optimize etmeye yardımcı olur. Fortran'daki işaretçiler bile bu basit nedenden dolayı C kadar esnek değildir.

Yaklaşan Fortran standardı (2008), paralel kod yazmanıza olanak tanıyan eş dizilere sahiptir. G95 (açık kaynak) ve CRAY derleyicileri zaten destekliyor.

Yani evet Fortran hızlı olabilir çünkü derleyiciler onu C / C ++ 'dan daha iyi optimize edebilir / paralelleştirebilir. Ama yine hayattaki her şey gibi iyi derleyiciler ve kötü derleyiciler var.



1
forallDerleyiciler de optimize kod olabilir çünkü yapı kaldırıldı. Değiştirme do concurrent. Ayrıca, kod sqrt(sum(x**2))verimsiz görünüyor, çünkü derleyici muhtemelen tüm vektörü inşa ediyor x**2. Bir döngünün daha iyi olduğunu tahmin ediyorum, ama şüphesiz içsel norm2işlevi çağırmak en iyisidir .
A.Hennink

39

Buradaki dilleri bilmemenin birçok yanıtı komik. Bu özellikle, eski FORTRAN 77 kodunu açan ve zayıf olanları tartışan C / C ++ programcıları için geçerlidir.

Hız sorununun çoğunlukla C / C ++ ve Fortran arasında bir soru olduğunu düşünüyorum. Büyük bir kodda, her zaman programlayıcıya bağlıdır. Fortran'ın geride bıraktığı dilin bazı özellikleri ve C'nin yaptığı bazı özellikler vardır. 2011'de hiç kimse hangisinin daha hızlı olduğunu söyleyemez.

Dilin kendisi hakkında, Fortran bugünlerde Tam OOP özelliklerini destekliyor ve tamamen geriye dönük uyumlu. Fortran 2003'ü iyice kullandım ve kullanmanın sadece hoş olduğunu söyleyebilirim. Bazı açılardan, Fortran 2003 hala C ++ 'ın arkasındadır ancak kullanıma bakalım. Fortran çoğunlukla Sayısal Hesaplama için kullanılır ve hız nedenlerinden dolayı hiç kimse fantezi C ++ OOP özelliklerini kullanmaz. Yüksek performanslı hesaplamada, C ++ 'nın gidecek neredeyse yeri yoktur (MPI standardına bir göz atın ve C ++' ın kullanımdan kaldırıldığını göreceksiniz!).

Günümüzde, Fortran ve C / C ++ ile karışık dil programlaması yapabilirsiniz. Fortran'da GTK + için bile arayüzler var. Ücretsiz derleyiciler (gfortran, g95) ve birçok mükemmel ticari olanlar var.


8
Lütfen gelecekteki projeler için C ++ 'dan uzaklaşan veya c ++ projelerini başka bir dile yeniden yazan bir kaynak, belirli bir deneyim veya bilimsel enstitü / yüksek performanslı bilgi işlem ajansı ekleyebilir misiniz? Sadece soruyorum çünkü en az iki bilimsel kurum olan Sandia ve CERN'i yüksek performans modellemeleri için c ++ 'ı yoğun olarak kullanan biliyorum. Buna ek olarak Sandia, modelleme yazılımlarından birini (LAMMPS) fortran'dan c ++ 'a dönüştürdü ve bir dizi harika geliştirmeler ekledi.
Zachary Kraus

7
LAMMPS, dilin modern özelliklerinin çoğundan faydalanmayan son derece basit C ++ ile yazılmıştır. C ++ 98'i öğrendikten sonra C bilen Fortran programcılarının yazdığı C ++ 'ı temsil eder. Bu, LAMMPS'nin kötü yazılmış olmadığı anlamına gelmez, sadece HPC'de C ++ için savunurken alıntı yapmak istediğiniz örnek değildir.
Jeff

30

Fortran'ın daha hızlı olmasının birkaç nedeni var. Bununla birlikte, önem verdikleri miktar çok önemsizdir veya herhangi bir şekilde çalışılabilir, önemli olmamalıdır. Bugünlerde Fortran'ı kullanmanın ana nedeni eski uygulamaları korumak veya genişletmektir.

  • Fonksiyonlar üzerinde PURE ve ELEMENTAL anahtar kelimeler. Bunlar yan etkisi olmayan fonksiyonlardır. Bu, derleyicinin aynı işlevin aynı değerlerle çağrıldığını bildiği bazı durumlarda optimizasyonlara izin verir. Not: GCC, dilin bir uzantısı olarak "saf" ı uygular. Diğer derleyiciler de olabilir. Modüller arası analiz de bu optimizasyonu yapabilir ancak zordur.

  • bireysel elemanlarla değil, dizilerle ilgilenen standart fonksiyonlar kümesi. Sin (), log (), sqrt () gibi şeyler skaler yerine diziler alır. Bu, rutinin optimize edilmesini kolaylaştırır.Bu işlevler satır içi veya yerleşikse, otomatik vektörleştirme çoğu durumda aynı yararları sağlar

  • Yerleşik karmaşık tip. Teoride bu, derleyicinin belirli durumlarda belirli talimatları yeniden sıralamasına veya ortadan kaldırmasına izin verebilir, ancak muhtemelen {double re, im; }; C'de kullanılan deyim. Operatörler fortran'daki karmaşık tipler üzerinde çalışırken daha hızlı gelişme sağlar.


1
"ama muhtemelen { double re, im; };C'de kullanılan yapı deyimiyle aynı yararı görürsünüz ". C derleyicileri büyük olasılıkla bu yapıyı sret formunda boşluk arayan ve onu dolduracak olan çembere bir işaretçi ileterek geri döndürür. C99'un bunu özel kompleks durumunda düzelttiğine dikkat edin.
Jon Harrop

Ana nedenine katıldığımdan emin değilim. Ben şahsen diziler ve matematik fonksiyonları kodun en önemli parçası olduğu matematik ağır kod için fortran kullanmayı seviyorum. Ancak birçok devlet kurumunda ve bankada eski kodu korumak veya genişletmek için fortran kullanmaya devam ettiklerini biliyorum. Şahsen ben doktora profesör kod uzatmak için fortran kullandım. komitesi yazdı.
Zachary Kraus

"Bugünlerde Fortran'ı kullanmanın ana nedeni eski uygulamaları korumak veya uzatmaktır" ifadeniz tamamen yanlıştır. Fortran'ın özellikle Matematiksel uygulamalar için sağladığı özelliklere uzaktan bile yakın olan başka bir programlama dili görmedim. Üstün dizi desteği, yerleşik karmaşık aritmetik, saf veya temel işlevler gibi bunlardan birkaçını zaten adlandırdınız - ve daha fazlasını da adlandırabilirim. Yukarıdaki ifadenizin yanlış olduğunu kanıtlamak için tek başına bu yeterlidir.
Pap

28

Bence Fortran'ın lehine olan anahtar nokta, vektör ve dizi tabanlı matematiği ifade etmek için biraz daha uygun bir dil olmasıdır. Yukarıda işaret edilen işaretçi analizi sorunu pratikte gerçek, çünkü taşınabilir kod gerçekten bir derleyiciye bir şey söyleyebileceğinizi varsayamaz. Daima etki alanlarının görünüşüne daha yakın bir şekilde hesaplama hesaplamalarına bir avantaj vardır. C'nin gerçekten dizileri yoktur, yakından bakarsanız, sadece böyle davranan bir şey. Fortran'ın gerçek dizileri var. Bu, özellikle paralel makineler için belirli algoritma türlerinin derlenmesini kolaylaştırır.

Çalışma zamanı sistemi ve çağrı kuralları gibi şeylerin derinliklerinde, C ve modern Fortran, neyin bir fark yaratacağını görmenin zor olduğu konusunda yeterince benzer. Burada C'nin gerçekten temel olduğunu unutmayın C: C ++, çok farklı performans özelliklerine sahip tamamen farklı bir konudur.


25

Bir dilin diğerinden daha hızlı olması diye bir şey yoktur, bu yüzden doğru cevap hayırdır .

Gerçekten sormanız gereken şey, "Fortran derleyici X ile kod derlendiğinde C derleyicisi Y ile derlenen eşdeğer koddan daha mı hızlı?" Bu sorunun cevabı elbette hangi iki derleyiciyi seçtiğinize bağlıdır.

Birinin sorabileceği başka bir soru, "Derleyicilerinde optimizasyon için aynı çaba gösterildiğinde, hangi derleyici daha hızlı kod üretecek?" Bunun cevabı aslında Fortran olacaktır . Fortran derleyicilerinin sertian avantajları vardır:

  • Fortran, bazılarının asla derleyici kullanmayacağına söz verdiği gün Meclis ile rekabet etmek zorunda kaldı, bu yüzden hız için tasarlandı. C esnek olacak şekilde tasarlanmıştır.
  • Fortran'ın niş sayısı çıtırtı. Bu alan adı kodunda asla yeterince hızlı değildir. Dolayısıyla, dili verimli tutmak için her zaman çok fazla baskı olmuştur.
  • Derleyici optimizasyonlarındaki araştırmaların çoğu, Fortran numarası gıcırdama kodunu hızlandırmakla ilgilenen insanlar tarafından yapılır, bu nedenle Fortran kodunu optimize etmek, diğer derlenmiş dilleri optimize etmekten çok daha iyi bilinen bir sorundur ve önce Fortran derleyicilerinde yeni yenilikler ortaya çıkar.
  • Biggie : C, Fortran'dan çok daha fazla işaretçi kullanımını teşvik ediyor. Bu, bir C programındaki herhangi bir veri öğesinin potansiyel kapsamını büyük ölçüde artırır, bu da onları optimize etmelerini çok zorlaştırır. Ada'nın da bu alanda C'den çok daha iyi olduğunu ve yaygın olarak bulunan Fortran77'den çok daha modern bir OO Dili olduğunu unutmayın. C'den daha hızlı kod oluşturabilen bir OO dili istiyorsanız, bu sizin için bir seçenektir.
  • Yine sayısız gıcırdayan niş nedeniyle, Fortran derleyicilerinin müşterileri, C derleyicilerinin müşterilerinden daha fazla optimizasyona önem verme eğilimindedir.

Bununla birlikte, birisinin C derleyicisinin optimizasyonuna tonlarca çaba sarf etmesini ve platformunun Fortran derleyicisinden daha iyi kod üretmesini engelleyen hiçbir şey yoktur. Aslında, C derleyicileri tarafından üretilen daha büyük satışlar bu senaryoyu oldukça uygulanabilir kılıyor


4
Katılıyorum. Ve şunu ekleyebilir miyim? Fortran tanıtıldığında (ilk üst düzey dildi) 60'ların başında 60'ların çoğu ne kadar verimli olabileceğine kuşkuyla yaklaşıyordu. Bu nedenle geliştiricileri Fortran'ın etkili ve yararlı olabileceğini kanıtlamak zorunda kaldılar ve sadece amaçlarını kanıtlamak için "ölüme göre optimize etmeye" hazırlandılar. C daha sonra geldi (70'lerin ortası ile ortası arasında) ve kanıtlamak için hiçbir şey yoktu. Ancak bu zamana kadar çok fazla Fortran kodu yazılmıştı, bu yüzden bilim topluluğu ona yapıştı ve hala öyle. Fortran'ı programlamıyorum ama C ++ 'dan Fortran altyordamlarını çağırmayı öğrendim.
Olumide

3
Derleyici optimizasyonu ile ilgili araştırma düşündüğünüzden daha çeşitlidir. Örneğin, LISP uygulamalarının tarihi, Fortran'dan (meydan okumanın varsayılan yarışmacısı olarak kalır) daha hızlı bir şekilde crunch yapmanın başarılarıyla doludur. Ayrıca, derleyici optimizasyonunun büyük bir kısmı, derleyicinin ara temsillerini hedeflemiştir, bu da anlambilimdeki farklılıkların (takma ad gibi) belirli bir sınıfın herhangi bir programlama dili için geçerli olduğu anlamına gelir.
Hiçbir yerde

2
Fikir çok fazla tekrarlanıyor, ancak bir programlama dili tasarımının doğasında verimlilik için hiçbir sonuç olmadığını söylemek biraz gariptir. Bazı programlama dili özellikleri zorunlu olarak verimsizliklere yol açar, çünkü derleme zamanında mevcut olan bilgileri sınırlarlar.
Praxeolitic

@Praxeolitic - Bu oldukça doğru (bu yüzden böyle bir şey söylemediğim için memnunum).
TED

@TED ​​Dürüst olmak gerekirse, birkaç ay sonra buraya geri dönerek bu cevabı neden cevabınıza bıraktığım hakkında hiçbir fikrim yok. Belki başka bir yerde bırakmak istedim? XP
Praxeolitic

22

Fortran'ın C'den farklı ve potansiyel olarak daha hızlı olduğu başka bir öğe daha var. Fortran'ın C'den daha iyi optimizasyon kuralları vardır. Fortran'da, ifadelerin değerlendirme sırası tanımlanmamıştır, bu da derleyicinin onu optimize etmesine izin verir - eğer belirli bir siparişi zorlamak istiyorsa, parantez kullanmak zorundadır. C sipariş çok daha sıkı, ama "-hızlı" seçenekleri ile, onlar daha rahat ve "(...)" de göz ardı edilir. Bence Fortran ortada güzel bir şekilde uzanıyor. (Bazı değerlendirme sırası değişiklikleri, göz ardı edilmesi gereken veya değerlendirmeyi engelleyen taşmalar meydana gelmemesini gerektirdiğinden, IEEE yaşamı zorlaştırır).

Daha akıllı kuralların bir başka alanı da karmaşık sayılardır. Sadece C 99'un sahip olduğu C 99'a kadar değil, aynı zamanda onları yöneten kurallar Fortran'da daha iyidir; Fortran gfortran kütüphanesi kısmen C dilinde yazıldığından, ancak Fortran semantiğini uyguladığından, GCC ("normal" C programları ile de kullanılabilir) seçeneği kazandı:

-fcx-fortran-kurallar Karmaşık çarpma ve bölme Fortran kurallarına uyar. Aralık azaltma, karmaşık bölünmenin bir parçası olarak yapılır, ancak karmaşık bir çarpma veya bölme sonucunun "NaN + I * NaN" olup olmadığına dair bir denetim yoktur ve bu durumda durumu kurtarmaya çalışır.

Yukarıda belirtilen takma ad kuralları başka bir bonus ve aynı zamanda - en azından prensip olarak - derleyicinin optimize edicisi tarafından düzgün bir şekilde dikkate alınırsa, daha hızlı kod oluşturabilen tüm dizi işlemleri. Aksine, belirli bir işlemin daha fazla zaman alması, örneğin bir kişinin ayrılabilir bir diziye atama yapması gerekiyorsa, gerekli birçok denetim vardır (yeniden tahsis etme? [Fortran 2003 özelliği], dizi adımlarını vb.) basit operasyon perde arkasında daha karmaşık ve böylece daha yavaş, ama dili daha güçlü hale getirir. Öte yandan, esnek sınırlar ve adımlarla dizi işlemleri kod yazmayı kolaylaştırır - ve derleyici genellikle kodu bir kullanıcıdan daha iyi optimize eder.

Toplamda, hem C hem de Fortran'ın eşit derecede hızlı olduğunu düşünüyorum; seçim, hangi dilin daha çok sevdiğini veya Fortran'ın tüm dizi işlemlerini kullanmanın ve daha iyi taşınabilirliğinin daha yararlı olup olmadığı ya da C'deki sistem ve grafik-kullanıcı arayüzü kitaplıklarıyla daha iyi arabirim oluşturmasıdır.


Nan + INan davasında anlamlı bir şekilde "kurtarmak" için ne var? Sonsuzlukları NaN'den farklı kılan, sonsuzlukların imzalanmasıdır. Karmaşık bir işaret verecek karmaşık olmayan sonsuzlukları içeren işlemler NaN verir ve karmaşık sayıların başka türlü yapmaması için hiçbir neden görmüyorum. Biri (DBL_MAX, DBL_MAX) ile (2,2) çarparsa, sonucu kareler ve sonra da kareler, taşma yokluğunda sonucun işareti ne olmalıdır? Bunun yerine ne (1.001, DBL_MAX) ile çarpar? (NaN, NaN) doğru cevap ve sonsuzluk ile NaN'nin herhangi bir kombinasyonunu saçma olarak kabul ediyorum.
supercat

14

Belirli amaçlar için birini diğerinden daha hızlı yapan Fortran ve C dilleri hakkında hiçbir şey yoktur . Bu dillerin her biri için belirli derleyiciler hakkında , bazı görevler için bazılarını diğerlerinden daha uygun hale getiren şeyler vardır .

Uzun yıllar boyunca, sayısal rutinlerinize kara büyü yapabilen Fortran derleyicileri vardı, bu da birçok önemli hesaplamayı inanılmaz derecede hızlı hale getirdi. Çağdaş C derleyicileri de bunu yapamadı. Sonuç olarak, Fortran'da bir dizi büyük kod kütüphanesi büyüdü. Bu iyi test edilmiş, olgun, harika kütüphaneleri kullanmak istiyorsanız, Fortran derleyicisini dağıtırsınız.

Gayri resmi gözlemlerim, bu günlerde insanların ağır hesaplama maddelerini herhangi bir eski dilde kodladıklarını ve eğer biraz zaman alırsa, bazı ucuz hesaplama kümelerinde zaman bulduklarını gösteriyor. Moore Yasası hepimizi aptal yerine koyuyor.


11
Neredeyse bunu yükseltti. Sorun Fortran olmasıdır gelmez bazı doğal avantajlara sahip. Bununla birlikte, bakılması gereken önemli şeyin dil değil, karşılaştırıcı olduğu konusunda oldukça titizsiniz.
TED

14

Fortran, C ve C ++ hızlarını netlib'den klasik Levine-Callahan-Dongarra karşılaştırmasıyla karşılaştırıyorum. OpenMP ile birlikte çoklu dil sürümü http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors C Otomatik çeviri ile başladığı için C daha çirkin, artı belirli bir şekilde kısıtlama ve pragmalar ekleme derleyiciler. C ++, geçerli olduğunda STL şablonlarıyla sadece C'dir. Bana göre, STL, sürdürülebilirliği geliştirip geliştirmediği konusunda karışık bir çanta.

Örnekler, optimizasyonun ne ölçüde iyileştirildiğini görmek için astar içi otomatik işlev için çok az egzersiz vardır, çünkü örnekler astarın içine çok az güven duyulan geleneksel Fortran uygulamasına dayanmaktadır.

En yaygın kullanıma sahip olan C / C ++ derleyicisi, bu kıyaslamaların büyük ölçüde güvendiği otomatik vektörizasyondan yoksundur.

Bundan hemen önce gelen gönderiyi yeniden yazın: Fortran'da daha hızlı veya daha doğru değerlendirme sırasını belirlemek için parantezlerin kullanıldığı birkaç örnek var. Bilinen C derleyicilerinde, daha önemli optimizasyonları devre dışı bırakmadan parantezleri inceleme seçenekleri yoktur.


Takma sorunun üstesinden gelmek için çirkin çeviri gereklidir. İşaretçi olarak uygulanan byref değişkenlerinin kayıt için optimize edilebileceğini söylemek için derleyici sahte değişkenlerini vermelisiniz.
david

12

Ben bir hobici programcıyım ve her iki dilde de "ortalama" dım. Hızlı Fortran kodu yazmak C (veya C ++) kodundan daha kolay buluyorum. Hem Fortran hem de C, (bugün standart olarak) "tarihi" dillerdir, yoğun olarak kullanılmaktadır ve iyi desteklenen ücretsiz ve ticari derleyicilere sahiptir.

Bunun tarihi bir gerçek olup olmadığını bilmiyorum ama Fortran, paralel / dağıtılmış / vektörize / her ne kadar çok sayıda çekirdekse de üretilecek gibi hissediyor. Ve bugün hızdan bahsederken hemen hemen "standart metrik": "ölçekleniyor mu?"

Saf cpu krizi için Fortran'ı seviyorum. IO ile ilgili herhangi bir şey için C ile çalışmayı daha kolay buluyorum (her iki durumda da zaten zor).

Şimdi elbette, paralel matematik yoğun kod için muhtemelen GPU'nuzu kullanmak istiyorsunuz. Hem C hem de Fortran'ın az çok iyi entegre CUDA / OpenCL arayüzü (ve şimdi OpenACC) var.

Benim orta derecede objektif cevap: Eğer her iki dili eşit derecede iyi / kötü biliyorsanız o zaman Fortran daha hızlı olduğunu düşünüyorum çünkü C'den daha paralel / dağıtılmış kod yazmak daha kolay buluyorum (bir kez sen "serbest biçimli" fortran yazabilirsiniz anladım ve sadece katı F77 kodu değil)

İşte beni aşağı indirmek isteyenler için 2. bir cevap, çünkü 1. yanıtı sevmiyorlar: Her iki dil de yüksek performanslı kod yazmak için gerekli özelliklere sahip. Yani uyguladığınız algoritmaya (cpu yoğun? İo yoğun? Bellek yoğun?), Donanıma (tek cpu? Çok çekirdekli? Süper bilgisayar dağıtır mı? GPGPU? FPGA?), Becerinize ve sonuçta derleyicinin kendisine bağlıdır. Hem C hem de Fortran'ın harika bir derleyicisi var. (Fortran derleyicilerinin ne kadar gelişmiş olduğu konusunda ciddi bir şaşkınım ama C derleyicileri de öyle).

Not: Fortran GUI kütüphaneleri hakkında söyleyecek kötü şeylerim olduğu için özellikle kütüphaneleri hariç tuttuğunuza sevindim. :)


11

Birkaç yıl boyunca FORTRAN ve C ile bazı geniş matematik çalışmaları yapıyordum. Kendi tecrübelerime göre, FORTRAN'ın bazen C'den gerçekten daha iyi olduğunu ancak hızı için olmadığını (C'nin uygun kodlama stilini kullanarak FORTRAN kadar hızlı çalışmasını sağlayabilir) değil, LAPACK gibi çok iyi optimize edilmiş kütüphaneler ve büyük paralellik. Benim düşünceme göre, FORTRAN ile çalışmak gerçekten garip ve avantajları bu dezavantajı iptal etmek için yeterince iyi değil, bu yüzden şimdi hesaplamalar yapmak için C + GSL kullanıyorum.


10

Fortran ve C arasındaki herhangi bir hız farkı, derleyici optimizasyonlarının ve belirli derleyici tarafından kullanılan temel matematik kütüphanesinin bir işlevi olacaktır. Fortran'ın C'den daha hızlı olmasını sağlayacak hiçbir şey yoktur.

Her neyse, iyi bir programcı Fortran'ı herhangi bir dilde yazabilir.


@Scott Clawson: -1'ledin ve nedenini bilmiyorum. Bunu düzeltmek için + 1'ledi. Ancak, dikkate alınması gereken bir şey, Fortran'ın ebeveynlerimizin çoğundan daha uzun süredir var olmasıdır. Derleyici çıktısını optimize etmek için çok zaman harcanıyor: D
user7116

Katılıyorum. Paralel olarak çok benzer bir cevap gönderdim.
Uzun Jeff

C'deki işaretçi takma ad sorunu başkaları tarafından gündeme getirildi, ancak programcının bununla başa çıkmak için modern derleyicilerde kullanabileceği birkaç yöntem var, bu yüzden hala katılıyorum.
Uzun Jeff

1
@Kluge: "Fortran'ın C'den daha hızlı olmasını sağlayacak hiçbir şey yok". İşaretçi takma adı, kayıtlarda bileşik değerleri döndürme, yerleşik üst düzey sayısal yapılar ...
Jon Harrop

9

Fortan'ın C'den önemli ölçüde daha hızlı olduğunu duymadım, ancak bazı durumlarda daha hızlı olabilir. Ve anahtar, mevcut dil özelliklerinde değil, (genellikle) olmayanlardadır.

Bir örnek C işaretçileridir. C işaretçileri hemen hemen her yerde kullanılır, ancak işaretçilerle ilgili sorun, derleyicinin genellikle aynı dizinin farklı bölümlerini gösterip göstermediklerini söyleyememesidir.

Örneğin, şuna benzer bir strcpy rutini yazdıysanız:

strcpy(char *d, const char* s)
{
  while(*d++ = *s++);
}

Derleyici, d ve s'nin çakışan diziler olabileceği varsayımı altında çalışmalıdır. Bu nedenle, diziler çakıştığında farklı sonuçlar üretecek bir optimizasyon gerçekleştiremez. Beklediğiniz gibi, bu gerçekleştirilebilecek optimizasyon türlerini oldukça kısıtlar.

[C99, derleyicilere açıkça işaretçilerin örtüşmediğini söyleyen bir "kısıtla" anahtar kelimesine sahip olduğunu belirtmeliyim. Ayrıca Fortran'ın da semantik C'den farklı işaretçiler olduğunu, ancak işaretçilerin C'deki gibi her yerde bulunmadığını unutmayın.]

Ancak C ve Fortran sorununa geri dönersek, bir Fortran derleyicisinin (doğrudan yazılmış) bir C programı için mümkün olmayan bazı optimizasyonları yapabilmesi düşünülebilir. Yani iddia beni çok şaşırtmayacaktı. Ancak, performans farkının o kadar da fazla olmayacağını bekliyorum. [~% 5-10]


9

Hızlı ve basit: Her ikisi de eşit derecede hızlı, ancak Fortran daha basit. Sonunda gerçekten daha hızlı olan şey algoritmaya bağlıdır, ancak yine de önemli bir hız farkı yoktur. 2015 yılında yüksek performanslı bilgi işlem merkezi Stuttgard, Almanya'daki bir Fortran atölyesinde öğrendim. Hem Fortran hem de C ile çalışıyorum ve bu görüşü paylaşıyorum.

Açıklama:

C işletim sistemleri yazmak için tasarlanmıştır. Bu nedenle, yüksek performanslı kod yazmak için gerekenden daha fazla özgürlüğe sahiptir. Genel olarak bu bir sorun değildir, ancak biri dikkatlice programlanmazsa, kodu kolayca yavaşlatabilir.

Fortran bilimsel programlama için tasarlanmıştır. Bu nedenle, Fortran'ın ana amacı olduğu için hızlı kod sözdizimi yazmayı destekler. Kamuoyunun aksine, Fortran modası geçmiş bir programlama dili değildir. En son standardı 2010'dur ve Fortran'da çoğu yüksek performans kodu yazıldığı için düzenli olarak yeni derleyiciler yayınlanmaktadır. Fortran ayrıca derleyici yönergeleri (C pragmas) olarak modern özellikleri desteklemektedir.

Örnek: Bir işleve giriş argümanı olarak büyük bir yapı vermek istiyoruz (fortran: subroutine). İşlev içinde argüman değiştirilmez.

C, hem referans ile çağrı hem de değere göre çağrı ile desteklenir, ki bu kullanışlı bir özelliktir. Bizim durumumuzda, programcı yanlışlıkla değere göre çağrı kullanabilir. Bu, yapının önce bellek içine kopyalanması gerektiğinden işleri önemli ölçüde yavaşlatır.

Fortran, sadece referans ile çağrılarak çalışır, bu da programcıyı gerçekten değer üzerinden bir çağrı yapmak istiyorsa yapıyı elle kopyalamaya zorlar. Bizim durumumuzda fortran otomatik olarak referans ile çağrı ile C versiyonu kadar hızlı olacaktır.


C dilinde yerel bir paralel uygulama yazabilir misiniz (yani herhangi bir kütüphaneyi çağırmadan?). Hayır. Fortran'da yerel bir paralel uygulama yazabilir misiniz? Evet, birkaç farklı şekilde. Ergo, Fortran "daha hızlı". Her ne kadar adil olmak gerekirse, yorumunuzu yazdığınızda 2010 yılında, Fortran'ın paralel do ve ortak dizi özellikleri için destek şu anki kadar yaygın değildi.
Mali Remorker

@MaliRemorker Bunu 2016'da değil, 2010'da yazdı.
Kowalski

Paralel süreçler yaratmanın yükü bence 'hızlı' olarak adlandırılan bir programlama dili için en uygun faktör değildir. Daha alakalı olan, performansa uymayan bir kod huzuru gibi pratik hususlardır. Bu nedenle, bir kez zaman kazanırsanız (paralel işlemi oluştururken) ve daha sonra birden çok çekirdeğe harcarsanız hiçbir şey yardımcı olmaz. 'Hızlı' terimi, paralel olmayan kodları da dikkate almalıdır. Bu nedenle benim açımdan bir argüman göremiyorum. Belki yorumunuz bağımsız bir cevaptı?
Markus Dutschke

8

Genel olarak FORTRAN, C'den daha yavaştır. C, programlayıcının el ile optimize etmesine izin veren donanım seviyesi işaretçileri kullanabilir. FORTRAN'ın (çoğu durumda) bilgisayar korsanlığı adresleme donanım belleğine erişimi yoktur. (VAX FORTRAN başka bir hikaye.) 70'lerden beri FORTRAN'ı açıp kapadım. (Gerçekten mi.)

Bununla birlikte, 90'lı yıllardan başlayarak FORTRAN, çok çekirdekli bir işlemci üzerinde gerçekten çığlık atabilecek doğal olarak paralel algoritmalara optimize edilebilen belirli dil yapılarını içerecek şekilde gelişti . Örneğin, otomatik Vektörleştirme, birden çok işlemcinin bir veri vektöründeki her öğeyi aynı anda işlemesine izin verir. 16 işlemci - 16 eleman vektör - işleme 1/16 kez alır.

C'de, kendi iş parçacıklarınızı yönetmeniz ve çoklu işleme için algoritmanızı dikkatlice tasarlamanız ve paralelliklerin düzgün bir şekilde gerçekleştiğinden emin olmak için bir grup API çağrısı kullanmanız gerekir.

FORTRAN'da, algoritmanızı çoklu işleme için dikkatlice tasarlamanız yeterlidir. Derleyici ve çalışma süresi gerisini sizin için halledebilir.

Yüksek Performanslı Fortran hakkında biraz okuyabilirsiniz , ancak birçok ölü bağlantı bulursunuz. Paralel Programlama ( OpenMP.org gibi ) ve FORTRAN'ın bunu nasıl desteklediği hakkında daha iyi bilgi edinebilirsiniz .


6
@ S.Lott: C kodunun burada yazdığımız kodların çoğu için Fortran kadar iyi görünmek zorunda kalacağını hayal bile edemedim ... ve ben bir C programcısıyım. Fortran'da daha basit koddan daha iyi performans elde edersiniz. Siz ya da ben bir karşı örnek bulamadık. : D
user7116

2
@Greg Rogers: Sorununu ben değil Fortran Vectorization insanlarıyla ele almalısın. Sadece okuduğumu rapor ediyorum. polyhedron.com/absoftlinux
S.Lott

2
-1 // "Genellikle FORTRAN C'den daha yavaştır. Bu neredeyse her şey için geçerlidir." neden? // Fortran vs C'de çoklu iş parçacığı kullanımının kolaylığına dayanan bir argüman performans hakkında bir şey söylemiyor.
steabert

4
@ S.Lott: "çoklu iş parçacığı yalnızca performans için var". Hata.
Jon Harrop

4
@ S.Lott: "C'nin neredeyse donanım düzeyinde işaretçiler kullanması, C'nin Fortran'dan daha hızlı olmasını sağlar". Err, hayır
Jon Harrop

5

Daha hızlı kod gerçekten dile değil, derleyicidir, bu nedenle bir ".exe" içinde birbirine bağlanmış şişirilmiş, daha yavaş ve gereksiz nesne kodu üreten ms-vb "derleyicisini" görebilirsiniz, ancak powerBasic çok yol üretir daha iyi kod. C ve C ++ derleyicileri tarafından yapılan nesne kodu bazı aşamalarda (en az 2) üretilir, ancak tasarım gereği çoğu Fortran derleyicisinin yüksek seviye optimizasyonları da dahil olmak üzere en az 5 fazı vardır, bu nedenle tasarımla Fortran her zaman yüksek düzeyde optimize edilmiş kod üretme yeteneğine sahip olacaktır. Sonunda derleyici sormanız gereken dil değil, bildiğim en iyi derleyici Intel Fortran Derleyici'dir, çünkü LINUX ve Windows'da alabilir ve IDE olarak VS'yi kullanabilirsiniz. ucuz tigh derleyici sen OpenWatcom her zaman geçiş yapabilirsiniz.

Bu konuda daha fazla bilgi: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html


3

Fortran daha iyi I / O rutinlerine sahiptir, örneğin zımni do tesis C'nin standart kütüphanesinin karşılayamayacağı esneklik sağlar.

Fortran derleyicisi daha karmaşık sözdizimini doğrudan işler ve bu sözdizimi kolayca argüman geçiş formuna indirgenemeyeceğinden, C bunu verimli bir şekilde uygulayamaz.


1
Fortran'ın I / O için C'yi dövdüğünü gösteren testleriniz var mı?
Jeff

3

Modern standartlar ve derleyici kullanarak, hayır!

Buradaki bazı kişiler FORTRAN'ın daha hızlı olduğunu öne sürdüler çünkü derleyicinin takma ad konusunda endişelenmesine gerek yok (ve bu nedenle optimizasyon sırasında daha fazla varsayım yapabilir). Ancak, kısıtlama anahtar kelimesinin dahil edilmesiyle C99 (sanırım) standardından bu yana C'de ele alınmıştır. Temel olarak derleyiciye, bir verme kapsamı içinde işaretçinin takma adı olmadığını söyler. Ayrıca C, örtüşme gibi şeylerin performans ve kaynak tahsisi açısından çok yararlı olabileceği uygun işaretçi aritmetiğini mümkün kılar. Her ne kadar FORTRAN'ın daha yeni bir versiyonunun "uygun" işaretçilerin kullanılmasına izin verdiğini düşünüyorum.

Modern uygulamalar için C genel FORTRAN'dan daha iyi performans gösterir (çok hızlı olmasına rağmen).

http://benchmarksgame.alioth.debian.org/u64q/fortran.html

DÜZENLE:

Bunun adil bir eleştirisi, kıyaslamanın önyargılı olabileceğidir. Daha fazla sonuç veren başka bir kaynak (C'ye göre):

http://julialang.org/benchmarks/

C'nin çoğu durumda tipik olarak Fortran'dan daha iyi performans gösterdiğini görebilirsiniz (yine burada da geçerli olan eleştirilere bakın); Diğerlerinin de belirttiği gibi, kıyaslama, bir dili diğerlerine tercih etmek için kolayca yüklenebilen yanlış bir bilimdir. Ancak Fortran ve C'nin nasıl benzer performansa sahip oldukları bağlamını ortaya koyuyor.


4
Fortran hakkında hala FORTRAN olduğunu varsayan bir yazıya inanmak aptallık olur. Bu 25 yıldan fazla bir süre önce değişti. Bu testler dilleri karşılaştıramaz, çünkü hem Intel hem de GCC'nin hem C hem de Fortran için derleyicileri olmasına rağmen farklı satıcıların derleyicilerini kullanırlar. Bu nedenle bu karşılaştırmalar değersizdir.
Vladimir F

2

Fortran diziyi, özellikle çok boyutlu dizileri çok rahat bir şekilde işleyebilir. Fortran'da çok boyutlu dizinin dilimleme elemanları, C / C ++ 'dan çok daha kolay olabilir. C ++ artık Boost veya Eigen gibi işi yapabilen kütüphanelere sahiptir, ancak hepsi harici kütüphanelerden sonradır. Fortran'da bu işlevler içseldir.

Fortran'ın geliştirme için daha hızlı veya daha uygun olup olmadığı çoğunlukla bitirmeniz gereken işe bağlıdır. Jeofizik için bilimsel bir hesaplama kişisi olarak, hesaplamaların çoğunu Fortran'da yaptım (modern Fortran,> = F90).


1
Ayrıca Fortran'ın daha hızlı olup olmayacağına da bağlıdır: kullandığınız derleyici (önemli!), Koda uygun paralelleştirme uygulayıp uygulamadığınıza ve kodunuzun nasıl yazıldığına dair hesaplama işleri için.
Kai

1

Bu biraz özneldir, çünkü derleyicilerin kalitesine ve diğer her şeyden daha fazlasına girer. Bununla birlikte, sorunuzu daha doğrudan cevaplamak için, bir dil / derleyici bakış açısından, C üzerinde Fortran hakkında onu C'den doğal olarak daha hızlı veya daha iyi yapacak hiçbir şey yoktur. Ağır matematik işlemleri yapıyorsanız, derleyicinin kalitesi, her dilde programcının becerisi ve belirli bir uygulama için hangisinin daha hızlı olacağını belirlemek için bu işlemleri destekleyen iç matematik destek kütüphaneleri.

DÜZENLEME: @Nils gibi diğer insanlar, C'de işaretçi kullanımındaki fark ve C'de belki de en naif uygulamaları yavaşlatan örtüşme olasılığı konusunda iyi bir noktaya işaret ettiler. Bununla birlikte, C99'da bununla başa çıkmanın yolları var , derleyici optimizasyon bayrakları ve / veya C'nin gerçekte nasıl yazıldığını gösterir. Bu @Nils yanıtı ve onun cevabını takip eden yorumlarda iyi bir şekilde ele alınmıştır.


Bir algoritmanın karşılaştırma testi gibi geliyor. Hangisi daha az zaman alır, FORTRAN veya C? Bana öznel gelmiyor. Belki bir şey eksik.
S.Lott

1
Katılmıyorum. Dilleri değil, derleyicileri karşılaştırıyorsunuz. Asıl soru, DİL ile ilgili olarak onu daha iyi yapan bir şey olup olmadığını düşünüyorum. Buradaki diğer cevaplar, bazı şüpheli farklılıkların içine giriyor, ancak bence en çok gürültüye katıldıklarını kabul ediyoruz.
Uzun Jeff

Bu algoritmaların O (n) analizi değildir. Performans. Performansın nasıl varsayımsal bir uygulamadan bağımsız bir kavram olabileceğini görmeyin. Sanırım bir şey eksik.
S.Lott

1
-1: "Fortran'ın C üzerinde doğası gereği C'den daha hızlı veya daha iyi olmasını sağlayacak hiçbir şey yok". Hata.
Jon Harrop

0

Mesajların çoğu zaten ikna edici argümanlar sunuyor, bu yüzden sadece meşhur 2 senti farklı bir yöne ekleyeceğim.

Sonunda işlem gücü açısından daha hızlı veya daha yavaş olmak, ancak Fortran'da bir şey geliştirmek için 5 kat daha fazla zaman alırsa, çünkü:

  • saf sayı gıcırtısından farklı görevler için iyi bir kütüphaneden yoksundur
  • dokümantasyon ve birim testi için uygun araçlardan yoksundur
  • çok düşük bir ifadeye sahip bir dildir, kod satırlarının sayısını arttırır.
  • iplerin çok kötü işlenmesi
  • sizi çıldırtan farklı derleyiciler ve mimariler arasında çok fazla sorun var.
  • çok zayıf bir IO stratejisine sahiptir (sıralı dosyaların READ / WRITE. Evet, rasgele erişim dosyaları var, ancak bunların kullanıldığını gördünüz mü?)
  • iyi geliştirme uygulamalarını, modülerleşmeyi teşvik etmez.
  • tamamen standart, tam uyumlu bir açık kaynak derleyicisinin etkili eksikliği (hem gfortran hem de g95 her şeyi desteklemez)
  • C ile çok zayıf birlikte çalışabilirlik (mangling: bir alt çizgi, iki alt çizgi, alt çizgi yok, genel olarak bir alt çizgi, ancak başka bir alt çizgi varsa iki.

O zaman sorun önemsizdir. Bir şey yavaşsa, çoğu zaman belirli bir sınırın ötesinde geliştiremezsiniz. Daha hızlı bir şey istiyorsanız algoritmayı değiştirin. Sonunda bilgisayar zamanı ucuz. İnsan zamanı değildir. İnsan zamanını azaltan seçime değer verin. Bilgisayar zamanını arttırırsa, yine de uygun maliyetlidir.


3
fortrans avantajları / dezavantajlarının diğer dillere karşı tartışmasına ilginç bir nokta eklemenize rağmen (tamamen katılmıyorum), bu gerçekten sorunun cevabı değil ...
steabert

@steabert: aslında dedimI will just add the proverbial 2 cents to a different aspect
Stefano Borini

1
Nitpicky olmayan bir cevap için benden +1. Söylediğiniz gibi, Fortran bazı nadir görevlerde daha hızlı olabilir (kişisel olarak görmediniz). Ancak sürdürülemez bir dili korumak için harcadığınız zaman, olası bir avantajı mahveder.
André Bergner

10
-1. Fortran'ı F77 açısından düşünüyorsunuz. Bunun yerini F90, F95, F03 ve F08 aldı.
Kyle Kanos

4
Sadece bir ödünleşmenin bir tarafı hakkında konuştuğu için indirildi. Geliştirme hızı çoğu genel programlama için önemli olabilir, ancak bu onu tek geçerli değiş tokuş yapmaz. Fortran programcıları genellikle dilin sadeliğine değer veren bilim adamları / mühendislerdir (FORmula TRANslation'ın öğrenilmesi ve ustalaşması son derece kolaydır. C / C ++ değildir ), mükemmel kütüphaneler (genellikle diğer dillerden kullanılır) ve hız (örn. Hava simülasyonları) Fortran'da günler sürer, ancak tamamen diğer dillerde yazılmışsa aylar).
BraveNewCurrency

-3

Fortran geleneksel olarak -fp: strict gibi seçenekler ayarlamaz (bu ifort, f2003 standardının bir parçası olan USE IEEE_aritmetik'te bazı özelliklerin etkinleştirilmesini gerektirir). Intel C ++ da varsayılan olarak -fp: katı ayarlamaz, ancak ERRNO kullanımı için gereklidir ve diğer C ++ derleyicileri ERRNO'yu kapatmayı veya simd azaltma gibi optimizasyonları elde etmeyi uygun hale getirmez. gcc ve g ++, -O3 -ffast-math -fopenmp -march = native tehlikeli kombinasyonunu kullanmaktan kaçınmak için Makefile'yi kurmamı istedi. Bu sorunların dışında, göreceli performansla ilgili bu soru daha az seçici ve derleyici ve seçeneklerin seçimi hakkındaki yerel kurallara bağlı.


Son gcc güncellemeleri sorunu Openmp ve fast-math kombinasyonu ile düzeltti.
tim18

Bu cevap gerçekten kullanıcıların derleyicileri için varsayılan bayrakları anlamadığı, dillerin kendileri değil.
Jeff
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.