När man snabbar upp en processor ökar strömförbrukningen och därmed effektutvecklingen. Hitintills har ansträngningarna att minska energiåtgången fokuserats på elektronikkomponenterna, men det finns en hel del energivinster att hämta även på programvarusidan.
- Det finns två sätt att göra kod energisnålare med hjälp av en kompilator. Aningen krymper man koden, eller så gör man den snabbare. Helst vill man göra båda sakerna samtidigt, vilket går fram till en viss gräns där koden istället blir större om den ska bli snabbare.
Det säger Jakob Engblom, doktorand vid Uppsala Universitet och C-kompilatorguru på inbyggnadsföretaget IAR.
Smart kod är inte snål
Många programmerare lever i villfarelsen att "smart", kompakt kod är effektivare än en mer lättförståelig men mångordig kod. Inget kan vara felaktigare. Det som är svårt för människan att läsa är lika knepigt för kompilatorn som ska omvandla koden till maskinkod. En "smart", kompakt kod tar i och för sig färre rader programkod i anspråk, men kan ofta resultera i en längre sekvens maskinkod.
Mindre kod kräver även mindre minne i bemärkelsen att det går åt färre RAM-celler vilket drar mindre energi. Detta förutsatt att man kan använda en mindre minneskapsel eller ett mindre derivat av en styrkrets.
En processor befinner sig för det mesta i ett av de två tillstånden "full fart" (som då ska vara så låg som möjligt) eller "stäng av". En av programmerarens uppgifter blir därmed att bygga ett system som är avstängt så mycket som möjligt.
Det tar en viss mängd basenergi bara att hålla en processor igång. Olika sekvenser av instruktioner i programkoden drar olika mängder energi, fast de utför samma arbete. Om flera instruktioner kan exekveras på en gång, så sprids det tidssegmentets energiåtgång över flera instruktioner, vilket gör energikostnaden per instruktion lägre.
Med Transmetas Crusoe-processor kan man ha flera instruktioner i en hårdvarukö, och sedan köra dem parallellt. Förutsatt att man har en processor med den funktionen, så kan kompilatorn ordna koden så att detta blir möjligt.
Alla CMOS-kretsar drar energi när en transistor ändrar tillstånd. Ju färre bitar som ändras i adressfält, databussar och interna processorregister, desto mindre energi går det åt, eftersom färre transistorer ändrar tillstånd. En möjlighet är att byta adresskodningen till Gray-kodning istället för binär kod, eftersom varje tillståndsförändring kostar energi. Gray-kodning innebär att man kodar tal binärt på ett sådant sätt att bara en bitposition ändras vid varje ökning med ett. Detta förutsätter att maskinvaran är organiserad på ett sätt som tillåter sådana operationer. I så fall kan kompilatorn optimera för Gray-kodning.
Idéer från pc-industrin
Strömförbrukningen är i fokus även för konstruktörer av processorer för pc-industrin. Deras lösningar är än så länge inte fullt ut användbara för inbyggda processorer, men med rätt hårdvarustöd och trimmad programvara är det en möjlighet i en inte alltför avlägsen framtid.
De flesta x86-processorer reglerar strömförbrukningen genom att växla mellan att köra med full fart och att stänga av helt. Nackdelen är att processorn riskerar att vara avstängd just när en tidskritisk tilllämpning behöver den som bäst. Det kan resultera i märkbart brus av olika slag, exempelvis tappade bildrutor i en filmsekvens.
Long-run-tekniken innebär att processorn kan reglera strömförbrukningen utan att stänga av. Istället justerar den klockfrekvensen dynamiskt, under körning. Det sker utan att operativsystemet behöver boot:as om eller utföra någon långsam operation som kan orsaka brus och störningar. Varje tillämpning körs i exakt rätt klockfrekvens, och drar därmed aldrig mer energi än vad som faktiskt krävs.
Strongarm använder också long-run-tekniken. Liknande stöd finns på den senaste mobila Athlon-processorn från amerikanska AMD. Long-run-tekniken är än så länge ett alternativ i första hand för pc-processorer.
- Det är en poppis grej idag, att dra ner både matningsspänning och klockfrekvens, det kan ge mycket energivinst, säger Jakob Engblom.
- Transmeta var bra på att sätta fokus på energiförbrukningen. Däremot offrar man väl mycket prestanda för att bli energisnåla. Crusoe säljer på energiförbrukning, vilket var den nisch som var kvar eftersom Intel och AMD säljer sina processorer på prestanda.
Cache påverkar förbrukningen
Cache-minnen ökar processorns energiförbrukning, eftersom det ger fler aktiva transistorer. å andra sidan minskar trafiken till externt minne, vilket i sig kan ge en lägre total energiåtgång, beroende på hur ofta man träffar cachen.
- Använd cachen optimalt! Det spar både tid och ström, råder Jakob Engblom.
Ett sätt att åstadkomma det är att optimera programmet med hjälp av kompilatorn för att få minimalt med cache-missar. Exempelvis kan man flytta om sina instruktioner så att block med kod som laddas in passar in på de cache-block-gränser som finns. En annan optimering kan vara att låsa vissa instruktioner som används väldigt frekvent i cachen (om hårdvaran tillåter detta).
Men processorn är bara en del av helheten. Räknar man in periferienheterna blir skillnaden kanske inte så stor i slutänden.
även en DSP-tillämpning går att få mer eller mindre strömsnål med hjälp av kodoptimering. Också här ger mer jobb per klockcykel snabbare kod och därmed en lägre energiförbrukning. Tricket är att fylla alla luckor med instruktioner, så att några instruktioner packas ihop till en fet instruktion.
även industrikonsortiet EEMBC (EDN Embedded Processor Consortium) har börjat titta på tester av energiåtgången hos inbyggda processorer.
- Vi håller på och tar fram tester just nu, säger Markus Levy, ordförande för EEMBC.
- Energitesterna kommer att verifieras av vårt certifieringslaboratorium innan de publiceras på konsortiets webbsida, www.eembc.org. Vi hoppas på att vara färdiga i slutet av 2001, säger han.
Torun Bager