Büyük, Fortran tabanlı bir sayı crunching kod tabanı nasıl modernleştirilebilir?


21

Akademi'den bir arkadaşım tavsiye istedi (C # iş uygulaması geliştiricisiyim).

Tıbbi görüntüleme alanında Fortran'da yazdığı eski bir kod tabanına sahiptir. Vektörleri kullanarak çok fazla sayıda çatırtı yapar. Bir küme (30ish çekirdek) kullanıyor ve şimdi içinde 500ish GPUS bulunan tek bir iş istasyonuna gitti.

Ancak nereye kod tabanı ile sonraki gitmek böylece:

  • Diğer insanlar bunu önümüzdeki 10 yıllık döngü boyunca koruyabilir
  • Yazılımı değiştirirken daha hızlı olun
  • Yeniden derlemeden farklı altyapılarda çalışabilir

Benden biraz araştırma yaptıktan sonra (bu süper ilginç bir alan) bazı seçenekler:

  • Kullanım Python ve CUDA gelen Nvidia
  • İşlevsel bir dilde yeniden yazın. Örneğin, F # veya Haskell
  • Bulut tabanlı olun ve Hadoop ve Java gibi bir şey kullanın
  • C Öğrenin

Bununla ilgili deneyiminiz neydi? Arkadaşım kod tabanını modernize etmek için nelere dikkat etmeli?

GÜNCELLEME: Teşekkür @ @ Mark ve cevaplayan herkes. Arkadaşımın bu soruyu sormasının nedenleri, projelerin yaşam döngüsünde bir inceleme yapmak için mükemmel bir zamandır. Fortran'da araştırma görevlilerini hızlandırmak zaman alıyor (C # ve özellikle takımları seviyorum ve eski dillere geri dönmeyi hayal edemiyorum !!)

Saf sayıyı Fortran'da tutmak, ancak daha yeni bir şeye sarmak önerisini beğendim. Belki de Python, akademide toplanması oldukça kolay olan genel amaçlı bir programlama dili olarak bir güç kazanıyor gibi görünüyor.

Bkz. Tıbbi Görüntüleme ve CUDA için bir Fortran sarmalayıcı yazan bir adam, Fortran 90 sarmalayıcılarımı yasal olarak Nvidias'ın CUFFT kütüphanesine (CUDA SDK'dan) yayınlayabilir miyim? .


Listeye OpenCL eklerdim.
Jerry Coffin,

3
Merhaba Dave, "Daha sonra hangi dili öğrenmeliyim?" burada izin vermediğimiz bir soru, bu yüzden insanların bu soruyu bununla karıştırmamalarını sağlamak için küçük düzeltmeler yaptım. Ancak, şimdiye kadar keşfettiğiniz seçimlerin neden uygun olmadığını açıklamak için sorunuzu genişletebilir misiniz, böylece daha iyi bir uyum sağlamak için yanıtları yönlendirebilir mi?

"Yeniden derlemeden farklı altyapılarda çalışabilir" altında ne demek istiyorsun?
Kale

Merhaba @Idigas - özellikleri çok emin değilim. Ama esasen hikaye, kod tabanını diğer kümelere / makinelere alırken, kütüphanelerin tüm doğru sürümlerinin bir araya getirilmesinin bir kabus haline geldiği yönündeydi. Kod tabanının F77'den F90'a veya hangisine götürüldüğüne inanıyorum .. Temelde mimarileri / dilleri değiştirip değiştirmeme konusunda akıllıca bir karar vermesi için doğru insanlarla konuşmasına yardım etmeye çalışıyorum. Müşterilerin ekstra kodlama zamanının bir gününü sevmediği bir arka plandan geliyorum, bu yüzden mümkün olan en iyi kodu yazmama yardımcı olmak için yapabileceğim her şey en uygun olanı ideal :-)
Dave Mateer

@DaveMateer - Cevabımı görün (bu kutuya sığmadı). Şimdi uyuyacağım, bu yüzden gelecekteki cevaplar biraz yavaş olabilir :)
Rook

Yanıtlar:


24

Koyduğunuz talepler, Fortran'ı bu gibi sorunlar için listenin en üstüne koydu:

