Laskennallisen tieteen tohtoriohjelmassa työskentelen melkein yksinomaan C ++: ssa ja Fortranissa. Näyttää siltä, että jotkut professorit suosivat toisiaan. Mietin, kumpi on ”parempi” vai onko toinen parempi tietyssä tilanteessa.
Kommentit
- Sekoitus korkeaa ja matalatasoinen kieli on mielestäni parempi kuin käyttää kumpaakin kumpaakin. Esimerkiksi. Käytän Python + C ++.
- Vastaukset tähän kysymykseen ovat melkein puhtaasti subjektiivisia, joten en ’ ole varma, onko tämä kysymys asianmukainen.
Vastaa
Kuten niin usein, valinta riippuu (1) ongelmasta, jota yrität ratkaista, (2) taitosi, jotka sinulla on, ja (3) ihmiset, joiden kanssa työskentelet (ellei se ole yksinprojekti). Jätän (3) hetkeksi sivuun, koska se riippuu kaikkien yksilöllisestä tilanteesta.
Ongelmariippuvuus: Fortran menestyy matriisien käsittelyssä. Jos ongelmasi voidaan kuvata yksinkertaisten tietorakenteiden ja erityisesti matriisien avulla, Fortran on hyvin mukautettu. Fortran-ohjelmoijat käyttävät matriiseja jopa ei-ilmeisissä tapauksissa (esim. Kuvaajien esittämiseen). C ++ soveltuu paremmin monimutkaisiin ja erittäin dynaamisiin tietorakenteisiin.
Taituriippuvuus: Hyvien C ++ -ohjelmien kirjoittaminen vaatii paljon enemmän ohjelmointikokemuksia kuin hyvien Fortran-ohjelmien kirjoittaminen. Jos aloitat pienellä ohjelmalla Kun sinulla on vain niin paljon aikaa oppia työsi kyseinen osa, saat todennäköisesti parempaa tuottoa investoinneille oppimalla Fortran kuin oppimalla C ++. Olettaen tietysti, että ongelmasi sopii Fortranille.
Ohjelmoinnissa on kuitenkin muutakin kuin pelkästään Fortran ja C ++. Suosittelen kaikille, jotka aloittavat laskennallisen tieteen, aloittamaan dynaamisella korkeudella -tasokieli, kuten Python. Muista aina, että aika on arvokkaampi kuin suorittimen aika!
Kommentit
- ” Muista aina se aika on arvokkaampi kuin suorittimen aika! ” Koska HPC: ssä työskentelevä henkilö olen eri mieltä kyseisen osan kanssa; kaikki muu on paikalla.
- ” Muista aina, että aika on liukoisempi kuin suorittimen aika! ” Kuten joku, joka työskentelee tieteellisessä tutkimuksessa, en voinut ’ olla samaa mieltä tämän osan kanssa.
- ” Muista aina aikasi on arvokkaampi kuin suorittimen aika! ” – I ’ haluaisin heittää 2 senttini – käyttämällä useita satoja solmuja, kukin Yli 10 ydintä jonkin ohjelman ajamiseksi useita viikkoja voidaan tulkita kaikkein arvokkaimman resurssin kauheaksi tuhlaukseksi, jos muutama viikko voisi tuottaa koodin, joka toimii vain muutamassa päivässä. Nämä HPC-klusterit ovat harvinainen ja kallis yhteinen resurssi.
- ” Muista aina, että aika on liukoisempi kuin suorittimen aika! ”, koodi viikon ajan, mutta käynnissä kuukauden ajan, tämä ’ on varsin tavallinen sir!
- ” Muista aina, että aika on arvokkaampi kuin suorittimen aika! ”, haluaisin mieluummin koodata kuukauden ja suorittaa viikossa! – Voit tehdä enemmän, kun koodi on kirjoitettu, ja muut pitävät kirjoittamaasi koodia myös hyödyllisenä.
Vastaa
Uskon, että sekä C ++ että Fortran ovat riittävän hyviä ja toimivat hyvin.
Luulen kuitenkin, että Fortran on parempi numeerinen tieteellinen laskenta, algoritmeille, jotka voidaan ilmaista käyttämällä matriisit ja eivät tarvitse muita kehittyneitä tietorakenteita, joten sellaisilla aloilla kuin rajalliset erot / elementit, PDE-ratkaisijat, elektroniset rakennelaskelmat. Fortran on toimialakohtainen kieli. Erityisesti olen sitä mieltä, että nopea ohjelmat Fortranissa kuin C ++: ssa, kirjoittanut tiedemies (ei välttämättä tietojenkäsittelytieteen asiantuntija).
C ++ on yleiskäyttöinen kieli, joten siinä voidaan ilmaista mikä tahansa algoritmi, ja se on ehdottomasti parempi algoritmeille, joita ei voida ilmaista matriisien avulla, HPC-kentästä todennäköisesti joitain kuvaajia, verkkogeneraattoreita, symbolista käsittelyä ja niin edelleen.
On myös mahdollista kirjoittaa arra y algoritmit C ++: ssa, mutta kokemukseni mukaan se vaatii paljon enemmän tietojenkäsittelytietoa ja yleensä enemmän työtä (ts. täytyy luoda tai käyttää uudelleen luokkia taulukon manipulointia varten ja käsitellä muistin hallintaa käsin tai käyttämällä jotakin kirjastoa, kuten Teuchos from Trilinos). Ei-asiantuntijat kirjoittavat yleensä melko hyviä Fortran-ohjelmia, mutta kamalat C ++ -ohjelmat (puhumalla omasta kokemuksestani).
Vastuuvapauslauseke: Pidän Fortranista henkilökohtaisesti paljon ja pidän sitä mieluummin C ++: n sijaan numeerisessa laskennassa. Olen viettänyt yli 2 vuotta ohjelmointia C ++: ssa päivittäin ja melkein vuoden ohjelmointia nykyaikaisessa Fortranissa päivittäin (äärellisten elementtien alueella). Käytän myös Pythonia ja Cythonia paljon.
Kommentit
- Yksi ensimmäistä vastausta varten on tasapainoinen. Mielestäni C ++ ja Fortran eivät ole ylivoimaisesti ainoat mahdollisuudet nykyaikaisessa HPC: ssä. Mielestäni on hyvä tietää vahvuus ja heikot kohdat, kun päätät Fortran, C ++ tai Python (tai mitä haluat). Olen nähnyt 20 000 Fortran-riviä yhdessä tiedostossa, joka on orgaanisesti kasvanut vuosikymmenien ajan. Henkilökohtaisesti en käyttäisi mihinkään muuhun kuin eristettyyn raskaan matriisin laskentaan. Ei edes mihinkään tuotokseen liittyvään. Toistaiseksi puolueellinen kommentti.
- En voinut ’ olla eri mieltä tämän vastauksen kanssa. Rajaelementtikoodiamme ei olisi voitu kirjoittaa Fortranissa. Itse asiassa se alkoi 15 vuotta sitten sekoituksena tavallisesta C: stä ja Fortranista (jälkimmäinen on tarkoitettu menetelmän numeerisesti intensiivisiin osiin), ja se muuttui vähitellen puhtaaksi C: ksi ja sitten C ++: ksi useiden vuosien aikana. Koodi muuttui jatkuvasti lyhyemmäksi, nopeammaksi ja helpommin ymmärrettäväksi, ja se kykeni paremmin jokaisen iteraation jälkeen. Olen samaa mieltä muiden kanssa, jotka huomauttavat, että C ++ antaa sinulle paljon köyttä, jolla voit ampua itseäsi. Valitse kieli, jolle ’ on miellyttävin.
- Bill, käytitkö modernia Fortrania (90 ja uudemmat lisäykset?). Tämä on erittäin tärkeää (minun olisi pitänyt olla selvempi vastauksessani tähän). ” 20.000 riviä Fortran ” tai f77 ei tietenkään ole parempaa kuin hyvin kirjoitettu C ++.
- @ OndřejČert í k: Luulen, että jos uskot, että modernit rajallisten elementtien ohjelmat käyttävät ” yksinkertaista ” tietorakenteita, et ole ’ et tarkastellut yhtään niistä äskettäin. Yritä ottaa käyttöön adaptiivisia äärellisiä elementtejä, hp-menetelmiä tai monisäleisyyttä strukturoimattomille silmille yksinkertaisten tietorakenteiden avulla. Bill on paikalla ja uskon voivani puhua hänen puolestaan sanomalla, että ” nykyaikaisen Fortranin käyttäminen ” olisi tuskin tuottanut muuta kuin pientä ero.
- @WolfgangBangerth, katso esimerkiksi Phaml ( math.nist.gov/phaml ) Fortran-sovelluksesta, joka sisältää melkein kaiken, mitä mainitsit.
Vastaa
Heitän myös kaksi senttiäni tavallaan myöhässä, mutta minä ” Olemme vasta nähneet tämän säikeen ja minusta tuntuu, että jälkipolville on muutama kohta, jotka on ehdottomasti esitettävä.
Huomaa seuraavassa, että puhun C: stä en C ++: sta. Miksi? No, muuten on omenoita ja appelsiineja verrata täysimittaista dynaamisesti kirjoitettua olio-kieltä jotain yhtä staattista kuin Fortran. Kyllä, jotkut uusimpien Fortran-standardien modernit toteutukset voivat tehdä muutakin kuin vain, mutta hyvin harvat ihmiset todella käytä niitä, joten kun puhumme Fortranista, ajattelemme yksinkertaista, staattista ja välttämätöntä kieltä. Siellä on myös C, joten korvaan C: n C ++: lla seuraavaa varten.
Ensinnäkin kaikki keskustelut Fortran / C: stä, jolla on paremmat kääntäjät, ovat kiistanalaisia. Omistetut C / Fortran-kääntäjät ovat menneisyyttä. Sekä gcc / gfortran että icc / ifc ovat vain erilaisia käyttöliittymiä samalle taustalle, eli ohjelmallesi. muunnetaan käyttöliittymän abstraktiksi kuvaukseksi ja sitten optimoidaan ja kootaan taustapuolen kautta. Jos kirjoitat semanttisesti saman koodin Fortranissa tai C: ssä, kääntäjä tuottaa molemmissa tapauksissa saman kokoonpanon joka toimii yhtä nopeasti.
Tämä johtaa nyt toiseen asiaan: miksi näemme edelleen eron erences? Ongelmana on, että useimmat vertailut tehdään Fortranin ohjelmoijilta, jotka yrittävät jotain C: ssä tai päinvastoin. Oletko koskaan huomannut, kuinka useimmat kirjailijat tai runoilijat haluavat kirjoittaa äidinkielellään? Haluatko kirjoittaa runoja kielellä, jolla et ole täysin itsevarma tai kotona? Tietysti ei … Pidän itse C: tä ”äidinkielenään” ohjelmointikielenä. Vietin kuitenkin myös kolme vuotta työskentelen ryhmässä, joka käytti vain Fortrania, jossa olen saavuttanut tietyn sujuvuuden. En kuitenkaan koskaan kirjoittaisi mitään Fortranissa yksin, koska olen ”mukavampi C: n kanssa ja sen seurauksena tuloksena olevan koodin kanssa tulee olemaan parempi riippumatta siitä, mihin määrittelet sen.
Joten suurin ero on ohjelmoijalla, ei kielellä. Joten ei ole eroja? No, ei aivan. Tässä on muutama esimerkki:
-
SIMD: Onko se SSE, SSE3 tai AltiVec, jos haluat käyttää niitä Fortranissa, toivon ja rukoilet, että kääntäjä arvaa täsmälleen mitä haluat ja tekee niin. Onnea. C: ssä sinulla on yleensä sisäisiä toimintoja kullekin arkkitehtuurille tai viime aikoina yleisiä SIMD-vektorityyppejä gcc: ssä . Useimmat Fortran-kääntäjät käyttävät SIMD-ohjeita vain silmukoiden purkamiseen, mutta jos sinulla on ydin, joka toimii lyhyillä tietovektoreilla ei-ilmeisellä tavalla, kääntäjä ei todennäköisesti näe sitä.
-
Erilaiset laitteistoarkkitehtuurit: Koko CUDA-arkkitehtuuri on rakennettu C-ytimien ympärille. Kyllä, Portland-ryhmällä on nyt CUDA myös fortran-kääntäjä , mutta se on kaupallinen, ja mikä tärkeintä, se ei ole peräisin NVIDIA: lta. Sama pätee OpenCL: ään, jonka löydän parhaiten äskettäisestä projektista , joka tukee vain muutamia peruspuheluja.
-
Rinnakkainen ohjelmointi: Kyllä, sekä MPI että OpenMP toimivat hienosti sekä C: n että Fortranin kanssa. Jos kuitenkin haluat langan todellisen hallinnan, ts. Jos sinulla on täysin dynaaminen jaetun muistin laskenta, olet kylmässä Fortranin kanssa. C: ssä sinulla on tavalliset pthreads, jotka eivät ole lämpimiä ja sumeita, mutta Yleensä suurin osa laskelmista, jotka perustuvat käyttöjärjestelmän käyttöön, kuten ketjut, prosessit, tiedostojärjestelmä jne., palvelevat paremmin C.: n kanssa. Älä yritä tehdä itse verkostoituminen Fortranin kanssa.
-
Helppokäyttöisyys: Fortran on lähempänä Matlabia kuin C. Kun olet päässyt läpi kaikki erilaiset avainsanat ja muuttujien ilmoittamisen, loppuosa koodi näyttää Matlabilta, mikä tekee siitä helpommin saatavan käyttäjille, joilla on rajoitettu ohjelmointikokemus. Yhteentoimivuus: Kun luot rakenteen C: hen, todellisten tietojen asettelu on suoraviivainen ja deterministinen.Fortranissa, jos käytät osoitinmatriiseja tai jäsenneltyjä tietoja, tietojen todellinen asettelu on voimakkaasti kääntäjäriippuvainen, ei suoraviivainen. Voit soittaa C: lle Fortranista ja päinvastoin, mutta älä aloita ajatella, että voi olla yhtä helppoa siirtää muuta kuin staattinen taulukko yhdestä toiseen ja takaisin.
Tämä kaikki on hieman hämmentävää, matalan tason juttua, mutta tämä on korkean suorituskyvyn tietojenkäsittely, josta puhumme, eikö? Jos et ole kiinnostunut siitä, miten taustalla olevaa laitteistoa voidaan parhaiten hyödyntää paradigmat, ts. parhaiden algoritmien toteuttaminen ja / tai kehittäminen jaetulle / hajautetulle muistille, ketjuille, SIMD-vektorille , SIMT-tekniikkaa käyttävät grafiikkasuorittimet ja niin edelleen, sitten olet vain matematiikassa tietokoneella.
Tämä on pitkittynyt kaikkeen, mitä tarjoin, joten tässä on yhteenveto – joukko kotiin viemistä erilaisia viestejä:
- Kirjoitat parhaan koodin voit sillä kielellä, jota tiedät parhaiten.
- Kahden samaa kääntöpuolta käyttävän kääntäjän tuottaman koodin laadussa ei ole eroa – huonot koodit yhdellä tai toisella kielellä kirjoittavat me t.
- Huolimatta alhaisemman tason tuntemuksestaan, Fortran on melko korkean tason abstraktio, eikä se anna sinun käyttää tiettyjä laitteisto- / käyttöjärjestelmävälineitä suoraan, SIMD, ketjut, verkkoyhteydet jne. …
Kommentit
- Hyvä vaste. En ’ usko, että viimeinen kommenttisi on kuitenkin välttämättä totta. Olen ’ itse C-ohjelmoija, mutta saat pääsyn matalatasoisiin asioihin Fortranissa hyvien ohjelmointikäytäntöjen avulla. Ihanteellinen tapa hyödyntää asioita, kuten SIMD-toimintoja, on kirjoittaa koodi, joka ehdottaa sitä voimakkaasti (esimerkiksi estää silmukat) ja antaa kääntäjän tehdä se puolestasi. Käytä langoitukseen yksinkertaisesti openMP: tä (pthreads on myös käyttökelpoinen jonkin verran ylimääräistä työtä varten). Fortranilla on kaikki mainitsemasi asiat ’ t, vain tyypilliselle käyttäjälle tärkeällä tasolla: numeerinen.
- @ Reid.Atcheson: No , jos estät kaiken niin, että kääntäjä saa sen kiinni, se toimii automaattisesti sekä C: ssä että Fortranissa. Ongelma on kuitenkin, kuinka pitkälle haluat luottaa kääntäjääsi? Ja miksi haluat luottaa siihen tapauksissa, joissa tiedät tarkalleen mitä haluat tehdä? OpenMP tekee ketjuttamista, kyllä, mutta lohkona. Voit huijata sen hankkimaan erilaiset säiejoukot tekemään erilaisia asioita, mutta se on vain väärinkäyttämistä OpenMP: ssä. Fortranin Pthreads ovat vain kääreitä C-toiminnoille. Olen kuitenkin samaa mieltä siitä, että Fortran on helpompaa, jos ’ et pääse yksityiskohtiin.
- Varmasti et ole ’ t saa täydellisen 99%: n huipputehokkuuden kääntäjän luotettavaksi, mutta voit helposti tulla melko lähelle. Tämän lisäksi sinun on joko käytettävä sisäistä tai sisäistä ASM: ää. Sinun on tehtävä myönnytyksiä jonnekin ohjelmoijan yleisen tehokkuuden vuoksi, että ’ s miksi ohjelmointikielet ovat aluksi olemassa. Siinä vaiheessa, kun olet todella tarpeeksi hullu, jotta pääset sisään luonnosta tai ASM: stä (olen ollut muutama kerta), Fortran ei ole kainalosauva. ’ tiedät kuinka linkittää koottuun käsin optimoituun koodiin joka tapauksessa.
- @ Reid.Atcheson: No, minä ’ väittää, että rinnakkaisissa HPC-sovelluksissa saatat päätyä selvästi alle 99 prosentin huipputehokkuuden … Ja gcc-vektorityypit tekevät sisäisten ominaisuuksien käytöstä ei-ongelman 🙂
- @Pedro, Loistava viesti. Ehdottomasti loistava. Kiitos lähettämisestä.Löysin sen vain kävelemällä satunnaisesti mielenkiintoisissa säikeissä.
Vastaus
15 vuoden ajatteluni tieteellisistä ohjelmistoista : Jos koodisi toimii 25% nopeammin, koska kirjoitat sen Fortraniin, mutta sen kirjoittaminen vie neljä kertaa niin kauan (ei STL: ää, vaikeuksia monimutkaisten tietorakenteiden toteuttamisessa jne.), Niin Fortran voittaa vain, jos kulutat merkittävän osan päiväsi piilottaa peukaloita ja odottaa laskelmien päättymistä. Ottaen huomioon, että melkein meille kaikille arvokkain asia on oma aika, johtopäätös on seuraava: käytä kieltä, jonka avulla voit kehittää, virheenkorjata ja testata koodiasi nopeimmin, sivuuttamatta sitä, että se voi olla hitaampaa kuin ehkä mahdollista, jos kirjoitit sen Fortranissa.
Vastaus
Lähestymistapani on ollut käyttää C ++: ta kaikkeen muuhun kuin laskennallisiin ytimiin, jotka ovat yleensä parhaita kirjoitettu kokoonpanossa; tämä ostaa kaiken perinteisen HPC-lähestymistavan suorituskyvyn, mutta sen avulla voit yksinkertaistaa käyttöliittymää esimerkiksi lataamalla ytimiä kuten SGEMM / DGEMM / CGEMM / ZGEMM yhteen rutiiniin, sanoo Gemm. Abstraktiotasoa voidaan selvästi nostaa paljon korkeammalle välttämällä raakaviitteitä ja siirtymällä läpinäkymättömiin luokkiin, mutta se on hieno ensimmäinen askel.
Minusta C ++: n suurin haittapuoli on ylivoimaisesti kokoamisajan kasvu, mutta kokemukseni mukaan säästöt kehitysajassa ylittävät sen. Toinen haittapuoli on, että myyjä C ++ -kääntäjillä on yleensä enemmän vikoja kuin toimittajan C ja Fortran kääntäjillä. Kuluneen vuoden aikana luulen, että olen törmännyt lähes kymmeneen virheeseen C ++ – kääntäjissä.
Kaiken tämän sanottuani uskon, että matalalla kielellä (ja Fortranilla) kirjoitettujen tieteellisten pakettien kumoaminen on haluttomuus paljastaa käteviä käyttöliittymiä kehittyneille tietorakenteille: useimmat ihmiset ovat tyytyväisiä Fortran BLAS -rajapintaan, koska matriisien kuvaamiseen tarvitaan vain osoittimia ja johtavia ulottuvuuksia, mutta harvat väittävät, että tavallinen 40-kokonaislukuinen Fortran-haja-suora-ratkaisurajapinta on mitä tahansa lähellä kätevää (vrt. UHM, SuperLU, PETSc ja Trilinos).
Yhteenvetona väitän, että kokoonpanoa käytetään matalan tason laskennallisissa ytimissä, mutta ylemmän tason kieliä kaikessa muussa, varsinkin kun käytetään ei-triviaalia tietorakennetta.
Huomaa, että tämä viesti aiheutti tämän vertailun C: n ja Fortranin suorituskyvystä ytimessä $ y: = \ alpha x + y $ .
Kommentit
- Miksi ’ et luotat tavalliseen C-kääntäjään, jolla on asianmukainen optimointi, jotta pienet ytimet voidaan koota? Koodin koon ja monimutkaisuuden tasolla ero sen suhteen, mitä kääntäjä voisi vetää siitä, on epäselvä.
- Olen puhunut useiden ihmisten kanssa, jotka ovat kertoneet minulle, että heidän Fortraninsa oli myös edelleen nopeampi kuin heidän C- ja / tai C ++ -koodinsa joillekin operaatioille, kuten eksplisiittisen matriisin transponoimiseksi. En ’ en sano, että ’ on mahdotonta tehdä C- tai C ++ -koodia niin nopeasti, mutta että Fortran-kääntäjä pyrkii tekemään niin parempi työ.
- Minulla on sama kokemus ” rajoittamalla ” -avainsanaa (yksinkertainen Fortran-koodini oli aina hieman nopeammin). Mutta asiantuntemukseni on rajallinen, ja minulla ei yksinkertaisesti ole aikaa ’ minulla aikaa investoida ymmärtämään gcc: n luomaa kokoonpanoa. Joten käytän yksinkertaisesti Fortrania, se ’ on yksinkertaista ja ’ nopeaa.
- @JackPoulson: kääntäjä Väite on jotain, jonka kuulen melko vähän Fortran-yhteisöltä. Valitettavasti useimmat kääntäjät, esim. gcc tai ifc / icc, käytä eri kielen käyttöliittymiä samalle taustalle. Optimointia ja koodinmuodostusta suorittava koneisto on identtinen, ja siksi tulosten erot johtuvat todennäköisesti eroista ohjelmoijan perehtyneisyydessä taustakielen kanssa.
- Pelkästään hieman perspektiivin antamiseksi usein toistuvasta, harvoin validoidusta väitteestä, jonka mukaan Fortran on nopeampi numeerisissa ytimissä: Toisen kerran huomasimme, että harva matriisivektori lisääntyy Trilinos ’ Epetra-paketissa 30% hitaammin kuin sopimuksessa oleva. Ensimmäinen kirjoitettiin suoraan eteenpäin Fortran 77: een, jälkimmäinen suoraan C: hen ilman ’ -rajoituksen käyttöä ’. Molemmilla oli noin 10-15 riviä koodia. Tänään Trilinos käyttää koodinpalaa, joka on nostettu kaupasta.II. Olen ’ varma, että löydämme paljon tapauksia, joissa F77 on nopeampi kuin C. Kyse on siitä, että ei ’ ole universaalisti niin enää tänään.
Vastaus
Koska olen uusi täällä, etsin vanhoja kysymyksiä ja löysin tämän. Toivottavasti ei ole tabu vastata vanhoihin!
Koska kukaan muu ei ole maininnut tätä, ajattelin. Fortran 2003 on melkein täysin tuettu useimpien tärkeimpien kääntäjien (intel, ibm, cray, NAG, PCG) kanssa jopa gcc: n kanssa (pian tulossa) uusin julkaisu 4.7. Fortran 2003 (ja 2008) on olioihin orientoitu kieli, vaikkakin hieman verbokulaarisempi kuin C ++. Yksi mielestäni hyvistä asioista Fortranissa on se, että vakiokomitea näkee ”tieteellisen laskennan” ensisijaisena yleisönään (kiitän Damian Rousonia siitä, että se osoitti minulle minulle toisena päivänä).
Tuon tämän kaiken esiin niin, ettei C ++ – ohjelmoijista tule Fortranin ohjelmoijia, vaan siitä, että Fortranin ihmiset tietävät, että heillä on nyt enemmän vaihtoehtoja sen lisäksi, että he siirtyvät C ++: een tai jäljittelevät olioihin liittyviä käsitteitä Fortran 90/95: ssä.
Yksi Varoitus, jonka lisään, on se, että kääntäjissä toteutettujen asioiden verenvuodatuksella on kustannuksia. Jos aloitat suuren projektin Fortran 2003: ssa, törmäät virheisiin ja sinun on jatkuvasti päivitettävä kääntäjääsi (erityisesti jos käytät gcc: tä), vaikka tämä on parantunut huomattavasti viime kuukausien aikana!
Vastaus
C ++: n ongelma on että sinulla on lukuisia mahdollisuuksia pilata suorituskykyä, esimerkiksi käyttämällä sokeasti STL: ää, poikkeuksia, luokkia (virtuaaliset yleiskustannukset ja tasaus ongelmat), käyttäjän ylikuormitus (tarpeeton uusi / poistettu) tai mallipohjat (loputon kokoaminen ja salausvirheet vaikuttavat hyväntahtoisilta, mutta voit tuhlata tuntikausia tällä tavalla).
Ja voit silti kompensoida Fortranin joustavuuden puutteen käärimällä koodinsa skriptikielelle, kuten R, Lush, Matlab / Scilab tai jopa Python, Ruby tai Lua.
Kommentit
- On yleensä huono idea soveltaa matalan tason tekniikoita korkean tason kielillä. Esimerkiksi STL on suunniteltu toimimaan hyvin abstraktilla tasolla. On oltava tietoinen siitä, mikä käyttöliittymä on on suunniteltu, käytä sitä tähän tehtävään ja poistu sitten kääntäjien tieltä.
- Luulen, että sekä mbq ’ s että Martin ’ -pisteet ovat epäoikeudenmukaisia. Kyllä, on tapoja ampua itsesi jalkaan, jos yrität toteuttaa numeerisen vektorin lineaarisen algebran tarkoituksiin käyttämällä std :: list < double >. Mutta se ’ on typerä argumentti: ainakin C ++ : lla on linkitetty luetteloluokka voi käyttää, kun taas Fortran ei ’ t. Se ’ haluaa sanoa ” Autot ajavat niin suurella nopeudella, että voit törmätä seinään ja loukkaantua; sinun tulisi käyttää sen sijaan hevoskärryjä. ” Se ’ on vain hölmö idea roskakoriin korkean tason kieli, joka tukee myös matalaa -taso (esim. C ++) korkean tason ominaisuuksien käyttämisestä.
- @WolfgangBangerth Ei, nyt satutat Fortrania – se on kuin ” matalan tason ” bakteerit ovat ” vähemmän kehittyneitä ” kuin ihmiset . Jos haluat auton analogian, sen pitäisi olla enemmän kuin ”. Voit käyttää sekä Jeepiä että Lexusta ylittämään suoisen sivutien, mutta ensimmäisen käyttäminen satuttaa vähemmän ”.
- Arvostan mielipiteesi, mutta väitän, että Fortran ei ole ’ t yhtä kehittynyttä kuin C ++: -)
Vastaus
Kolme tosiasiaa:
-
F77-tyylinen n-ulotteinen taulukot C: ssä: Ei ongelmaa CnD : n (tosin häpeämätön pistoke) käyttämisessä.
-
F90: n moduulijärjestelmä on huonosti suunniteltu ja vihamielinen ympäristöjen luomiseen. (Moduulin nimen ei tarvitse vastata sen tiedostonimeä, esim.)
- Fortran ei tue kunnostamista hyvin. Hieman toimintojen vetäminen pois funktion edellyttää, että kosketat neljää paikkaa: todellinen koodi, muuttujalausekkeet, argumentti-ilmoitukset ja argumenttiluettelo. C pääsee käsiksi kahdella kosketettavalla paikalla. Tämä yhdistää epäonnistumisen hallita tietoja hyvin (desc alla): Koska pienimuotoinen modulaarisuus on niin tuskallista, melkein kaikki kirjoittavat jättimäisiä aliohjelmia.
Yksi henkilökohtainen vaikutelma:
- Fortran ei toimi hyvin tietojen hallintaan. Yritä palauttaa osoitin käyttäjän läpinäkymättömään tietorakenteeseen F77: ssä tai F90: ssä. (
transfer()
, tässä me tulemme)
Kommentit
- Hei Andreas! CnD on mielenkiintoinen, en tiennyt ’. Ah, kirjoitit sen. 🙂 (f90 tukee myös viipalointia, allokoitavissa taulukoille ja mikä tärkeintä – matriisin syntaksia kertomiseen, lisäämiseen ja niin edelleen.) Käytän CMakea Fortranin kanssa ja se toimii hyvin moduulien kanssa.Mikä tarkalleen on ” argumenttilista ”? En usko ’ uskoakseni käyttävän näitä, joten muokkaamiseen tarvitaan vain 3 paikkaa. C: ssä sinun on yleensä muokattava todellista koodia, parametreja ja otsikkotiedostoa, joten se ’ s myös 3 paikkaa (ehdottomasti C ++: ssa). Kyllä, transfer () ei ole ’ t erittäin mukava, mutta yleensä et ’ sitä tarvitse käytännössä.
- Nykyaikaisen fortranin uudelleenkäsittely on vähäpätöistä oikeilla IDE-tiedostoilla, kuten Photran pimennyksessä.
- ” Moduulin ’ nimi ei ’ t tarvitse täsmätä sen tiedostonimen kanssa, esim. ” Sinun täytyy olla vitsaileva, sinulla voi olla useita moduuleja yhdessä tiedostossa. Jotkut heistä ulottuvat vain pari riviä. Niitä on paljon helpompi luoda, jos sinun ei tarvitse luoda tiedostoa kullekin niistä.
- Halusin vain lisätä siihen, mitä @ user389 sanoi, kun taas Photran on hieno ja ainoa Fortran IDE, joka sallii refactorings, sen jäsennin epäonnistuu koko ajan. Toisaalta ’ ei tarvitse kommentoida sitä, että Eclipse on muistinälkäinen.
Vastaa
Fortran on optimoitu taulukko- / matriisilaskelmia varten, ja se on perusteellinen kipu kaiken tyyppisten tekstien jäsentämiseen. C ja C ++ eivät välttämättä sovi yhteen Fortranin kanssa numeerisessa laskennassa (se on lähellä), mutta minusta on paljon helpompaa käsitellä tekstiä ja organisoida tietoja (ts. Mukautettuja tietorakenteita) C / C ++: lla.
Kuten muut ovat maininneet, älä laskea dynaamisia tulkittuja kieliä (Python et al). Ne eivät välttämättä tarjoa Fortanin kasvojen sulamisnopeutta eteenpäin, mutta niiden avulla voit keskittyä enemmän laskennallisen ongelman ratkaisemiseen kuin kaikkiin toteutuksen yksityiskohtiin. Usein voit toteuttaa ratkaisun Pythonissa, ja jos suorituskykyä ei voida hyväksyä, tee jonkinlainen profilointi, tunnista ongelma-alueet ja joko optimoi koodi koodin avulla tai asenna koko ohjelma uudelleen käännetyllä kielellä. Kun ongelmanratkaisulogiikka on täsmennetty, loppu on vain toteutus, ja sen tulee olla selkeästi edustettuna kaikilla ohjelmointikielillä, kun ymmärrät perusteellisesti laskennan perusteet.
Kommentit
- Se, että ’ on oikeassa. Tekstin jäsentämiseen käytän myös Pythonia.
- Voit myös toteuttaa osan Python-komentosarjasta käännetyllä kielellä, esim. C ++ ja kiinnitä se sisään. Esim. Boost Python, Swig jne.
Vastaa
Työskentelen tällä hetkellä yhdessä kansallisista laboratorioista. Useimmat ympärilläni olevista ihmisistä on mekaanisia insinöörejä. Keskustellessamme joidenkin HPC-ryhmien ihmisten kanssa, he tekevät enimmäkseen Linuxia ja enimmäkseen C ++: ta. Ryhmä I, joka on tällä hetkellä, tekee enimmäkseen työpöytäsovelluksia, ja käytämme Windowsia laskevassa järjestyksessä: C #, FORTRAN, Python, VBA ja VB (6, ei .NET). Jotkut simulointimoottorit kirjoitettiin muissa FORTRANin kansallisissa laboratorioissa.
Vastaus
Anteeksi kaivamisen vanha säie, mutta näyttää siltä, että jopa vuonna 2015 Fortrania käytetään paljon.
Löysin juuri tämän (vaihtoehtoinen linkki ) luettelo, joka on periaatteessa luettelo 13 koodista, jotka DOE: n OCLF-laitos on hyväksynyt toimimaan 300-petaFLOPS Summit -koneella, joka asetetaan tutkijoiden saataville vuonna 2018. . Yritin löytää koodille käytetyn pääkielen (nopean google-haun perusteella) ja löysin tämän:
XGC Fortran SPECFEM Fortran ACME Fortran (Bunch of climate codes) DIRAC Fortran (Mostly) FLASH Fortran GTC Fortran HACC C/C++ LS-DALTON Fortran (some C) NAMD C/C++ NUCCOR Fortran NWCHEM Fortran QMCPACK C++ RAPTOR Fortran
Joten 13: sta koodit, vähintään 10 (pikahaun perusteella) näyttävät olevan kirjoitettu Fortraniin. Ei paha 50-vuotiaalle kielelle.
HUOMAUTUS: Tiedän hyvin, että kielivertailut ovat hyödyttömiä, mutta kun otetaan huomioon Fortranin suussa suussa käyvien ihmisten (erityisesti C ++ -käyttäjien) määrä, ajattelin, että kannattaa mainita se.
Kommentit
- Olen eri mieltä, koska kokemukseni kansallisissa laboratorioissa on ollut päinvastoin. Suurin osa Lawrence Livermoressa näkemistäni uusista projekteista on kirjoitettu C ++ – kielellä, ja suurin osa uusista (tai aktiivisesti ylläpidetyistä) huippuluokan avoimen lähdekoodin kirjastoista ODE-ratkaisijoissa, FEM-diskretisaatioissa ja yleiskäyttöisissä tieteellisissä laskentakirjastoissa näyttävät olevan C- tai C ++ -kategoriassa. Fortrania käytetään pääasiassa projekteissa, joissa käytetään olemassa olevia / vanhoja kirjastoja; En näe ’ paljon suuria, uusia Fortrania käyttäviä projekteja riippumatta siitä, mitä ajattelen kielestä.
- Jotkut tiheysfunktionaaliset teoriakoodit kirjoitetaan myös Fortran sisältää VASP ja CASTEP , vaikka kuten @GeoffOxberry huomauttaa, uusi Projektit pyrkivät ehkä kohti C ++: ta.
- @blochwave Kuten voit lukea linkistä, projektit on tarkoitettu uudelle koneelle (kiihdyttimillä jne.), joka tulee olemaan verkossa vuonna 2018.Joten se ei ole kuin he ottavat 25 vuoden koodin ja koota sen toivoen toimivan hyvällä suorituskyvyllä. Olen varma, että suuri osa yllä olevan luettelon koodeista on tai on kirjoitettu uudestaan, kuten uudessa koodissa. Useat ” uudet ” ilmastokoodit ovat myös Fortranissa, ja monet virastot käyttävät niitä useissa maissa.
Vastaus
Jack P. mielestäni yrittää sanoa, että sinun on sekoitettava. Hyvä ohjelmisto on kerrostettu huolellisesti. Eri kerrokset voivat kartoittaa luonnollisemmin tai tehokkaammin eri kielille. Valitse jokaiselle tasolle sopivin kieli. Sinun tulisi myös ymmärtää, miten kielet voivat toimia yhdessä, mikä voi vaikuttaa siihen, minkä kielen valitset mihin kerrokseen.
Parempi kysymys on, mitä esimerkkejä erinomaisesti suunnitelluista ohjelmistoista on olemassa ja joita kannattaa tutkia oppiakseen kerrostettujen ohjelmistojen suunnittelusta.