Mekaanisen suunnittelun ohjelmistojen refaktoroinnin ymmärtäminen

Konetekniikkaohjelmisto tukee kriittisiä tehtäviä, kuten finite element analysis (FEA), computational nestettä dynamiikka (CFD), tietokoneavusteinen suunnittelu (CAD), ja monirunko dynamiikka simulointi. Kun nämä sovellukset kehittyvät käsittelemään yhä monimutkaisempia malleja, suurempia tietoaineistoja ja tiukempi suunnittelu syklit, suorituskyvyn heikkeneminen tulee yhteinen haaste. Korjaus.Refaktorointi. kurinalainen prosessi uudelleenjärjestely olemassa koodin muuttamatta ulkoista käyttäytymistään. Tarjoaa järjestelmällinen lähestymistapa vaatia nopeutta, vähentää muistijalanjälkeä, ja parantaa ylläpidettävyyttä. Toisin kuin maa-uudistus, refaktorointi asteittain parantaa koodipohjaa, jolloin se on paremmin mukautuva tulevaisuuden parannuksia säilyttäen olemassa olevia toimintoja, että insinöörit ja analyytikot ovat riippuvaisia päivittäin. Perustavan käsityksen refaktorointi, Martin Fowlers puolinaalinen työ tarjoaa periaatteita, jotka koskevat suoraan teknisiä ohjelmistokontekstit.

Yhteiset suorituskyky pullonkaulat konepajasovelluksissa