a) sayı gıcırtısı
b) paralel
c) cs çalışmaları dışında ( fiili programcı olmayan mühendislere) öğretilen fiili dildir ve halen de dildir.
d) inanılmaz derecede (!) bir endüstri desteğine sahip, sektör-sınıfı-derleyici-bilge sayısı, satıcıların hiçbiri bu dalı terk etmenin en az belirtilerini göstermiyor. Intel'in temsilcilerinden çok önce, Fortran ürünlerinin satışlarının geliştirme araçlarındaki diğer satışlardan daha yüksek olduğunu açıkladı.

Ayrıca, alınması son derece kolay bir dildir. Araştırma görevlilerini hızlandırmanın zaman aldığını kabul etmiyorum. Üzerinde ilk ders kitabımın, oh, bilmiyorum, 30 (?) Sayfa seyrek basılı metinden daha fazlası yoktu. 10 anahtar kelime öğrendikten sonra orta boy programlar yazabileceğiniz bir dildir. Varsayılan Word metninde yazılan 30 sayfanın çoğu kullanıcı için daha kapsamlı bir "Fortran kılavuzu" yapacağını söylemeye cesaret edemem.

Eğer CUDA ilgilenen ediyorsanız, kontrol etmek isteyebilirsiniz Portland Grubu'nun derleyici , bunu destekler . Daha ince detaylara aşina değilim, ama insanlar genellikle bundan övgüyle bahsediyor.

Bunun dışında, paralel programlar için Intel'in derleyicisinin yakın zamanda uyguladığı OpenMP, MPI ve şimdi yakında (ve uzun zamandır beklenen) ko-diziler mevcut . Kelimeleri boşa harcamamak için, Fortran programları paralelleştirmek için çok iyi bir "kütüphaneler" gammasına sahiptir.

Endüstri standardı sayısal kütüphaneler her şeyden önce işlev / rutin portföyünde az çok takip eden diğer diller için geliştirilmiştir.

Tüm söylenenler, ancak (başlangıçta ne zaman yazıldığına bağlı olarak) , Diyelim ki, F77 kodu veya daha eski, zamanla kısmen yeni lehçelere - en azından F2003 özellikleriyle F903'e yeniden yazarak öneririm. Bu konuda bir makale / tez yakın zamanda yayınlandı (orta boy PDF dosyası önde). Bu, doğru şekilde yapılırsa, birden fazla platformda taşınabilirliği sağlamakla kalmaz, aynı zamanda gelecekteki bakım için daha kolay hale getirir.

ps "Gelecekteki bakım" kadarıyla, sadece bahsetmek istediğim bir anegdote. Tezimi yazarken, 35 yıl önce yazılan tarihten itibaren akıl hocamızdan bazı kodları tekrar kullandım. Sadece bir hata ile derlendi; kopya yapıştırma hatası nedeniyle sonunda bir açıklama eksik :)


@DaveMateer (yoruma cevap) - Biraz kaba olabilecek bir yorum yapacağım, ama lütfen yanlış bir şekilde kabul etmeyin, çünkü adil niyettedir.

Bana öyle geliyor ki bu "problem" ile yanlış bir şekilde mücadele ediyorsunuz. Birkaç kısa noktada kastettiğim (çünkü burada çok geç ve okunabilir (anlaşılabilir olsa da) cümleler kurma yeteneğim beni 10'dan sonra bırakıyor.)

a) ekstra kodlama süresini en aza indirmeye çalıştığınızı söylemiştiniz, ancakifademi affedecekseniz, sayısal hesaplama için uzmanlaşmış bir dilden renkli bir dil seçiminden bir dile yeniden yazmayı düşünüyorsunuz.

  • bazıları çok boyutlu dizileri desteklemez, diğer şeylerin yanı sıra
  • birçoğu ağır sayısal çalışmalar için uygun değil (Haskell ve Hadoop'un paralel işleme kabiliyetleri olduğunu kabul ediyorum, hakkında hiçbir şey bilmiyorum ... ama bu çevrelerde bile belirtilmediğini hiç duymadım)
  • Muhtemelen denendi, ama ayrık sorunların dili olan Fortran'dan işlevsel bir dile yeniden yazıldığını hiç duymadım
  • kısa bir süre önce comp.lang.fortran (google gruplarında arama yapmayı deneyin) "bulutta" bilimsel bilgi işlem yönleriyle ilgili bir tartışma yapıldı (
    sizi motive etmek istemez, ancak adil olmak gerekirse, kimse gerçekten değildi Bu terimin bile neyi temsil ettiğinden emin olun, daha az yalnız başarılı bir uygulamaya bir örnek vardı. Bu tür paralellikler için pek çok sorun da uygun değildir.

b) böyle bir yeniden yazmanın maliyeti ne olur? insanlar / saat.

c) - kütüphanelerin derlenecek doğru sürümleri ... - herhangi bir dilde bir problemdir, kaçınılmazdır, ancak ona bakarsınız.

