it-swarm.dev

Yüksek performanslı bilgi işlemde en çok kullanılan programlama dili nedir? Ve neden?

HPC'de çok fazla Fortran kullanıldığına inanıyorum, ancak bunun sadece eski nedenlerden emin değilim.

Çöp toplama veya çalışma zamanı polimorfizmi gibi modern programlama dillerinin özellikleri, hızın önemli olduğu için HPC için uygun değildir, bu nedenle C # veya Java veya C++ 'ın nereden geldiğinden emin değilsiniz.

Düşüncesi olan var mı?

25
Fanatic23

Java (1) çok az eski kod ve (2) geliştirme süresi ve kod kalitesi önemli olduğu alanlarda HPC için kullanılan) çok gördüm. Tipik uygulama alanları finans, veri madenciliği veya biyo-bilişim.

Gerçekten uygulamaya bağlıdır (doğrusal cebir dışında yaşam vardır), ancak son JVM'lerin performansı genellikle C kodu ile eşittir. JVM çalışma zamanında statik derleyicilerin (C, Fortran) yapamayacağı akıllı optimizasyonlar gerçekleştirebildiğinde bazen daha hızlıdır. Ve çok fazla sembolik hesaplama olduğunda kesinlikle daha hızlı.

Program geliştirme için sabit süre verildiğinde, sonuçta elde edilen Java kodu C kodundan sürekli olarak daha hızlıdır. Java kodun sık sık geliştirildiği veya değiştirildiği zaman kesinlikle mantıklıdır.Başka bir önemli özellik de farklı donanımlar üzerinde kod hareketliliğidir.

Referansları http://ateji.blogspot.com/2010/09/Java-for-high-performance-computing.html adresinde bulabilirsiniz.

Fortran'ın iki adresin benzersiz olduğu varsayımıyla ilgili olarak, üst düzey dillerde kod için benzer optimizasyonları sağlayacak, ancak "Kötü Şeyler Olabilir" biti olmadan statik bir analiz aracı üzerinde çalışıyoruz. İlgileniyorsanız bana ulaşın.

11
Patrick Viry

Yıllar süren deneyimimde, 5 yıla kadar, her zaman Fortran ve C olmuştur. Hangisi daha çok insanların mühendislik okulundan mı yoksa CS düşünce okulundan daha fazlasından mı geldiğine bağlıydı (I nasıl daha iyi koymak bilmiyorum, tamam mı?: -)

Yaptığımız şeyde Fortran neredeyse tamamen kullanılıyordu.

Bugünlerde okuduğum kadarıyla, Standart F2003/08'deki yeni güncellemelerle ve Co-Arrays'ın tanıtımı ile tekrar ivme kazanıyor gibi görünüyor.

Ayrıca, biri, biraz önyargılı değilse - İdeal HPC Programlama Dili

31
Rook

Bence metalin gerçek pedalı için tek gerçek seçenek Fortran. Bunun nedeni, düşük seviyeli ILP'nin (Öğretim Düzeyi Paralizmi) sömürülmesi için en önemli şeyin, bellek adresi belirsizlikidir. Fortran'daki defacto kuralları, derleyicinin iki adresin benzersiz olduğunu belirlemesine izin verir (ve dolayısıyla yüklerin ve depolamanın sırası, hatta mağazalar ve mağazalar yanlış kod oluşturma riski olmadan değiştirilebilir). C, derleyicinin koddan çok düşük düzeyde paralellik elde etmesi için örtüşen işaretçiler için çok fazla alan bırakıyor.

Ayrıca, dizi hizalama, w.r.t önbellek satırları ve SSE/AVX sınırları etkin döngülerin oluşturulması ve yürütülmesi için önemlidir. Diziler ortak bloklar üzerinden geçirilirse, derleyici/yükleyici tüm dizilerin aynı adres hizalama sınırlarında başlamasını ve daha verimli SSE/AVX yüklerinin ve depolarının kullanılabilmesini sağlayabilir. Daha yeni donanım, hizalanmamış bellek erişimlerini işleyebilir, ancak bellek erişimi düzgün hizalanmadığından önbellek hatlarının kısmi kullanımı daha düşük performansla sonuçlanır. Bir C programcısı tüm dizilerini düzgün bir şekilde hizalasa bile, bunu derleyiciye iletmek için bir mekanizma var mı?