Ennen kuin sovelletaan korjausstrategioita, on tärkeää tunnistaa, missä suorituskyky kärsii. Konetekniikka-ohjelmistot usein on selvästi pullonkauloja:

  • Informatiivisten tietorakenteiden[ .
  • Punaisten laskentamenetelmien .
  • Kaapelimuistin sijainti[ .
  • Sekventiaalinen toteutus[ ... ......................................................................................................................................................................................................................................
  • Yli-abstracted liitännät[ ... ...................................................................................................................................................................................................................................

Perusteellinen profilointisessio, jossa käytetään esimerkiksi Valgrind-, perf- tai VTune-työkaluja, paljastaa, mitkä pullonkaulat ovat suurimmat. Korjaustoimien tulisi kohdistua näihin alueisiin ensin maksimoidakseen paluun vaivannäöllä.

Suorituskyvyn keskeiset korjaavat strategiat

1. Optimoi datarakenteet käyttökohteisiin

Oikean tietorakenteen valinta on yksi parhaimmista liikkeistä. Rajallisten elementtien osalta solmujen säilyttäminen hash-tauluissa tai painetuissa identtisyysluetteloissa voi vähentää etsintöjä lineaarisesta lähes vakio-aikaan. Aineelliset omaisuustietokannat hyötyvät []-arvovarastoista, jotka ovat pikemminkin muistissa kuin peräkkäisissä järjestelmissä. Kun käsitellään lajiteltuja tietoja (esim. aikasarjasensorilähdöt), tasapainotetut binaariset puut tai hyppylistat mahdollistavat nopean valikoiman kyselyt. Käytä aina erilaista karttaa. Vaihda kaikki perinteiset esineet, jotka eivät enää vastaa käyttömalleja. Jos koodi iteroituu kaikkien elementtien päälle, matriisi (tai std:: vector) tarjoaa optimaalisen välimuistin sijainnin, jos satunnaiset ID-tiedot ovat yleisiä, käytä hash-karttaa.

2. Modularize koodi eristää suorituskyky Hot Spot

Monoliittinen koodibases hämärtää missä aika kuluu. Muokkaaminen pienempiin, tarkasti määriteltyihin moduuleihin. Kuten oma ratkaisijamoduuli, esiprosessorimoduuli ja jälkiprosessorimoduuli. Mahdollistaa kehittäjien optimoinnin itsenäisesti. Esimerkiksi ratkaisija voidaan kirjoittaa uudelleen käyttäen BLAS rutiinia koskematta gui. Modularisointi myös helpottaa []-riippuvuus injektointi[], mikä helpottaa swapia optimoiduissa implementeissä (esim. kokeellinen GPU-pohjainen ratkaisija) vertailuanalyysiin. Tulos on myös koodikanta, joka voi kehittyä ilman tukkutason rewriters.

3. Esittely Cachining poistaa Redundant Work

Tekninen ohjelmisto usein toistaa identtiset laskelmat kaikissa suunnitteluiteraatioissa. Toteuttamalla in-muisti välitulosten . Esimerkiksi jäykkyys matriiseja, interpolointipainoja tai neste-kiinteistö taulukoita.Voit leikata laskenta-aikaa dramaattisesti. Käytä [aaihimmin hiljattain käytettyä (LRU) välimuistia[], jolla on asianmukaiset häätökäytännöt, joilla sidotaan muistin käyttöä. Esimerkiksi parametrisia tutkimuksia suoritettaessa välimuisti fytokopioimalla jäykkyysmatriisia niin, että useiden kuormitustapausten ratkaiseminen käyttää samaa tekijää uudelleen. Samoin välimuistimateriaali etsii tietoja, jotka ovat kalliita laskea raakadatasta. Microsoft.

4. Refaktori algoritmeja parempaan kompleksisuuteen

Joskus alkuperäinen algoritmi valittiin yksinkertaisuuden, ei suorituskyvyn. Korvaamalla O(n2) naiivi ratkaisija kanssa O(n log n) iteratiivinen menetelmä voi tuottaa järjestys-of-mirecular parannuksia. Koneenrakennus yhteyksissä, tämä saattaa tarkoittaa siirtymistä suoraan Gaussian eliminointi konjugaatti kaltevuus menetelmä harvajärjestelmien, tai korvaa raaka voima kosketustunnistus spatiaalinen häshing algoritmi. Algoritmi refaktorointi olisi aina ohjattava profilointi ja validoitu maanpinnan totuusdata. Jopa pieniä muutoksia.

5. Rinnakkaista itsenäinen työkuormat

Moderneissa suoritinjärjestelmissä on useita ydintä, mutta monet tekniset sovellukset ovat edelleen yksisäikeisiä. Rinnakkaistyön käyttöönoton refaktorointi voi avata massiivisia nopeustoistoja.

  • Tietojen yhdensuuntaisuus[ .
  • Task parallelism .

Käytä OpenMP:ää direktiiveihin perustuvassa rinnakkaisuudessa C/C++:ssa tai -moduulissa Pythonissa. GPU:n kiihdytyksessä harkitse silmukkaa uudelleen ketjuiksi käyttäen CUDA- tai SYCL-tekniikkaa. Ole kuitenkin varovainen, kun käytetään jaettua mutalisoituvaa tilaa; suosi []-kierre-paikallista varastointia[] tai atomitoimintoja rotujen välttämiseksi. Aloita rinnakkaistamalla profiloinnin aikana tunnistetut aikansa vievimmät silmukkasiteet.

6. Optimoi I/O ja Tietokannan käyttö

Tekniikka-ohjelmisto lukee usein suuria mallitiedostoja, kirjoittaa simulaatiotuloksia tai kyselyjä materiaalitietokannoista. I/O-toimintojen korjaamisella voidaan vähentää merkittävästi seinä-kello-aikaa.

  • Puskurit kirjaimet [ . Korvaa kirjainmerkkien ryhmittely lohkotasolla I/O.
  • Binaarisarjalisaatio[ . ... .....................................................................................................................................................................................................................................
  • Laiha lastaus[ .
  • Tietokantakyselyn optimointi[ . Lisää indeksit, erän syötteet ja vältä N+1 kyselyn ongelmia, kun haetaan materiaaliominaisuuksia tai testitietoja.

Suuria simulaatioarkistoja hallinnoiville sovelluksille datan käyttöoikeuden tason muuttaminen liitäntöjen yhdistämiseksi ja valmistelluilla lausunnoilla voi tuottaa johdonmukaisia hyötyjä.

Parhaat käytännöt tehokkaaseen korjaamiseen

Profiili ennen ja jälkeen

Jokaisen refaktoroinnin on perustuttava dataan. Ota näyteprofiloijalla voidaan tunnistaa kuumat kohdat, muistiprofiloija vuodon tai pirstoutumisen havaitsemiseksi ja vertailusviittien avulla mitata läpimenoa. Jokaisen muutoksen jälkeen on helppo määrittää samat vertailukohdat. Ilman profilointia on helppo optimoida jo valmiiksi nopea toiminto, mutta ei huomaa todellista pullonkaulaa.

Säilytä kattava testisarja

Refactoring muutokset sisäinen rakenne, ei ulkoinen käyttäytyminen. Vankka sarja yksikkötestejä, integrointitestejä ja regressiotestejä varmistaa, että suorituskyvyn parannukset eivät riko toiminnallisuutta. Tekninen ohjelmisto, tämä on erityisen tärkeää, koska pieni numeerinen virhe ratkaisija voi levitä viallisia suunnittelupäätöksiä. Aim korkea koodi kattavuus ydin matemaattisia rutiinit ja ratkaisija polut.

Refaktori incrementaalisesti

Big-bang rewriers ovat riskialtista ja aikaa vievää. Sen sijaan omaksua asteittain lähestymistapa: tunnistaa yksi pullonkaula, refaktori se, testi, ja siirtyä seuraavaan. Tämä minimoi häiriö jatkuva kehityssyklit ja mahdollistaa jatkuvan toimituksen suorituskyvyn parannuksia. Version ohjausjärjestelmät tekevät helpoksi palata, jos refaktorointi tuo odottamattomia hidastuksia.

Asiakirjaoletukset ja -vaihtoehdot

Kun muutat datarakennetta tai muokkaat silmukan, dokumentti siitä miksi valitsit tuon lähestymistavan. Tulevat kehittäjät (tai tuleva itsesi) ymmärtävät suorituskyvyn perusteet. Sisällytä kommenttisi odotettuihin käyttömalleihin, muistirajoituksiin ja kaikkiin ehtoihin, joissa optimointi saattaa heikentyä. Hyvä dokumentaatio muuttaa tiedon käyttöomaisuudeksi eikä mustan laatikon muutokseksi.

Suorituskyvyn parantamisen mittaaminen

Voiton määrittäminen on välttämätöntä investointien korjaamisen perustelemiseksi. Perusta perustaso käyttämällä alkuperäistä koodia edustavien työmääräjen osalta. Esimerkiksi 100k-elementtien FEA-mallin tai monimutkaisen CAD-kokoonpanon laatiminen. Kun olet korjannut korjauksen, suorita samat työmäärät identtisten laitteistokokoonpanojen alla.

  • Seinä-aika simulaation suorittamiseen
  • Huippumuistin käyttö
  • Kehysnopeus tai vaste interaktiivisten toimintojen aikana
  • Skaalattavuus mallin kokoa kasvattamalla

Julkaise nämä tulokset sisäisesti rakentaa tukea edelleen refaktorointi. Työkalut kuten []Google Benchmark (C++) tai []pytest-benchmark[ (Python) automatis performance regressio detect.

Päätelmät

Refaktorointi ei ole kertaluonteinen toiminta vaan jatkuva kurinalaisuus, joka pitää koneenrakennuksen ohjelmistot suorituskykyisinä vaatimusten kehittyessä. Järjestelmällisesti optimoimalla datarakenteet, modulaarisoimalla koodin, välimuistin tulokset, parantamalla algoritmeja, rinnastamalla työtaakkaa ja virtaviivaistamalla I/O:ta, kehitystiimit voivat tuottaa nopeampia simulaatioita, reagoivampia rajapintoja ja lopulta parempia teknisiä tuloksia. Tässä hahmotellut strategiat tarjoavat etenemissuunnitelman; avain on aloittaa profiloimalla, keskittyä korkeatehoisiin alueisiin ja tehdä asteittain refaktori joka vaiheessa testauksella. Yhtenäisen soveltamisen ansiosta suoritus muuttuu suunnitelluksi omaisuudeksi eikä jälkikäteen.