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


25

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

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

Düşüncesi olan var mı?


9
C ++ çöp toplayıcısına sahip değildir ve çalışma zamanı polimorfizmi kullanmanızı gerektirmez.
Jason Baker,

@Jason Niyetim, C ++ 'nın hangi özelliklerinin onu HPC için çekici bir durum haline getirdiğini bulmak.
Fanatic23

@ Fanatic23 - Anladım. Sadece bunu not etmek istedim. :-)
Jason Baker,

1
@Fanatic Dilek Evet diyebilirdim, ama çok fazla bir şeyim yok ... Yine de .NET / işlevsel dillerdeki bazı performans sorunlarıyla ilgili bir sürü bağlantım var. Bazı performans sınırlamalarını kavramak için kavramları zihinsel olarak bir araya getirebilirsiniz: msdn.microsoft.com/en-us/library/0xy59wtx.aspx stackoverflow.com/questions/2909282/… msdn.microsoft.com/tr -us / magazine / cc163329.aspx en.wikipedia.org/wiki/Just-in-time_compilation
Rei Miyasaka

1
Bence, eğer gerçekten iyi bir tepki süresine ihtiyacınız varsa, aradığınız şey QNX gibi gerçek zamanlı bir işletim sistemidir: en.wikipedia.org/wiki/QNX
Rei Miyasaka

Yanıtlar:


11

(1) çok az eski kodun olduğu alanlarda (2) geliştirme süresi ve kod kalitesinin önemli olduğu alanlarda HPC için çok fazla Java kullandım. Tipik uygulama alanları finans, veri madenciliği veya biyo-bilişimdir.

Gerçekten uygulamaya bağlı (doğrusal cebir dışında hayat var), ancak son JVM'lerin performansı genellikle C koduyla aynı. JVM, statik derleyicilerin (C, Fortran) yapamadığı akıllıca optimizasyonlarda çalışma zamanında performans gösterdiğinde bazen daha hızlıdır. Ve çok fazla sembolik hesaplama olduğunda kesinlikle daha hızlı.

Program geliştirme için belirli bir süre göz önüne alındığında , ortaya çıkan Java kodu C kodundan sürekli olarak daha hızlıdır. Java'daki HPC, kodun sık sık geliştirildiği veya değiştirildiği zaman kesinlikle anlamlıdır. Bir diğer önemli özellik, 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ına gelince, ü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.


14
Nitpick: Küçük bir çalışma yapmak istiyorsanız, JIT optimizasyonları statik derleyiciler için kullanılabilir. Hem GCC hem de MS Visual Studio, kaydedilen çalışma zamanı verilerini kullanarak optimize eden Profil Kılavuzlu Optimizasyonları destekler. "Statik derleyicilerin (...) yapamayacağı" optimizasyonları olduğunu söylemek biraz yanıltıcı olabilir.
Corbin,

4
Bunun neden cevap olarak kabul edildiğini bilmiyorum, bu yazıda hiçbir şey gerçekliğin kesinliğini taşımaz. C tabanlı diller, her zaman Java'dan daha iyi performans gösterecektir, çünkü Java, kendiliğinden başka bir dile bağlı Sanal makinedir. Ayrıca, Java'da elde edebileceğiniz her şeyi, daha az ek yük ile C'de elde edebilirsiniz. C tabanlı diller 'performans' dili olmayı asla bırakmaz.
Mike,

31

Yılların tecrübesine göre, 5 yıl öncesine kadar her zaman Fortran ve C olmuştur. Hangisi daha çok insanların mühendislikten mi yoksa daha çok CS düşünce okulundan mı geldiğine bağlıydı (bunu nasıl daha iyi koyacağımı bilmiyorum) , tamam mı? :-)

Yaptıklarımızda Fortran neredeyse sadece kullanılmış.

Bugünlerde okuduklarımdan, Standard F2003 / 08’deki yeni güncellemeler ve Co-Arrays’in tanıtımıyla birlikte, yeniden ivme kazanıyor gibi görünüyor.

Ayrıca, bir, biraz yanlı değilse makale - İdeal HPC Programlama Dili


16

Sanırım metale olan gerçek pedal için, tek gerçek seçenek Fortran. Sebep, düşük seviyeli ILP'nin (Öğretim Düzeyi Parallism) sömürülmesi için en önemli şeyin hafıza adresindeki belirsizliklerin olmasıdır. Fortran'daki defacto kuralları derleyicinin iki adresin benzersiz olduğunu belirleyebilmesine izin verir (ve böylece yüklerin ve depoların, hatta mağazaların ve mağazaların bile yanlış kod üretme riski olmadan değiştirilebilir). C, derleyicinin koddan çok düşük düzeyde paralellik çıkarması için çakışan işaretçilere fazla yer bırakmaz.