d) Birkaç kez paralel uygulamalarda kullanılan Python'u (gerçekten güzel bir dil) duydum, ancak bu pazara girmesi hala yükselmiyor gibi görünüyor ve sürekli değişen doğası onu çok kötü bir seçim haline getiriyor. uzun vadeli bir proje (geriye dönük uyumluluğu düşünün). Bazı insanlar bunu "tutkal" dili olarak çok severler.

Ugh, başka bir şey düşünürsem yarın ekleyeceğim. Biraz uyumalısın ...


@Idigas .. tekrar takdir. Bir şey işe yaradığında, o zaman bu çok şey ifade ediyor. Endüstrimiz korkunç bir şekilde yanlış giden yeniden yazmalarla doludur (Netscape!).
Dave Mateer

1
İdigas burada doğru fikre sahip. Yıllardır çalışmakta olan bir çalışma kodu tabanınız var ve yazıya dönüştürmek hatalar üretecek. Artı Fortran almak için basit bir dildir - çirkin olabilir, ancak net kavramlardan yapılmıştır. Diğer kodlara / kodlara bağımlılıkları kontrol altında tutun ve belki de Fortran'a güzel bir C-tarzı arayüz yazın ve kodun geleceğe karşı oldukça dayanıklı olduğunu göreceksiniz (C-tarzı, hemen hemen her dilde çağrılacak bir mekanizma olduğundan C stili arayüz ile kod).
anon

2
Kabul etmek zorundayım. Yaptığınız şeyin (ve çoğu mühendisin) arkasındaki matematiği anlarsanız, onu FORTRAN'da uygulamak o kadar büyük bir öğrenme eğrisi değildir. Bir kez inşa ettikten sonra, gereksinimler iş veya sosyal uygulamalarda olduğu gibi nadiren değişecektir.
JeffO

Vay be, FORTRAN için çok fazla sevgi olduğunu bilmiyordum. F77'de 5 yıl boyunca gelişmem gerekiyordu ve buna dayanamıyorum.
dodgy_coder

2
@dodgy_coder. Doksanlarda Fortran + .NET'te geliştirme yaptınız. .NET'in ilk beta sürümü 2000'de çıktı.

10

Fortran'ın asla öleceğinden şüpheliyim - öyle büyük bir yazılım ve kitap mirası var ki, insanlar hala üzerinde çalışıyor, sadece bu durumu stabilize ediyor. Dahası, sayı çatırtısından başka bir şey yapmak istemiyorsanız hala çok iyi bir dildir - sözdizimi çok zarif ve mantıklıdır, ayrıca derleyici neler olduğunu kolayca tahmin edebilir. Bu nedenle, herhangi bir yeni donanım hızlandırıcı teknolojisinin C, Fortran ve bir çeşit OpenCL'yi destekleyeceği garanti edilir (nihayet sağlam bir şeye dönüştüğünde).

Bu nedenle, sayısal kısmı açıkça ayırmanız, Fortran'da bırakmanız, net bir ciltleme yapmanız ve gerisini istediğiniz her şeye yazmanız gerektiğini söyleyebilirim.


Fortran'daki yeni projelerin de bugünlerde başlatıldığından bahsetmiyoruz bile.
Kale

Evet, Fortran'ın COBOL'su değil, sadece insanların 30 yıl önce öğrendikleri için desteklenmiyor (IMO, bunun bir parçası olsa da). Sayı crunching benim forte olsa değil, bu yüzden daha iyi varsa kesinlikle bilmiyorum.
Ben Brocka

1
Fortran dili hala sayı çatışması ve ilişkili optimizasyonlarda on yıllık bir liderliğe sahiptir. Yakında ölmeyecek.
Martin York

1
Fortran ve ardışık modernizasyonlarla nasıl devam ettiği ve devam ettiği hakkında kısa bir süre önce yayınlanan bir "ACM'nin İletişimi" nde yer aldı. Fortran'daki kodun (en azından sayıdaki çatırdayan kısmı) tutulması muhtemelen iyi bir hamle olacaktır. Ayrıca Netscape Sendromundan kaçınmaya yardımcı olur (yeniden yazma = yeni hatalar = büyük döngü süresi = ilgili herkesi sinirlendirdi).
quickly_now

