GNU Make

Koda sastādīšana paralēli, izmantojot Make

Koda sastādīšana paralēli, izmantojot Make

Ikviens, kas jums jautā, kā pareizi izveidot programmatūru, izdomās Make kā vienu no atbildēm. GNU / Linux sistēmās GNU Make [1] ir sākotnējā Make atvērtā koda versija, kas tika izlaista vairāk nekā pirms 40 gadiem - 1976. gadā. Veikt darbus ar Makefile - strukturētu vienkārša teksta failu ar šādu nosaukumu, kuru vislabāk var raksturot kā programmatūras veidošanas procesa būvniecības rokasgrāmatu. Makefile satur vairākas etiķetes (sauktas par mērķiem) un īpašas instrukcijas, kas jāizpilda katra mērķa izveidošanai.

Vienkārši sakot, Make ir veidošanas rīks. Tas seko Makefile uzdevumu receptei. Tas ļauj atkārtot darbības automatizētā veidā, nevis ierakstīt tās terminālā (un, iespējams, kļūdoties rakstīšanas laikā).

1. sarakstā ir Makefile piemērs ar diviem mērķiem “e1” un “e2”, kā arī diviem īpašajiem mērķiem “visi” un “tīrs”.”Darbojoties“ make e1 ”, izpilda norādījumus mērķim“ e1 ”un izveido tukšo failu. Palaižot “make e2”, tas pats tiek izdarīts mērķim “e2” un izveido tukšo failu divi. Zvans “veikt visu” izpilda norādījumus mērķim e1 vispirms un e2 tālāk. Lai noņemtu iepriekš izveidotos failus no pirmā un otrā, vienkārši izpildiet zvanu “make clean.”

Saraksts 1

visi: e1 e2
e1:
pieskarieties vienam
e2:
pieskarieties diviem
tīrs:
rm viens divi

Skriešana Marka

Parasti tiek uzrakstīts Makefile un pēc tam vienkārši palaist komandu “make” vai “make all”, lai izveidotu programmatūru un tās komponentus. Visi mērķi ir veidoti secīgā secībā un bez jebkādas paralēlizācijas. Kopējais veidošanas laiks ir laika summa, kas nepieciešama katra mērķa izveidošanai.

Šī pieeja labi darbojas maziem projektiem, bet vidējiem un lielākiem projektiem tā ilgst diezgan ilgi. Šī pieeja vairs nav aktuāla, jo lielākā daļa pašreizējo CPU ir aprīkoti ar vairāk nekā vienu kodolu un ļauj vienlaikus izpildīt vairākus procesus. Paturot prātā šīs idejas, mēs aplūkojam, vai un kā būvniecības procesu var paralēli. Mērķis ir vienkārši samazināt būvēšanas laiku.

Veikt uzlabojumus

Mums ir dažas iespējas - 1) vienkāršot kodu, 2) sadalīt atsevišķus uzdevumus dažādos skaitļošanas mezglos, veidot kodu tur un savākt no turienes rezultātu, 3) paralēli veidot kodu vienā mašīnā un 4) apvienojiet 2. un 3. variantu.

1. variants) ne vienmēr ir viegli. Tam nepieciešama griba analizēt realizētā algoritma izpildlaiku un zināšanas par sastādītāju, t.i.e., kā kompilators tulko instrukcijas programmēšanas valodā procesora instrukcijās.

2. iespēja) prasa piekļuvi citiem skaitļošanas mezgliem, piemēram, īpašiem skaitļošanas mezgliem, neizmantotām vai mazāk lietotām mašīnām, virtuālajām mašīnām no mākoņa pakalpojumiem, piemēram, AWS, vai iznomātai skaitļošanas jaudai no tādiem pakalpojumiem kā LoadTeam [5]. Patiesībā šo pieeju izmanto, lai izveidotu programmatūras paketes. Debian GNU / Linux izmanto tā saukto Autobuilder tīklu [17], un RedHat / Fedors izmanto Koji [18]. Google izsauc savu sistēmu BuildRabbit, un sarunā to lieliski izskaidro Aisila Grīnberga [16]. distcc [2] ir tā sauktais sadalītais C kompilators, kas ļauj paralēli apkopot kodu dažādos mezglos un izveidot savu būvēšanas sistēmu.

3. variantā tiek izmantota paralelizācija vietējā līmenī. Šī var būt opcija ar vislabāko izmaksu un ieguvumu attiecību jums, jo tai nav nepieciešama papildu aparatūra, kā tas ir 2. variantā. Prasība paralēli palaist Make ir zvana opcijas -j pievienošana (saīsne -jobs). Tas norāda vienlaikus izpildīto darbu skaitu. Zemāk esošajā sarakstā tiek prasīts, lai veiktu 4 darbu paralēli:

2. saraksts

$ make --jobs = 4

Saskaņā ar Amdāla likumu [23] tas samazinās būvēšanas laiku par gandrīz 50%. Paturiet prātā, ka šī pieeja darbojas labi, ja vienie mērķi nav atkarīgi viens no otra; piemēram, mērķa 5 izveide nav nepieciešama, lai izveidotu 3. mērķi.

Tomēr ir viena blakusparādība: statusa ziņojumu izvade katram Make mērķim šķiet patvaļīga, un tos vairs nevar skaidri piešķirt mērķim. Izejas secība ir atkarīga no faktiskā darba izpildes secības.

Definējiet veikt izpildes rīkojumu

Vai ir apgalvojumi, kas palīdz Make saprast, kuri mērķi ir atkarīgi viens no otra? Jā! Makefile piemērs 3. sarakstā saka:

* lai izveidotu mērķi “visi”, izpildiet instrukcijas e1, e2 un e3

* mērķis e2 prasa, lai mērķis e3 tiktu izveidots iepriekš

Tas nozīmē, ka mērķus e1 un e3 var veidot paralēli, vispirms, pēc tam e2 seko, tiklīdz ir pabeigta e3 uzbūve, visbeidzot.

3. saraksts

visi: e1 e2 e3
e1:
pieskarieties vienam
e2: e3
pieskarieties diviem
e3:
pieskarieties trim
tīrs:
rm viens divi trīs

Vizualizējiet Make Dependencies

Gudrais rīks make2graph no makefile2graph [19] projekta vizualizē Make atkarības kā virzītu aciklisku grafiku. Tas palīdz saprast, kā dažādi mērķi ir atkarīgi viens no otra. Make2graph izved grafika aprakstus punktu formātā, kurus varat pārveidot PNG attēlā, izmantojot punktu Graphviz no projekta Graphviz [22]. Zvans ir šāds:

4. saraksts

$ padarīt visu -Bnd | make2graph | dot -Tpng -o grafiks.png

Pirmkārt, Make tiek izsaukts ar mērķi “visi”, kam seko opcijas “-B”, lai bez ierunām izveidotu visus mērķus, “-n” (saīsinājums no “-dry-run”) izlikties, ka izpilda norādījumus katram mērķim, un “ -d ”(“ -debug ”), lai parādītu atkļūdošanas informāciju. Izeja tiek novadīta uz make2graph, kas izvada punktu līdz punktam, kas ģenerē attēla faila grafiku.png PNG formātā.


3. saraksta veidošanas atkarības grafiks

Vairāk kompilatoru un veidošanas sistēmu

Kā jau paskaidrots iepriekš, Make tika izstrādāts vairāk nekā pirms četrām desmitgadēm. Gadu gaitā paralēla darbu izpilde ir kļuvusi arvien nozīmīgāka, un kopš tā laika ir pieaudzis īpaši izstrādātu kompilatoru un būvniecības sistēmu skaits, lai sasniegtu augstāku paralelizācijas līmeni. Rīku sarakstā ir šādi:

Lielākā daļa no tām ir izstrādātas, ņemot vērā paralelizāciju un piedāvā labāku rezultātu attiecībā uz izveides laiku nekā Marka.

Secinājums

Kā redzējāt, ir vērts domāt par paralēlām būvēm, jo ​​tas ievērojami samazina izveidošanas laiku līdz noteiktam līmenim. Tomēr to nav viegli sasniegt, un tam ir noteiktas nepilnības [3]. Pirms pāriet uz paralēlām būvēm, ieteicams analizēt gan kodu, gan tā veidošanas ceļu.

Saites un atsauces

Kā mainīt peles rādītāja un kursora izmēru, krāsu un shēmu operētājsistēmā Windows 10
Peles rādītājs un kursors operētājsistēmā Windows 10 ir ļoti svarīgi operētājsistēmas aspekti. To var teikt arī par citām operētājsistēmām, tāpēc pati...
Bezmaksas un atvērtā koda spēļu dzinēji Linux spēļu izstrādei
Šis raksts aptvers bezmaksas un atvērtā koda spēļu motoru sarakstu, kurus var izmantot, lai izstrādātu 2D un 3D spēles Linux. Šādu spēļu dzinēju ir da...
Tomb Raider for Linux apmācība
Tomb Raider ēna ir divpadsmitais papildinājums Tomb Raider sērijai - darbības piedzīvojumu spēļu franšīzei, kuru izveidoja Eidos Montreal. Spēli gan k...