Ayrıca, dizi hizalaması, wrt önbellek çizgileri ve SSE / AVX sınırları, verimli 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ı sağlayabilir ve daha verimli SSE / AVX yükleri ve depoları kullanılabilir. Yeni donanım, hizalanmamış hafıza erişimlerini idare edebilir, ancak hafıza erişimi düzgün bir şekilde hizalanmadığından önbellek hatlarının kısmen kullanılması daha düşük performansa neden olur. Bir C programcısı tüm dizilerini düzgün bir şekilde hizalasa bile, bunu derleyiciye iletme mekanizması 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.


2
Geçenlerde küçük bir deney yaptım, 64000 bitlik bir dizgenin pop sayısını, imzasız uzun ve uzun bir dizi olarak temsil edildi. Aynı ilginç algoritmayı bir sürü ilginç boole ve paketlenmiş aritmetik kullanarak kullandım. -O3'lü C'de uzun süre boyunca saat 10'da bir süre aldı; Fortran Intel Fortran 10.1'de ise varsayılan optimizasyon 6.5 idi! Ve her programcının C’nin biraz titremesi için üstün olduğunu düşünmesi! Fortran defacto varsayımları daha verimli düşük seviye komut kodlamasının güvenli bir şekilde oluşturulmasını sağlar.
Omega Centauri,

4
Bu, "Fortran'daki defacto kuralları derleyicinin iki adresin benzersiz olduğunu ... ASSUME yapmasına izin veriyor" şeklinde okunmalı. Kılavuzlar size derleyicinin bunu kabul etmesine izin verildiğini söyler ve bu varsayımı ihlal ederseniz sizi DETAYLARA SÖZLÜLER konusunda uyarırlar.
John R. Strohm

15

Sadece bir anekdot notu. Kendi başıma yüksek performanslı bilgi işlem yapmadım.

Fortran ve C., hesaplamalar için (sayı çarpma), evet, eski sebeplerden dolayı.

  • Kamu malı kaynak kodunun ve tariflerin yeterli miktarda bulunması.
  • Her ikisi de MPI'yi destekler .
  • Her iki dil de derlenmiştir.
  • Her iki dil için de derleyiciler tüm HPC İşletim Sistemleri ve satıcıları tarafından sağlanmaktadır.
  • Vectorizing derleyicileri mevcuttur.
  • Her ikisi de farklı bir kümeye (yüksek bellek boyutu, CPU sayısı vb.) Aktarıldığında yüksek performans elde etmek için çılgınca ayarlamalar gerektirir
    • Bu aslında açık kaynak kodunun neden önemli olduğunu açıklıyor: ince ayar yapılması gerekiyor, bu nedenle orijinal tarif, manuel ince ayar için iyi bir dilde yazılmalıdır.

Sayı baskılaması için mevcut eğilim, küme özellikleri göz önüne alındığında performansı optimize etmek için kaynak kodda ince ayarlamayı otomatikleştiren program jeneratörleri yazmaktır. Bu jeneratörler genellikle C olarak üretilir.

İkinci bir eğilim, belirli GPU'lar veya Cell BE için bazı C uzman lehçelerini 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ğ ekipmanı olmadan "emtia" makinelerinin kümelerinde çalıştırılması çok daha ucuzdur. Bu genellikle "Yüksek Verimli Hesaplama" olarak adlandırılır. Python da buradaki 1. dildir (ünlü Harita Azaltma özelliğini kullanarak). Python'dan önce toplu işleme projeleri herhangi bir dilde yazılabilir ve genellikle Condor tarafından gönderilir .


1
"Çılgın tweaking seviyesi" bölümünde biraz daha detay verebilir misiniz?
Rook

Bilgi işlem merkezi, MPI çağrılarını daha hızlı çalışması için yeniden düzenlemek üzere mezun öğrencileri işe alır.
rwong

(?) Buradaki ilk kelime, fakat uygulamaların farklı olduğunu tahmin ediyorum.
Rook

İklim modelleme araştırma merkeziydi.
rwong

4

(Gasp!) C # içindeki bazı çok hesaplama yoğun kodlar üzerinde çalışıyorum.

