Skriv ut
Konstruktörer som nyttjar flera processorer på samma kisel har nyckeln till än mer flexibla system, skriver Ashish Dixit, vice vd för hårdvaruteknik på Tensilica.
Ashish Dixit började på Tensilica år 1998, ett år efter att företaget grundades. Dessförinnan arbetade han på Silicon Graphics med att utveckla Mips-kretsar på olika positioner, från att vara konstruktör till teknisk chef. Han var kvalitets- och tillförlitlighetsingenjör liksom logikkonstruktör på Intel mellan år 1983 och 1989. Ashish Dixit har åtta patent rörande konfigurerbara processorer och minneshantering i risc- och ciscprocessorer.
Idag har konstruktörerna fått mycket större flexibilitet då de till en rimlig kostnad kan utnyttja flera processorer i inbyggda system. Det är ofta lättare att tilldela olika processorer olika uppgifter än att försöka planera in samtliga beräkningar i en enda snabb processor.

Utvecklingen av flerprocessorbaserade systemkretsar (system-on-chip, SoC) har börjat ta fart. Flera processorer utnyttjas i en rad konsumentelektronik, från billiga bläckstråleskrivare till mobiltelefoner. De flesta nya nätverksprocessorer bygger på konstruktioner med flera processorer. Cisco Systems CRS-1, världens snabbaste router, utnyttjar 188 processorer på en enda krets samt flera kretsar inom systemet.

En uppgiftsbaserad analys visar hur flera processorer kan utnyttjas effektivt i ett system. Uppgifter som till största delen är oberoende kan tilldelas olika processorer, där kommunikationen mellan uppgifterna hanteras med hjälp av överförda meddelanden och en delad minnesdatastruktur. Varje enskild uppgift som utförs i en viss processor kan accelereras med hjälp av specifika instruktioner som är skräddarsydda för de vanligaste beräkningarna.

Om mer prestanda krävs kan uppgiften delas upp i parallella delar som utförs av optimerade processorer som kommunicerar med varandra. På omvänt sätt kan en processor utföra flera uppgifter som kräver liten bandbredd med hjälp av ”time-slicing”. Lösningen bryter visserligen ner parallelliteten, men den kan minska SoC-kostnaden och öka effektiviteten om processorn har tillräckligt med beräkningscykler.

I ett första steg måste man bestämma vilken prestanda systemet kräver. Om uppgifterna representeras som algoritmer i ett programmeringsspråk som C kan systemmodellering på ett tidigt stadium verifiera funktionaliteten och mäta dataöverföringen mellan olika uppgifter. På detta stadium har inga uppgifter ännu tilldelats processorerna och kommunikationen mellan uppgifterna uttrycks fortfarande i abstrakta termer.

Att göra en abstrakt systemmodellering på ett tidigt stadium tjänar som grund för att bestämma hur mycket beräkningskraft varje uppgift kräver. Informationen är inte exakt, men kan ge viktig information om såväl beräkning som kommunikation.

Systemsimulering genom hela konstruktionsprocessen ger två fördelar. Dels ger en tidig simuleringsstart insikt om flaskhalsar. Dels utvecklas modellens roll som prestandaindikator gradvis till en roll som provbänk för verifiering. För att testa ett subsystem ersätter en konstruktör subsystemets högnivåmodell med en implementeringsmodell på lägre nivå.

Det finns två regler för mappning av uppgifter till processorer. Den första är att processorn måste ha tillräcklig beräkningskapacitet för att hantera uppgiften. Den andra är att uppgifter som ställer liknande krav ska tilldelas samma processor så länge den har kapacitet att klara samtliga uppgifter.

Valet av processorn är viktigt. En styruppgift kräver betydligt fler cykler om den utförs av en enkel DSP istället för en riscprocessor. En numerisk uppgift kräver vanligtvis fler cykler i en riscprocessor än i en DSP. Å andra sidan kräver en kombinationen av risc och DSP att man använder flera programvaruverktyg vilket komplicerar utvecklingen.

Konstruktörer föredrar normalt att använda flera exemplar av samma universalprocessor. Men många 32-bitars riscprocessorer är inte snabba nog att hantera kritiska delar av vissa tillämpningar. För att nå högre presterande måste man dela upp tillämpningar så att den både hanteras av programvara i en processor samt ett maskinvarubaserat accelerationsblock. Den lösningen har dock allvarliga begränsningar.