1
Gerçekten Fortran ile ilgilenmeyen birisinin numara crunching kodunuza dokunmasını istiyor musunuz? Büyük bir sorun, yeniden yazma işleminden sonra sonucun hala doğru olduğundan emin olmaktır.
Peter Smith

4

Python gerçekten de bilimsel bilgi işlem topluluğunda çok fazla çekiş kazanıyor (biraz modası geçmiş bir görünüm için, CiSE'nin 9 numaralı 3. bölümüne bakınız ). Bence bir Python / Fortran melezi mükemmel bir yol. Tüm bu GPU'lardan yararlanmak için PyCUDA veya PyOpenCL kullanabilirsiniz .

Kısmi diferansiyel denklemler için sayısal çözücüler analiz eden ve yazan bir matematikçiyim. Geçenlerde arkadaşınızınkine benzer bir durumdaydım; söz konusu Fortran 77 kodu iyi bilinen Clawpack yazılımıdır . Python'da üst düzey kodu (hızlı olması gerekmeyen tüm parçalar) yeniden yazdık ve düşük seviyeli parçaları otomatik olarak sarmak için f2py'yi kullandık.

Bunun gerçekten güçlü sonucu, hibrit Python / Fortran kodunu ( PyClaw olarak adlandırılan ) neredeyse önemsiz bir şekilde PETSc paralel kütüphanesine bağlayabilmemiz ve ilk kez 65K çekirdeğinde iyi performans gösteren Clawpack'in ölçeklenebilir paralel bir versiyonunu oluşturmamızdı. Yazmamız gereken tüm paralel kod 300 satırdan daha az Python içeriyor . Şimdi sadece eski kodla çözülemeyen sorunları çözüyoruz. Daha da önemlisi, Python çok samimi bir dil olduğundan ve hemen hemen her şey derleme zamanı yerine çalışma zamanında değiştirilebildiğinden, yeni kullanıcıların kodu alması çok daha kolay.

Yaklaşımımız ve sonuçlarımızla ilgili daha fazla ayrıntı görmek istiyorsanız , arXiv hakkında bir makalemiz var .

Öz-reklam için özür dilerim, ama kişisel deneyimimin burada alakalı olduğu görülüyordu. Daha fazla fikir duymak isterseniz, bunu yeni http://scicomp.stackexchange.com adresine de gönderebilirsiniz .


1

Şu anda arkadaşınızınkine çok benzeyen bir durumdayım. 40-şey KLOC Fortran-77 eski kodumu "modernize etmek" için de umutsuzum. Ve buna rağmen Fortran, sayı kırma uygulamalarında hala kral olarak görülmesine rağmen, her şeyin kaybolmadığını söylemek istiyorum. (Takip eden rant-ish yani benimle ayı).

Fortran'ın sayısal kod için en iyi dil olması, dağınık, karmaşık bir kodun bu büyük bagajını her zaman yanımızda taşımamız gerektiği anlamına gelmez (Evet, bir Fortran kodu dağınık olmak zorunda, özellikle de Fortran-77 belirli bir KLOC'yi geçtiği zaman, yazılım mühendisliğine hiç önem vermeyen bir dildir). Fortran'ı sayı sıkışıklığı için savunanlar, bu tür kodların performans analizini yaptığınızda, performans yoğun olan kodun sadece% 5'i veya% 10'u ve kalan% 90'ı için + Fortran'ın işe yaramaz bir yük olduğu, "yazılım mühendisi" olarak hayatınızı cehenneme çevirmek için orada.

Fortran-77'den Fortran-90'a taşınırken, esasen bir dereceye kadar dil özellikleriyle performansı takas etmeye istekli olursunuz. Fortran, esas olarak Fortran-77 nedeniyle güçlü bir sayı kırıcıdır. Fortran-90'ın o kadar hızlı olduğunu söyleyebilirsiniz, ancak derleyici yazarlarının Fortran-90/2003 özelliklerini eklerken ve hala Fortran-77 performansını korurken elde ettikleri optimizasyon sorunları C derleyici yazarlarının uğraşması gereken sorunlardan çok farklı değildir. ile (ve sonuç olarak C de hızlı olarak kabul edilir, C'den bahsetmemek bile hat içi montaja izin verir). Öyleyse neden bir Fortran-77 koduna C kodu (Fortran-90 yerine) yavaş yavaş eklemeye başlamıyorsunuz? Kodum zaten C'de parçalara ve Fortran-77'de parçalara sahip ve dizeler, sıfır indeksleme / tek indeksleme vb.Gibi bazı sorunlara maruz kalıyor.