Optik modelleme için bir GPGPU FDTD uygulaması yapıyorum . Küçük (128 işlemci) bir kümede, simülasyonlarımızın çoğunun çalıştırılması haftalar alır. Ancak GPU uygulamaları yaklaşık 50 kat daha hızlı çalışma eğilimindedir - ve bu tüketici sınıfı bir NVidia kartıdır. Şimdi iki GTX295 çift işlemcili kartımız (birkaç yüz çekirdeği) olan bir sunucumuz var ve yakında Teslas alıyoruz.

Bu sizin dilinizle nasıl ilgilidir? Aynı şekilde daha önce kullandığımız C ++ FDTD kodu CPU'ya bağlıydı, bunlar GPU'ya bağlıydı, yani yönetilen vs yerel kodun ( çok küçük) beygir gücü farkı hiç devreye girmedi. C # uygulaması bir iletken - OpenCL çekirdekleri yüklüyor, GPU'lara veri aktarıyor, kullanıcı arayüzü sağlıyor, rapor veriyor, vb. - C ++ 'da götüne acı veren tüm görevler.

Geçtiğimiz yıllarda, yönetilen ve yönetilmeyen kod arasındaki performans farkı, hızın ekstra yüzde birkaçını elde etmek için bazen C ++ 'ın korkunç nesne modeline katlanmaya değecek kadar önemliydi. Bu günlerde, C ++ vs C # geliştirme maliyetleri çoğu uygulama için yararlarından daha ağır basar.

Ayrıca, performans farkınızın çoğu, seçtiğiniz dil seçiminden değil, geliştiricinizin yeteneğinden gelecektir. Birkaç hafta önce, belirli bir hesaplama alanı için yürütme süresini% 15 azaltan, üçlü iç içe (3D dizi geçişi) bir döngünün içinden tek bir bölme işlemi geçirdim. Bu, işlemci mimarisinin bir sonucudur: bölme yavaştır, ki bu sadece bir yerden almanız gereken yüzlerden biridir.


1
c ++ nesne modeline sahip mi? Ancak, denetleyicilerinizi yazmak için bir komut dosyası diliyle gitmiş olmanız gerekecek gibi geliyor - eğer C #, dev hızı nedeniyle C ++ 'dan daha iyiyse, python (veya lua, vb.) Benzer şekilde C #' dan daha iyidir.
gbjbaanb

3
@gbjbaanb Zorunlu değil. Bu uygulama GPU'ya bağlıdır, ancak bir komut dosyası diline taşınması bunu kolayca değiştirebilir. C # derlenmiş ve çok güzel bir eniyileyici var. Derlenmiş, kesinlikle yazılmış diller arkadaşlarınızdır! Daha az katı betik dilleri, oldukça karmaşık olan herhangi bir proje için geliştirme süresinin artmasına neden olma eğilimindedir .
3Dave

1
Yedi yıl oldu. Çok şey öğrendim. c ++ oldukça iyi, C # da harika, gerçekten python'u seviyorum ve: CPU perf hala önemli.
3Dave

3