Metoder för att konstruera och verifiera stora maskinvarublock är arbetskrävande, felbenägna och långsamma. Om kraven på den del av tillämpningen som sköts av acceleratorn förändras mot slutet av konstruktionen eller efter det att kretsen är byggd kan en ny kiselkonstruktion komma att behövas. Det ökar kostnaden samtidigt som det kan utmynna i prestandaförluster. Flytt av data fram och tillbaka mellan processor, accelerator och minne kan ge långsammare total genomströmning, som uppväger många eller alla fördelar med maskinvaruacceleration.

Ironiskt nog uteblir ofta samstämmigheten mellan processor och accelerator då tillämpningen, på grund av det sätt den är skriven, kan tvinga processorn att vara sysslolös medan acceleratorn utför nödvändigt arbete. Dessutom kommer acceleratorn att vara sysslolös under tillämpningsfaser som inte kan utnyttja den.

Konfigurerbara och förlängningsbara processorer har flera fördelar jämfört med en acceleratorbaserad konstruktion. Inte minst eftersom acceleratorfunktionen byggs in i processorn, vilket gör att man slipper kommunikationen mellan processor och accelerator.

Det konfigurerbara tillvägagångssättet gör acceleratorfunktionerna betydligt mer programmerbara och förenklar integreringen och testningen av hela tillämpningen. Det gör också att accelerationsmaskinvaran har nära tillgång till samtliga resurser hos processorn. Genom att acceleratorn läggs i en separat processor kan den sköta sin uppgift parallellt med universalprocessorn, varvid kommandon mottas via register eller delat dataminne.

När man vet ungefär hur många och vilken typ av processorer som ska användas samt uppgifterna är preliminärt tilldelade börjar konstruktionen av den grundläggande kommunikationsstrukturen. Målet är att finna den billigaste kommunikationsstruktur som uppfyller kraven på bandbredd och latens.

När låg kostnad och hög flexibilitet är viktigaste kan en arkitektur som är baserad på en delad buss, i vilken samtliga resurser är kopplade till en buss, vara lämpligaste. Den delade bussen ger dock lång och oförutsägbar latens speciellt när ett antal buss-masters tävlar om att ha tillgång till olika delade resurser.

Ett parallellt kommunikationsnätverk ger hög genomströmning och flexibilitet. Det vanligaste exemplet är en koordinatanslutning (crossbar connection) med två hierarkiska nivåer av bussar.

Traditionella processorkärnor har endast blockorienterade generella bussgränssnittet. Konfigurerbara och förlängningsbara processorer ger snabbare och mer flexibel kommunikation som använder direkta processor-till-processor-anslutningar för att minska kostnad och latens.

Minnet i ett system introducerar ytterligare kompromisser. Externa RAM är mycket billigare än inbyggda, åtminstone för stora minnen. Konstruktören måste se till behovet av minnesöverföring för varje uppgift för att säkra att de minnen som utnyttjas kan hantera trafiken. När man inte vet behovet av inbyggt RAM kan cacheminnen förbättra prestanda och delade minnen underlätta kommunikationen mellan processorer. Men det är viktigt att se upp för latens till följd av problem kring minnesaccess. En ökning av minnesbredden eller antalet aktiva minnen kan utnyttjas för att komma till rätta med flaskhalsar.

Även om processorer är ett starkt alternativ till uppgiftsspecifika logikblock har RTL-block ofta redan konstruerats och verifierats, så det är viktigt att försöka återanvända dessa. Två gränssnittsmekanismer för RTL-block används normalt. Den första mappar maskinvaruregister till ett lokalt minne. Detta gör att maskinvarublocket i mångt och mycket liknar en IO-krets och att styrprogramvaran liknar en drivkrets av standardsnitt.

Den alternativa maskinvarubaserade gränssnittsmekanismen som kan användas utökar instruktionerna till att direkt stimulera maskinvarufunktioner. Med konfigurerbara processorer kan konstruktören specificera nya processorinstruktioner som innebär att maskinvarublockens in- och utsignaler används som instruktionsbaserade operander respektive destinationer. Detta undviker användningen av intermediära register och snabbar på uppgiften väsentligt genom att man eliminerar IO-behovet.

När konstruktörer vänjer sig vid ett processorbaserat tillvägagångssätt kan processorer komma att bli ännu mer kraftfulla byggblock för nästa generation SoC-konstruktioner. Samtidigt får konstruktörerna en processorcentrerad konstruktionsmetodik med potential att lösa de ständigt ökande problemen kring integrering av maskin- och programvara.