Încerc să vin cu o euristică pentru a estima câtă energie (să zicem, în Jouli) a consumat un proces sau un fir între două puncte de timp. Aceasta este pe un computer (Linux/x86), nu pe un dispozitiv mobil, deci statisticile vor fi folosite pentru a compara eficiența energetică relativă a calculelor care necesită un timp de ceas de perete similar.

hardware

Ideea este de a colecta sau eșantiona statistici hardware, cum ar fi contorul de ciclu, stările p/c sau frecvența dinamică, accesele la magistrală etc. și să vină cu o formulă rezonabilă pentru utilizarea energiei între măsurători. Ceea ce întreb este dacă acest lucru este posibil și cum ar putea arăta această formulă.

Unele provocări care îmi vin în minte: 1) Contabilizarea corectă a contextului trece la alte procese (sau fire).

2) Contabilizarea corectă a energiei utilizate în afara procesorului. Dacă presupunem I/O neglijabile, asta înseamnă mai ales RAM. Cum afectează cantitatea de alocare și/sau modelul de acces consumul de energie? (Adică, presupunând că am o modalitate de a măsura alocarea dinamică a memoriei pentru a începe, de exemplu, cu un alocator modificat.)

3) Folosirea timpului procesorului ca estimare este limitată la contabilitatea grosieră și deseori greșită, numai la utilizarea energiei procesorului și presupune frecvențe de ceas fixe. Include, dar nu contează bine, timpul petrecut așteptând pe RAM.

5 Răspunsuri 5

Este posibil să puteți obține o cifră pentru consumul de energie al procesului dvs., dar va fi corectă numai în mod izolat. De exemplu, dacă ați rulat două procese în paralel, este puțin probabil să încadrați o linie dreaptă cu o precizie bună.

Acest lucru este suficient de greu de realizat pe platformele încorporate cu o rupere completă a fiecărei șine de tensiune, darămite pe un computer în care singurul dvs. punct de date este puterea de la priză. Lucruri pe care va trebui să le măsurați și să le aveți în vedere:

  • Încărcarea de bază nu este atât de mică. Un sistem inactiv pentru multe secunde va fi într-o stare de somn mai profundă decât una care nu este. Măsurați somnul „profund” sau pur și simplu inactiv? De unde știi pe care îl măsoară?
  • Încărcarea nu este întotdeauna liniară. Tensiune variabilă: unele componente schimbă tensiunea în sus/în jos în funcție de sarcină și frecvență. Temperatura: poate merge în ambele sensuri în aceste zile (nu doar fuga termică).
  • Sursele de alimentare nu sunt la fel de eficiente la toate sarcinile. Dacă măsurați puterea de ieșire, trebuie să aveți în vedere acest lucru. De exemplu, ar putea fi 50% eficient sub 100W, 90% de la 100-300W și până la 80% 300W+.
  • Procesele suplimentare nu se vor adăuga neapărat liniar. De exemplu, odată ce DDR nu mai funcționează, sarcina sa de bază crește, dar procesele suplimentare nu vor înrăutăți acest lucru. Acest lucru este și mai imprevizibil cu mai multe nuclee și frecvențe variabile.

Modul de bază de măsurare este modul evident: înregistrați numărul de wați în repaus, numărul record de wați în utilizare, scădeți. Puteți încerca să rulați la un ciclu de funcționare de 50%, 25%, 75% și așa mai departe, pentru a desena un grafic frumos (liniar sau altfel). Aceasta va arăta orice neliniaritate. Din păcate, eficiența conversiei față de sarcină atât pentru regulatorul CPU, cât și pentru PSU va fi cauza dominantă. Nu puteți face mult pentru a elimina acest lucru fără a avea o versiune de dezvoltare a plăcii de bază cu care jucați (puțin probabil) sau dacă aveți norocul să aveți un alimentator cu un grafic de eficiență vs sarcină.

Cu toate acestea, este important să ne dăm seama că aceste puncte de date sunt corecte doar în mod izolat. Puteți face o treabă destul de bună de modelare a modului în care aceste lucruri se vor rezuma în sistem, dar fiți foarte conștienți că este doar o bună aproximare în cel mai bun caz. Gândiți-vă că este echivalent cu a privi un cod C pentru un codec audio și a estima cât de repede va rula. Puteți obține o idee generală bună, dar așteptați-vă să fiți extrem de inexact atunci când măsurați în realitate.

Editați - Extindeți puțin, deoarece cele de mai sus nu răspund cu adevărat la modul în care ați putea face acest lucru.

Măsurarea consumului de energie: obțineți un contor de putere exact. După cum am menționat, dacă nu aveți o modalitate de a sparge șinele individuale de tensiune și de a măsura curentul, singura măsurare pe care o puteți face este la priză. Alternativ, dacă aveți acces la starea de monitorizare a sănătății de pe placa de bază și care are rapoarte curente (amperi) (rare), acest lucru vă poate oferi o precizie bună și timpi de răspuns rapid.

Deci, măsurați puterea de bază - alegeți orice situație vă gândiți ca „bază”. Rulați testul și măsurați „vârful”. Scade, gata. Da, este destul de evident. Dacă aveți ceva în care diferența este atât de mică încât se pierde în zgomot, puteți încerca să măsurați consumul de energie în timp (de exemplu, kWh). Încercați să măsurați o oră la ralanti față de o oră, procesul se termină și vedeți diferența totală de energie. Repetați în mod similar pentru toate tipurile de test pe care doriți să le efectuați.

Veți obține diferențe vizibile de putere pentru utilizatorii mari de procesor, DDR și GPU. Este posibil să observați diferența dintre algoritmii constrânși L1 vs L2 vs DDR (DDR folosește mult mai multă putere), dacă aveți grijă să observați că algoritmii constrânși L1/L2 rulează mai repede - trebuie să țineți cont de energia utilizată pentru fiecare „sarcină” nu putere continuă. Probabil că nu veți observa accesul la hard disk (de fapt este doar un watt sau doi și se pierde în zgomotul de pe un PC), altul decât performanța. Un punct de date suplimentar care merită înregistrat este cât de mult crește încărcarea „de bază” dacă aveți o sarcină care se trezește la fiecare 100 ms sau cam așa, folosind 1% din CPU. În principiu, așa arată inactivitatea fără somn profund. (Acesta este un hack și 100ms este o presupunere)

Rețineți că 1% poate fi diferit de 1% la un alt moment, dacă aveți un procesor cu politici de schimbare a frecvenței activate.

O ultimă notă importantă: este, desigur, energia pe care ar trebui să o măsurați, exact așa cum ați intitulat întrebarea. Este foarte ușor să faci greșeala de a evalua comparativ consumul de energie dintr-o sarcină față de alta și să concluzionezi că una este mai scumpă. dacă uitați de performanța relativă a acestora. Acest lucru se întâmplă întotdeauna cu jurnaliștii de tehnologie proastă care compară hard diskul vs SSD, de exemplu.

Pe platformele încorporate cu monitorizare actuală pe mai multe șine, am făcut măsurători până la nanojoule pe instrucțiune. Este încă dificil să se țină cont de consumul de energie pe fire/proces, deoarece există o mulțime de sarcini care sunt împărțite de multe sarcini și poate crește/scădea în afara perioadei sale de timp. Pe un computer, nu sunt sigur că veți reuși să obțineți o granulație atât de fină ca asta:)