Fortran, en çok, genellikle eski (insanlar hala eski kodu çalıştırıyor) ve tanıdık olmaları (HPC'yi yapan kişilerin çoğu diğer dil türlerine aşina değil) nedeniyle yaygındır.

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

Bu genel olarak doğru değil. Klasik HPC, çoğunlukla makine hassas sayıları olan doğrusal cebir yapıyordu. Bununla birlikte, modern HPC, bilgisayar hassas sayıları yerine rastgele matematiksel ifadelerle yapılan sembolik hesaplamalar gibi, daha fazla çıtır çıtçıtlama için süper bilgisayarları giderek daha fazla kullanıyor. Bu, kullandığınız araçlara oldukça farklı özellikler koyar ve Fortran dışındaki programlama dillerini kullanmak nadir değildir, çünkü sembolik hesaplama GC olmadan ve OCaml'in optimizasyon paterni derleyici derleyicisi gibi diğer optimize edici derleyiciler olmadan zor olabilir.

Örneğin, bu makaleyi Fischbacher ve ark. “Yazarların şu ana kadar yapılan en büyük sembolik hesaplama olabileceğine inanmak için güçlü nedenleri var” diyor.


Fortran yaygındır, çünkü birçok insan küresel hava tahmini gibi fiziksel sistemlerin simülasyonlarını yürütmek ve gerekli algoritmaların Fortran'da uygulanmasını çok net ve özlü bir şekilde kullanır.
Sharpie

3

Fortran, bazı iyi ve bazı iyi olmayan nedenlerden dolayı. Ağır matematik çatırtıları için iyi bir neden, tümü Fortran'da yazılmış (bunlar C ve C ++ den çağırılabilir) olmasına rağmen, denenmiş ve gerçek alt programların kapsamlı kütüphaneleri (BLAS, LAPACK) olmasıdır.

Çok iyi olmayan bir sebep, Fortran'ın C / C ++ 'a göre varsayılan performans avantajı. İyileştiriciler oldukça iyi ve çok az insan bir kod parçasını optimize etmenin faydasının meşgul olduğu zamanla orantılı olduğunu anlıyor, ki bu kod neredeyse tüm kodlarda neredeyse sıfır.

Çok iyi olmayan bir başka sebep de, CS ile CS olmayan programcılar arasındaki bir kültür boşluğudur. Bilimsel programcılar Fortranda kötü alışkanlıkları öğretilmelidir eğilimindedir ve CS programcılar ve kötü alışkanlıklarına aşağı bakmak onlar öğretilmiş ve kim eski hor.


"CS ve CS olmayan programcılar arasındaki kültür açığı. Bilimsel programcılar Fortran'da kötü alışkanlıklar öğretme ve CS programcılarına ve öğretildikleri kötü alışkanlıklara bakma eğilimindeler ve öncekilere bakanlar." Kısmen bu sadece sorunun farklı yönlerine odaklandıklarıdır. Fortran, FORmula TRANslation demektir ve matematik formüllerini koda çevirmede oldukça etkilidir. Programlama CS türlerinin çoğu zaman yaptığı gibi, diğer diller üstündür.
Omega Centauri,

1
@Omega: Haklısın. Fortran-öğretti insanlar, biçimlendirme kavramına sahip değil, "hiçbirini ima etmedi" den nefret ediyorlar ve kodu bir araya koyuyorlar, çünkü hala 72 karakterlik çizgilerle ilgileniyorlar ve anlaşılabilir bir kod yapmanın wimps'ler için olduğunu düşünüyorlar. CS eğitimi almış insanlar, basit bir şeyin işi yapması halinde polimorfizm, bildirim ve soyutlamalar ile bağlanmış sınıfların canavar piramitlerini yaratırlar. Böylece birbirlerini hakediyorlar :)
Mike Dunlavey 28:10

7
alıntı, "fizikçiler yarın donanımında yarın sorunlarını çözerken - CS adamları yarın donanımında dün sorunlarını çözerken"
Martin Beckett

@ Martin: Sanırım bunu bir yerlerde duydum. Kesinlikle doğru çalıyor.
Mike Dunlavey,

Martin: Yani, donanım adamları en verimli
olanı

2

Temelde, sayıca kremalama işini yapan tüm programlar hala FORTRAN'dır (eski blas, lapack, arnoldi vb. Hala kullanılan programlardır) ... Ancak, daha üst seviye bir yapı söz konusu olduğunda, insanlar giderek daha fazla kullanılmaktadır. C ++.

Simülasyonun karmaşıklığı çok büyük bir kod içerir ve bir yazı yazmaktan herhangi bir şekilde faydalanmak için onu yeniden kullanılabilir hale getirmektir. Ayrıca, kullanılan kavramlar da oldukça karmaşık hale gelmiştir. FORTRAN kullanarak bu bilgiyi temsil etmek neredeyse delilik. Nesne Yönelimli Tasarımı doğal olarak desteklediğinden C ++ 'ın girdiği yer burasıdır. Bununla birlikte, Çalışma Zamanı Polimorfizmi nadiren tercih edilir. İnsanlar bunun yerine neredeyse her zaman Statik Polimorfizm kullanırlar (C ++ 'da şablon meta programlama ile uygulanırlar)

Ayrıca, şimdi derleyiciler gerçekten iyidir, bu nedenle derleyiciler için çok fazla optimizasyon bırakılmıştır.


1

HPC uygulamalarında ele alınması gereken iki tür sorun vardır: Birincisi, kendisini çeken sayı, diğeri ise hesaplamaları yönetmektir. Birincisine, Fortran, C veya C ++ 'da yazılmış olan ve hız nedeniyle ve bu dillerde yazılmış çok sayıda bilimsel algoritma olması nedeniyle kodla yaklaşılmaktadır. Hesaplamaların yönlendirilmesi, daha yüksek seviyeli dillerde daha rahat bir şekilde uygulanır. Python, uygulama mantığını ele almak ve derlenmiş dillerde uygulanan uzantıları çağırmak için tercih edilen bir "yapıştırıcı" dilidir. Java, ağı yönetme ve dağıtılmış hesaplamanın gerekli olduğu projeler tarafından sıkça kullanılır.

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.