Özetlemek gerekirse, en önemli iki konu bellek adreslerinin bağımsızlığı ve derleyici tarafından erişilen veri yapılarının donanımın istediği aynı "doğal" hizalamaya sahip olduğunun tanınmasıdır. Fortran şu ana kadar bu iki görevde en iyi işi yapıyor.

16
Omega Centauri

Sadece anekdot bir not. Kendimi hesaplamada hiçbir yüksek performans yapmadım.

Hesaplamalar (sayı gevrekliği), Fortran ve C. için Evet, eski nedenlerden dolayı:

  • Kamu malı kaynak kodu ve tariflerin geniş kullanılabilirliği.
  • Her ikisi de [~ # ~] mpi [~ # ~] .
  • Her iki dil de derlenmiştir.
  • Her iki dil için derleyiciler tüm HPC işletim sistemleri ve satıcılar tarafından sağlanır.
  • Vektörleştirici derleyiciler mevcuttur.
  • Her ikisi de farklı bir kümeye (farklı bellek boyutu, CPU sayısı vb.) Taşındığında yüksek performans elde etmek için çılgınca tweaking gerektirir
    • Bu aslında açık kaynak kodunun neden önemli olduğunu açıklıyor: ince ayar gerekli, bu nedenle orijinal tarif manuel ayarlama için iyi bir dilde yazılmalıdır.

Sayı sıkışıklığı için mevcut eğilim, küme özellikleri göz önüne alındığında performansı optimize etmek için kaynak kodu ayarını otomatikleştiren program jeneratörleri yazmaktır. Bu jeneratörler genellikle C cinsinden üretilir.

İkinci eğilim, belirli GPU'lar veya Hücre BE için bazı özel C lehçelerinde yazmaktır.

Veritabanından veri işleyen programlar (ancak veritabanının kendisi değil) gibi sayısal olmayan işler için, pahalı özel ağ ekipmanları olmadan "emtia" makineleri kümeleri üzerinde çalışmak çok daha ucuzdur. Buna genellikle "Yüksek Performanslı Hesaplama" denir. Ve Python burada # 1 dildir (ünlü Harita Azalt kullanarak). Python'dan önce, toplu işleme projeleri herhangi bir dilde yazılabilir ve genellikle Condor .

15
rwong

Ben (gasp!) C # bazı ÇOK hesaplama yoğun kod üzerinde çalışıyorum.

Optik modelleme için FDTD GPGPU uygulaması oluşturuyorum. Küçük (128 işlemci) bir kümede, simülasyonlarımızın çoğunun çalışması haftalar sürer. Bununla birlikte, GPU uygulamaları yaklaşık 50 kat daha hızlı çalışma eğilimindedir - ve bu tüketici sınıfı NVidia kartındadır. Şimdi iki GTX295 çift işlemcili kart (birkaç yüz çekirdekli) bulunan bir sunucumuz var ve yakında bazı Teslas alıyoruz.

Bu sizin dilinizle nasıl ilgilidir? Daha önce kullandığımız C++ FDTD kodunun CPU'ya bağlı olması gibi, bunlar da GPU'ya bağlıdır, bu nedenle ( çok küçük beygir gücü farkı yönetilen vs yerel kod hiçbir zaman devreye girmez. C # uygulaması bir iletken gibi davranır - OpenCL çekirdeklerini yükler, GPU'lara ve GPU'lardan veri aktarır, kullanıcı arabirimi sağlar, raporlama vb. - C++ 'da kıçta acı olan tüm görevler.

Geçmiş yıllarda, yönetilen ve yönetilmeyen kod arasındaki performans farkı, bazen C++ 'ın korkunç nesne modelini hızın ekstra yüzde birkaçını elde etmeye değecek kadar önemliydi. Bu günlerde, C++ ve C # geliştirme maliyetleri çoğu uygulama için avantajlardan çok daha ağır basmaktadır.

Ayrıca, performans farkınızın çoğu dil seçiminizden değil, geliştiricinizin becerisinden gelecektir. Birkaç hafta önce, üç bölmeli (3B dizi geçişi) döngüsünün içinden tek bir bölme işlemini taşıdım, bu da belirli bir hesaplama alanı için yürütme süresini% 15 oranında azalttı. Bu, işlemci mimarisinin bir sonucudur: bölme yavaştır, bu da ihtiyacınız olan yüzlerden biridir.

4
3Dave

Fortran en yaygın olanıdır, esas olarak miras (hala eski kod çalıştırır) ve aşinalık (HPC yapan çoğu insan diğer dillere aşina değildir) nedeniyle.

Çöp toplama veya çalışma zamanı polimorfizmi gibi modern programlama dillerinin özellikleri, hızın önemli olduğu için HPC için uygun değildir, bu yüzden C # veya Java veya C++ 'in nereden geldiğinden emin değildir.

Bu genel olarak doğru değil. Klasik HPC çoğunlukla makine hassas sayıları ile lineer cebir yapıyordu. Bununla birlikte, modern HPC, süper hassas bilgisayarları, makine hassas sayıları yerine rasgele matematiksel ifadelere sahip sembolik hesaplamalar gibi, daha geniş bir çeşitlilik için kullanıyor. Bu, kullandığınız araçlara oldukça farklı özellikler yerleştirir ve Fortran dışındaki programlama dillerini kullanmak nadir değildir, çünkü sembolik hesaplama GC ve OCaml'ın optimizasyon kalıbı eşleme derleyicisi gibi diğer optimizasyon derleyicileri olmadan yasaklanabilir.

Örneğin, Fischbacher ve arkadaşlarının adlı bu çalışma "yazarların bunun iyi olabileceğine inanmak için güçlü bir nedeni vardır. "şu ana kadar yapılan en büyük sembolik hesaplama".

3
Jon Harrop

Fortran, bazı iyi ve iyi olmayan nedenlerle. Ağır matematik krizi için, iyi bir neden, hepsi Fortran'da yazılmış (C ve C++ 'dan çağrılabilir) olsa da, denenmiş ve gerçek alt programların geniş kütüphaneleri (BLAS, LAPACK) olmasıdır.

Pek iyi olmayan bir neden, Fortran'ın C/C++ 'a göre varsayılan performans avantajıdır. Optimize ediciler oldukça iyi ve birkaç kişi bir kod parçasını optimize etmenin faydasının meşgul olduğu zaman yüzdesi ile orantılı olduğunu anlıyor ve bu neredeyse tüm kodlarda neredeyse sıfır.

İyi olmayan bir başka neden de CS ve CS olmayan programcılar arasındaki bir kültür boşluğudur. Bilimsel programcılara Fortran'da kötü alışkanlıklar öğretme eğilimi ve CS programcılarına ve kötü alışkanlıklara bakma eğilimi vardır onlar öğretilmiştir ve öncekine bakmaktadır.

3
Mike Dunlavey

Temel olarak, sayı çıtırtılarının gerçek işini yapan tüm programlar hala FORTRAN (eski blas, lapack, arnoldi vb. Hala kullanılan programlardır) ... Ancak, daha yüksek seviyeli yapı söz konusu olduğunda ... insanlar giderek daha fazla kullanıyor C++.

Simülasyonun karmaşıklığı çok büyük kodlar içerir ve birinden yazmaktan herhangi bir fayda elde etmek onu yeniden kullanılabilir hale getirmektir. Ayrıca, kullanılan kavramlar da çok karmaşık hale gelmiştir. Bu bilgiyi FORTRAN kullanarak temsil etmek neredeyse delilik. C++, Nesneye Dayalı Tasarımı doğal olarak desteklediği için burada devreye girer. Bununla birlikte, Çalışma Zamanı Polimorfizmi nadiren tercih edilir. Bunun yerine insanlar hemen hemen her zaman Statik Polimorfizmi kullanırlar (şablon meta-programlama ile C++ 'da uygulanır)

Ayrıca, derleyiciler gerçekten iyi, bu yüzden derleyicilere çok fazla optimizasyon kaldı.

2
user27946

HPC uygulamalarında ele alınması gereken iki tür sorun vardır: biri sayının kendisinin çatırdaması, diğeri de hesaplamaların yönetilmesidir. Birincisi genellikle Fortran, C veya C++ 'da yazılan kodla hız nedeniyle ve bu dillerde yazılmış birçok bilimsel algoritma olduğu için yaklaşılıyor. Hesaplamaların yönlendirilmesi, daha üst düzey dillerde daha uygun bir şekilde uygulanmaktadır. Python, derlenmiş dillerde uygulanan uygulama mantığını ve arama uzantılarını işlemek için kullanılan "tutkal" bir dildir. Java ağ iletişimini yöneten projeler tarafından sıklıkla kullanılır ve dağıtılmış bilgi işlem esastır.

1
j..