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.