Bir adım daha ileri giderdim. Bir sayı gıcırdama koduna hoş bir "insancıl" arayüz istiyorsanız C (ve kesinlikle Fortran-90/95/2003) bile çok düşük seviyededir. Bir Python-Fortran-77 veya Python-C melezine geçmeyi düşünüyorum. Kodun% 90'ının Python olduğu bir kod (Numpy, Scipy, çizilebilirlik ve tüm bu tatlılık dahil) ve sadece performans yoğun% 5-% 10 Fortran-77 veya C kodu olarak kalır.


1
msgstr "Bir Fortran kodu dağınık olmalı". Hayır. Dağınık bir kodlayıcı herhangi bir dilde dağınık kod yazacaktır ve bunun tersi doğrudur. Kernighan ve Plauger yıllar önce Fortran'ın nasıl temiz yazılacağını gösterdiler .

0

Şu anda modern endüstri ortamlarında kullanılacak eski bir FORTRAN95 kod tabanını güncelleme sürecindeyim, çünkü önceki sürüm en geç Windows2000 makinelerde çalışacak. FORTRAN kod tabanının kendisi, sulama simülasyonları ile ilgili çok sayıda crunching gerçekleştirir.

Yaptığım şey FORTRAN'ı daha modern bir dilde yeniden yazmak yerine, sadece WORTF uygulamasının arka ucu olarak kullandığım .Net 4.0 kütüphanesine FORTRAN kod tabanını derlemek için Silverfrost FTN95 adlı ticari bir derleyici kullanıyorum. . Bu şekilde, simülasyon koduna biliyordum hataları getirme riskini çalıştırmıyorum ve daha modern ortamlarda çalışacak şekilde kod tabanını .Net 4.0 çerçevesine taşıyarak modernize ediyorum.

Ancak simülasyonunuzun ne kadar büyük olduğuna bağlı olarak, sadece her şeyi C # gibi daha modern bir dilde yeniden yazmak isteyebilirsiniz, çıktıyı karşılaştırmak için simülasyonun çalışan bir sürümüne sahip olduğumda bunu yapmayı planlıyorum.

Umarım tecrübem yardımcı olur, teşekkürler Alex.


0

2001-2003 yılları arasında FORTRAN'dan C # 'a 100KLOC pencere uygulaması taşıyan bir projede liderlik yaptım. Win32 kütüphanelerine kendi özel GUI bağlamaları olan bir sayı kırma uygulamasıydı. C # ve WinForms bağlantı noktası, kod yönetimini çok daha basit hale getirdi ve Visual Studio'da herkese daha zengin bir geliştirme ortamı sağladı. Erken dönemde (özellikle biçim ifadeleri açısından) oldukça fazla direnç vardı, ama sonunda kesinlikle değdi.

Bence mermi ısırmak ve mümkün olan maksimum FORTRAN kodundan kurtulmak mantıklı. Hız hiçbir zaman sorun olmadı - C # 'da kod çalıştıran ilk testler FORTRAN ile karşılaştırıldığında, C # yönetilen kod çalıştırsa bile performans farkının önemsiz olduğunu gördü. Bununla birlikte, vektörlerle ihtiyaçlarınız biraz farklı olabilir ve az miktarda FORTRAN kodunun kalması da kabul edilebilir.

Bunu yapmanın bir başka nedeni de elbette kodunuzu C # geliştiricilerine kıyasla koruyabilen FORTRAN deneyimi olan kişilerin uzun süreli kullanılabilirliğidir. Ayrıca, ekip moralinin modern ve iyi desteklenen bir dilde çalışmasına yardımcı olur.


0

Birçok bağlamlarda, söylendi MATLAB bilimsel bilgi işlem uygulaması için FORTRAN değiştiriliyor. Sadece modern ve üst düzey değil, aynı zamanda yaptığı işte de oldukça hızlı. Tıbbi görüntüleme yazılımı üzerinde çalışan bir çok geliştirici zaten MATLAB kullanıyor, bu yüzden tıbbi görüntüleme için adanmış birkaç kütüphanesi var. Bu, MATLAB ile giderseniz hem araçları hem de alan adı uzmanı desteğini bulacağınız anlamına gelir.

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.