Ústav radioelektroniky Vysoké učení technické v Brně Úvod do signálových procesorů Mikroprocesorová technika a embedded systémy Přednáška 11 doc. Ing. Tomáš Frýza, Ph.D. Ver. 8-12-2014
Obsah přednášky Úvod do signálových procesorů Paralelní zpracování instrukcí a dat Architektura signálových procesorů typu VLIW Způsoby adresování operandů u signálových procesorů Programování signálových procesorů
Obsah přednášky Úvod do signálových procesorů Paralelní zpracování instrukcí a dat Architektura signálových procesorů typu VLIW Způsoby adresování operandů u signálových procesorů Programování signálových procesorů
Realizace algoritmů číslicového zpracování dat Libovolnou realizaci algoritmů číslicového zpracování dat lze provést několika způsoby s odlišnou efektivitou a náklady. Mikroprocesory pro všeobecné použití: CPU vyžadují externí paměti a podpůrné obvody (např. v PC). Mikrokontroléry. Pomocí mikroprocesorů s redukovanou instrukční sadou (RISC): Mikroprocesory využívají zřetězené zpracování (pipelining) s jednoduchými instrukcemi. Zákaznické obvody typu ASIC: Hardware jednotlivý obvodů je uzpůsoben jediné konkrétní funkci. Signálové procesory (DSP Digital Signal Processor): Největší výrobci: Texas Instruments, Analog Devices, Freescale, AT&T,... Paralelní systémy: Systémy typu MI/MD (Multiple Instruction Stream/Multiple Data Stream, viz níže), které umožňují paralelní zpracování jak instrukcí, tak i dat.
Definice signálového procesoru Definice Signálový procesor (DSP Digital Signal Processor) je mikroprocesor, příp. mikroprocesorový systém uzpůsobený pro efektivní realizaci algoritmů číslicového zpracování signálů v reálném čase. To vše s nejmenšími vynaloženými náklady. Obrázek: Řetězec zpracování dat pomocí DSP. Vývoj DSP od konce 70. let rozdělit podle využívané architektury: von Neumannova, Harvardská, architektura typu VLIW (Very Long Instruction Word), umožňující vykonávat několik instrukcí současně (viz FISHER, J.A. (Yale University, CO). Very Long Instruction Word Architectures and ELI-512. In Proceedings of the 10th Annual International Symposium on Computer Architecture ISCA 83. ISBN:0-89791-101-6.)... superskalární. Vývoj DSP spěje k paralelním systémům, kdy je vykonávaná úloha rozdělena do dílčích celků a ty jsou zpracovány současně několika funkčními jednotkami, nebo celými procesorovými jádry.
Příklady algoritmů číslicového zpracování dat Signálové procesory a procesory pro všeobecné použití (GPP General Purpose Processor) mají odlišné použití: DSP mají nižší spotřebu, proto odpadá nutnost (aktivního) chlazení jádra procesoru. GPP jsou určeny pro aplikace vyžadující velkou datovou pamět, příp. operační systém, běžící v reálném čase (RTOS Real Time Operation System). DSP jsou optimalizovány pro efektivní výpočet matematických operací součtu a součinu (viz tabulka). Tabulka: Vybrané algoritmy číslicového zpracování signálů. Typ algoritmu Způsob výpočtu NX Konvoluce signálů. y(l) = x(i) h(l i) i=0 MX Číslicová filtrace (FIR). y(l) = a(i) x(l i) i=0 N 1 X Diskrétní Fourierova transformace. X (l) = x(i) WN li i=0 N 1 X Diskrétní kosinová transformace. X (l) = x(i) CN li i=0......
Obsah přednášky Úvod do signálových procesorů Paralelní zpracování instrukcí a dat Architektura signálových procesorů typu VLIW Způsoby adresování operandů u signálových procesorů Programování signálových procesorů
Dělení paralelních systémů Paralelní systémy lze dělit (viz FLYNN, M. J. Very High-Speed Computing Systems. Proceedings of the IEEE. 1966, vol. 54, no. 12, p. 1901 1909.) podle množství paralelně zpracovaných instrukcí a dat. Dělení podle počtu procesů (instrukcí), které jsou řešeny současně: SI Single Instruction Stream vykonává jen jeden proces, či instrukci. MI Multiple Instruction Stream vnitřní struktura umožňuje výkon několika odlišných instrukcí. Dělení podle počtu datových toků, které jsou zpracovány současně: SD Single Data Stream všechna data, se kterými procesor v daném okamžiku pracuje představují právě jeden zpracovávaný datový tok. MD Multiple Data Stream data, která jsou aktuálně zpracovávána představují několik nezávislých datových toků. Paralelní zpracování instrukcí: paralelní zpracování instrukcí je umožněno vnitřní strukturou procesoru, který obsahuje několik nezávislých funkčních jednotek, příp. celých jader. Každá jednotka má obvykle odlišnou funkci, pak je instrukce pro celý procesor tvořena z několika částí, a ty jsou vykonávány současně v těchto jednotkách, dílčí části instrukce mohou být jednoduché a proto i kompilační programy (nejčastěji z jazyka C) mohou být jednodušší a efektivně rozdělit kód do co možná nejvíce jednotek. Paralelní zpracování dat: tatáž instrukce (operace) se provádí se souborem nezávislých dat. Ta mohou být tvořena např. širokými registry (32 bitů), přičemž datová slova jsou pouze 8bitová, jednou operací (např. součet dvou 32bitových registrů) je tak ale realizován součet hned 4 dvojic odlišných operandů, tento způsob zpracování výrazným způsobem zvyšuje početní výkon procesorů, především při práci s vektory.
Paralelní zpracování instrukcí a dat Paralelní zprac. instrukcí nutnost více jednotek (např.: arit., log., násobička, FPU, transfer,...). Využití paralelního zpracování instrukcí i dat je přirozeně výhodný pouze v situaci, kdy je v daném okamžiku k dispozici více operandů pro zpracování. V případě, že výsledek jedné operace je vstupem operace následující (sériová podstata zpracování), tento postup efektivní být nemůže. Úkolem programátora je tedy uspořádat data tak, aby vyhovovala paralelní struktuře MI/SI. To může také znamenat přeprogramování celého algoritmu, a případnou nutnost vložení dodatečných instrukcí. Výhody dosahované metodou SI/MD jsou tak snižovány. Snaho o maximální vytížení jader procesoru, resp. funkčních jednotek. Rychlost zpracování algoritmů je možné ovlivnit zařazením rychlé paměti (nebo skupiny pamětí) typu cache jak pro instrukce, tak i pro data. (Zavedením cache pro instrukce vytvořila firma Texas Instruments nejvýkonnější DSP rodina TMS320C64xx.) 31 0 31 16 15 0 31 24 23 16 15 8 7 0 = = = (a) (b) Obrázek: Sériové (a) a paralelní zpracování dat (b, c). (c)
Obsah přednášky Úvod do signálových procesorů Paralelní zpracování instrukcí a dat Architektura signálových procesorů typu VLIW Způsoby adresování operandů u signálových procesorů Programování signálových procesorů
Signálové procesory firmy Texas Instruments TI uvedl první generaci DSP s označením TMS32010 v roce 1982, další (TMS320C25) v roce 1986, a TMS320C50 v 1991. Tyto 16bitové procesory pracují s pevnou řádovou čárkou (Fixed-point) a jsou kódově kompatibilní. x,c2x,c5x Procesory C1x, C2x a C5x jsou založeny na modifikované Harvard architektuře s odděleným pamět ovým prostorem pro data a instrukce. C30 První DSP s plovoucí řádovou čárkou (Floating-point) TMS320C30 byl představen na konci 80tých let. C6x První zástupce rodiny C6x s pevnou řádovou čárkou, tj. DSP TMS320C6201 byl zaveden v roce 1997. Na rozdíl od předešlých fixed-point procesorů (tj. C1x, C2x a C5x) byl C62x založen na tzv. VLIW architektuře (stále používaný oddělený prostor pro data a instrukce, jako u Harvard architektury). Signálové procesory firmy Texas Instruments patří do architektury VLIW (Very Long Instruction Word), tj. s velmi dlouhým instrukčním slovem. Poslední řada DSP má označení TMS320C6000 (32bitové DSP) a obsahuje 3 rodiny procesorů: plovoucí řádová čárka (Floating-point) obsahuje FPU (Floating-point Unit): C67xx, pevná řádová čárka (Fixed-point): C62xx a C64xx. První procesor z této řady byl TMS320C6202, využívající pouze paralelního zpracování instrukcí. C64xx je doplněn paralelním zpracováním dat. C62xx je kompatibilní s C64xx i C67xx (program určený pro C62xx na nich funguje; opačně to neplatí). Pozn.: Od října 2009 k dispozici také více-jádrové DSP.
Rodina DSP TMS320C6000 firmy TI Zástupci rodiny DSP TMS320C6000 mají v podstatě stejnou CPU, také nazývanou jádro DSP. CPU obsahuje architekturu velmi dlouhého instrukčního slova (VLIW Very Long Instruction Word), kterou TI nazývají VelociTI. CPU vždy načítá až osm 32bitových instrukcí najednou CPU obsahuje 256bitovou sběrnici pro interní programovou pamět. Každá skupina takových instrukcí se nazývá instrukční paket. CPU obsahuje osm funkčních jednotek (označení L,S,D,M), 2 registrové soubory (A0 Ax, B0 Bx), a dvě datové cesty (označení A a B). Pozn.: Všechny jednotky nemusí být vytíženy; proměnný počet 32bitových instrukcí odlišnost od jiných VLIW architektur.
Struktura signálového procesoru (TI) Obrázek: Struktura signálového procesoru s plovoucí řádovou čárkou TMS320C6713.
Struktura signálového procesoru C67xx Pozn.: Následující platí pro C6713 (máme v laboratoři). Jádro DSP je rozděleno do 2 identických datových cest A, B. Každá cesta obsahuje 16 registrů pro obecné použití (32bitové) a 4 funkční jednotky:.l aritmetické operace,.s bitové operace,.d řízení přístupu do paměti,.m hardwarová násobička. Kromě své primární funkce, jsou některé funkční jednotky schopny provádět také aritmeticko-logické operace (viz tabulka). Pozn.: Signálové procesory rodiny C64xx obsahují 32 registrů pro obecné použití v každé datové cestě, tj. dvojnásobný počet oproti C6713. Tabulka: Využití funkčních jednotek podle typu operace pro DSP s pevnou řádovou čárkou C64xx. Typ operace.l.s.d.m 32bitové aritmetické operace. Dvě 16bitové nebo čtyři 8bitové aritmetické operace. 40bitové aritmetické operace. 32bitové logické operace. 32 nebo 40bitové posuny. 32bitové operace s jednotlivými bity. Násobení dvou 16bitových operandů. Dvě 16bitové nebo čtyři 8bitové násobení. Přístup do paměti čtení/zápis. Větvení programu.
Pozn.: Jádro signálového procesoru Jednotky ze sousední datové cesty mohou využívat i registrový soubor jiné datové cesty. Označení sběrnice: 1X a 2X (file cross). Vyšší počet datových sběrnic (32bitové): k uložení obsahu datových registrů do paměti slouží datové sběrnice ST1 a ST2 (store-to-memory), v opačném směru pak sběrnice LD1 a LD2 (load-from-memory). Adresní sběrnice (32bitové): Adresa požadovaných dat je generována jednou z jednotek.d na sběrnici DA1 a DA2 (data address). Pozn.: Schéma sběrnic a křížových cest na další stránce. On-chip pamět pro program i data lze v některých procesorech konfigurovat jako cache. Typické periferní obvody každého DSP jsou: řadič přímého přístupu do paměti DMA, řadič externí paměti EMIF, sériové porty, časovače/čítače,...
General-Purpose Register Files Pozn.: Sběrnice a křížové cesty mezi A a B [Tex07] Figure 2 1. TMS320C67x CPU Data Paths Data path A Data path B LD1 32 MSB ST1 LD1 32 LSB DA1 DA2 LD2 32 LSB src1.l1 src2 dst long dst 8 8 long srcá long dst dst 8.S1 src1á src2á dst.m1 src1 src2 Á dst Á.D1 long src src1 src2 src2.d2 src1 dst 8 src2 Á.M2 src1 dst Á src2 src1.s2 dst 8 long dst 32 32 Register file A (A0 A15) 2X 1X Register file B (B0 B15)
Pozn.: Pracovní registry pro všeobecné použití Hodnoty, uložené v pracovních registrech obou sad (A i B) mohou představovat: 32bitová data, 40bitová data, ukazatele na operandy. Některé registry jsou navíc určeny pro podmíněné větvení programu (viz ukázka programu) testuje se, zda hodnota v registru je/není nulová: A1, A2, B0, B1, B2. Některé registry mohou být navíc použity pro kruhové adresování (viz adresování): A4 až A7 a B4 až B7. Pozn.: 40bitová data jsou vždy uložena v registrovém páru (64 bitů). 32 LSB jsou uloženy v sudém registru, zbývajících 8 bitů je pak uloženo ve vyšším (lichém) registru. Tyto registrové páry jsou také využity pro uložení hodnot floating-point Double Precision.
Časování funkce signálových procesorů Funkce signálových procesorů je charakterizována trojicí časových intervalů: Hodinový cyklus (takt) je doba periody hodinového signálu pro synchronizaci výkonu jádra DSP. Strojový cyklus odpovídá době provedení jedné fáze zřetězeného zpracování instrukcí (pipelining): určitý počet hodinových taktů např. pro dekódování operandů, jejich sečtení, generace adresy pro přístup do paměti,... u DSP s architekturou VLIW trvá jeden strojový cyklus právě jeden hodinový cyklus. Instrukční cyklus je doba provedení jedné instrukce nebo instrukčního paketu. Instrukční cyklus je závislý na typu instrukce. U VLIW (TI) jsou: jednoduché aritmetické operace složeny pouze z jednoho strojového cyklu, násobení (fixed-point): 2 cykly, násobení (single precision): 4 cykly, násobení (double precision): 9 cyklů, přístup do paměti: 5 cyklů.
Instrukční paket architektury VLIW Tvorbě instrukčních paketů je podřízeno programování v jazyce symbolických adres DSP: na jednotlivé pakety se lze odkazovat pomocí návěští (např. u podmíněných či nepodmíněných skoků), u dílčích instrukcí v paketu to nelze. Celý paket se chápe jako celek a stejně tak se načítá do řídicí jednotky při výkonu programu. Zápis instrukčního paketu v jazyce symbolických adres: 1 loop : ; n á v ě s t í 2 lddw.d1 A4++, A7 : A6 ; n a p l n ě n í r e g i s t r ů A7 : A6 3 lddw.d2 B4++, B7 : B6 ; n a p l n ě n í r e g i s t r ů B7 : B6 4 mpysp.m1x A6, B6, A5 ; A5 = A6 x B6 5 mpysp.m2x A7, B7, B5 ; B5 = A7 x B7 6 [ A1 ] b.s2 loop ; pokud A1!=0 skoč na l o o p
Obsah přednášky Úvod do signálových procesorů Paralelní zpracování instrukcí a dat Architektura signálových procesorů typu VLIW Způsoby adresování operandů u signálových procesorů Programování signálových procesorů
Způsoby adresování operandů Výpočet adres pro čtení/zápis operandů v registrech nebo v paměti provádí jednotka generování adres AGU (Address Generation Unit): využívá se celočíselná aritmetika (tedy ne zlomkový tvar viz přednáška Číselné soustavy v mikroprocesorové technice), obsahuje vlastní ALU jednotku(y) a datové/řídicí registr(y) pro nastavení způsobu adresování, obecně nejčastější způsoby u DSP jsou: lineární adresování (přímé/nepřímé), adresování modulo, adresování v bitově reverzním pořadí. Přímé adresování operandů: operand instrukce obsahuje přímo zadanou adresu, kde v paměti se nachází hodnota pro výkon instrukce. Pozn.: U TMS320C6000 není tento způsob využit. Nepřímé adresování hodnot operandů: operand instrukce obsahuje adresu, kde je v paměti uložena hodnota pro výkon instrukce. Je to tedy ukazatel na hodnotu, označení: *nazev registru
Nepřímé adresování operandů Jako ukazatel může být použit libovolný registr. Při použití instrukcí pro přístup do paměti je možné měnit hodnotu ukazatele: inkrementace/dekrementace před/po vykonání adresace. relativní změna o větší počet pozic, adresace bez změny ukazatele. Tabulka: Změna hodnot ukazatelů při nepřímém adresování. Změna hodnoty Před adresací Po adresaci Inkrementace *++rx *rx++ Dekrementace *--rx *rx-- Větší zvýšení *+rx[konst] *rx+[konst] Větší zmenšení *-rx[konst] *rx-[konst] Beze změny *rx *rx
Pozn.: Příklad nepřímého adresování operandů Tabulka: Načtení dat z paměti do registru: ldw *A10, B1 (Load from memory), doba výkonu 5 cyklů. Název registru/pozice Před výkonem Po výkonu instrukce B1 0x0000 0000 0x0000 1234 A10 0x0000 0100 0x0000 0100 Pamět ová pozice 0x100 0x0000 1234 0x0000 1234 Tabulka: Uložení hodnoty do paměti: stb A1, *--A10 (Store to memory), 3 cykly. Název registru/pozice Před výkonem Po výkonu instrukce A1 0x0012 3456 0x0012 3456 A10 0x0000 0101 0x0000 0100 Pamět ová pozice 0x100 0x0000 1111 0x0012 3456 Pamět ová pozice 0x101 0x1111 1111 0x1111 1111
Adresování operandů modulo Kromě lineárního způsobu adresování (hodnota ukazatele se konstantně zvyšuje/snižuje) je u DSP častým způsobem adresování tzv. adresování modulo (kruhová pamět ): v datové paměti se vyhradí blok určité délky a pouze v něm se pohybuje ukazatel operandu, až ukazatel obsahuje nejvyšší možnou adresu a instrukcí se provede další zvýšení, je do ukazujícího registru automaticky nahrána nejnižší adresa ve vyčleněném bloku, Pozn. velikost bloku je možné vybrat jen z pevně daných možností (viz registr AMR Addressing Mode Register). Příklad použití kruhové paměti: periodické čtení koeficientů filtru, dvojice ukazatelů pro ukládání přijatých/vyslaných dat do paměti.
Adresování operandů v bitově reverzním pořadí Generování adresy v bitově reverzním pořadí je nejméně běžný způsob adresování. Využívá se pouze u speciálních algoritmů, které vstupní/výstupní data přerovnávají z běžného pořadí do jiného. Příkladem je algoritmus rychlé Fourierovy transformace FFT (Fast Fourier Transform), která je často realizována pomocí DSP: jsou-li vstupní vzorky pro výpočet FFT v přirozeném pořadí, tj. 0, 1, 2,..., je pořadí bitů u indexu výstupních vzorků v obráceném pořadí (LSB na prvním místě, MSB poslední): 000 2 =0 001 2 =1 010 2 =2 011 2 =3... 111 2 =7. 000 2 =0 100 2 =4 010 2 =2 110 2 =6... 111 2 =7. Z důvodu usnadnění výpočtu FFT, obsahují DSP hardwarovou část, která realizuje toto přehození bez zásahu programátora tj. provádí adresování v bitově reverzním pořadí.
Princip algoritmu FFT x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) x(8) x(9) x(10) x(11) x(12) x(13) x(14) x(15) W 0 0 16 W 0 0 8 W 1 0 W 16 8 1 0 W 2 0 W 16 8 2 0 W 3 0 W 16 8 3 0 W 4 0 W 16 8 0 1 W 5 0 W 16 8 1 1 W 6 0 W 16 8 2 1 W 7 0 W 16 8 3 1 W 0 1 W 16 8 0 0 W 16 1 1 W 8 1 0 W 16 2 1 W 8 2 0 W 16 3 1 W 8 3 0 W 16 4 1 W 8 0 1 W 16 5 1 W 8 1 1 W 16 6 1 W 8 2 1 W 16 7 1 W 8 3 1 W 0 0 4 W 1 0 4 W 0 1 4 W 1 1 4 W 0 0 4 W 1 0 4 W 0 1 4 W 1 1 4 W 0 0 4 W 1 0 4 W 0 1 4 W 1 1 4 W 0 0 4 W 1 0 4 W 0 1 4 W 1 1 4 X(0) X(8) X(4) X(12) X(2) X(10) X(6) X(14) X(1) X(9) X(5) X(13) X(3) X(11) X(7) X(15) Obrázek: Struktura algoritmu pro výpočet FFT (DIF: Decimation In Frequency, N = 16).
Signálové procesory firmy Texas Instruments Dosažitelný početní výkon procesorů se udává v jednotkách: MIPS Milion Instructions Per Second pro fixed-point procesory. MFLOPS Million Floating point Operations Per Second pro floating-point procesory. MMACS Million Multiply-Accumulate Cycles per Second. BDTI Benchmarky od Berkeley Design Technology, Inc. Tabulka: Početní výkon vybraných signálových procesorů. Procesor f CPU [MHz] MIPS/MFLOPS MMACS C6203B 300 2 400 600 C6455 1 200 9 600 9 600 C6713B (float.) 300 2 400 MIPS/1 800 MFLOPS 600 C6727B (float.) 350 2 800 MIPS/2 100 MFLOPS 700 C6474 1 200 28 800 28 800 (1 jádro) (3 jádra) (3 jádra) C6678 1 000/1 250 160 GFLOP 1 320 GMAC 1 (1 jádro) (8 jader) (8 jader) C672x od roku 2005 3 jádra říjnu 2009 (TMS320CC6474) 8 jader listopad 2010 (TMS320C6678) 1 Patrně vztaženo na instrukční cyklus a nikoliv na sekundu?!
Testy Berkeley Design Technology, Inc., http://www.bdti.com/ BDTI DSP Kernel Benchmarks TM nejrozšířenější test algoritmů signálového zpracování dat: speed: BDTImark2000, memory use: BDTImemMark2000, cost efficiency: BDTImark2000/$, area efficiency: BDTImark2000/mm2, energy efficiency: BDTImark2000/Watt. Obsahuje 12 nejpoužívanějších algoritmů DSP (viz tabulka). Udává skóre procesoru. BDTI Video Kernel Benchmarks TM soubor 6 algoritmů používaných při zpracování video signálů; (uplatnění např. set-top boxy, multimediální mobilní tel., dohledové systémy, video konference,...); BDTI poskytuje referenční zdrojové kódy i testovací data: Deblocking filter, 8x8 inverse discrete cosine transform, 4x4 inverse integer transform, Motion compensation, Motion estimation, Image resize. BDTI Video Encoder and Decoder Benchmark video. BDTI Optical Flow Benchmark video surveillance, driver assistance, and mil-aero applications.... BDTI H.264 Decoder Benchmark video. BDTI OFDM Receiver Benchmark komunikace.
Algoritmy pro BDTI DSP Kernel Benchmarks Obrázek: 12 algoritmů používaných v testu BDTI DSP Kernel Benchmarks TM.
Výsledky BDTI DSP Kernel Benchmarks (floating-point, May-2013)
Výsledky BDTI DSP Kernel Benchmarks (floating-point, May-2013)
Obsah přednášky Úvod do signálových procesorů Paralelní zpracování instrukcí a dat Architektura signálových procesorů typu VLIW Způsoby adresování operandů u signálových procesorů Programování signálových procesorů
Programování signálových procesorů Na rozdíl od programování 8bitových mikrokontrolérů je vývoj aplikací pro signálové procesory zahajován vždy ve vyšším jazyce. Postup při vývoji nové aplikace: (1) Naprogramovat celou aplikaci v jazyce C. 1 i n t main ( v o i d ){ 2 s h o r t a = 0 x40 ; // d e k l a r a c e l o k á l n í c h proměnných 3 s h o r t b = 0 x20 ; 4 i n t y ; 5 6 y = ( a + b ) << 1 ; // y = 2 x ( a+b ) 7 8 w h i l e (1) ; // nekonečná smyčka 9 r e t u r n (1) ; // v ý s t u p n í hodnota f u n k c e = 1 10 } (2) Provést analýzu real-time zpracování: ANO Konec vývoje aplikace. NE Využít optimalizační nástroje vývojového prostředí, příp. bod (3). (3) Přeprogramování časově náročné části pomocí speciálních funkcí pro překladač, příp. pomocí tzv. lineárního jazyka symbolických adres. (4) Provést analýzu real-time zpracování: ANO Konec vývoje aplikace. NE Bod (5). (5) Přeprogramovat kritickou pasáž v jazyce symbolických adres.
Programování v jazyce C Při programování v jazyce C lze kombinovat několik možností: celý kód v jazyce C, použití speciálních funkcí překladače tzv. intrinsic, kritické pasáže přepsat pomocí lineárního JSA (soubory *.sa) a ty volat z jazyka C, kritické pasáže přepsat pomocí funkcí v JSA (*.asm) a ty volat z jazyka C. Speciální funkce překladače intrinsic funkce překladač zamění jednou, příp. několika instrukcemi: 1 i n t abs ( i n t src ) ; // a b s o l u t n í hodnota 2 i n t add2 ( i n t src1, i n t src2 ) ; // s o u č e t 3 i n t mpy ( i n t src1, i n t src2 ) ; // n á s o b e n í
Pozn.: Kombinace zdrojového kódu v JSA a v jazyce C Obecně platí zásada, že vyšší programovací jazyk C se při programování DSP používá pro inicializaci aplikace a pro nekritické pasáže kódu (z pohledu velikosti nebo rychlosti). Kritické části je vhodné z hlediska absolutní kontroly rychlosti a velikosti přeloženého kódu programovat v jazyce symbolických adres, příp. v tzv. lineárním JSA: funkce v JSA i v C používají stejné registry. Mohou si také vyměňovat parametry/výsledné hodnoty, názvy veškerých proměnných či funkcí definovaných v C musí být v JSA uvozeny, Pozor registr B3 vždy obsahuje návratovou adresu z funkce v JSA. 1 i n t main ( v o i d ){ // f u n k c e u l o ž e n á v souboru. c 2... 3 y = asmfunction ( a, b ) ; // v o l á n í f u n k c e v JSA 4... 5 } 1 _asmfunction : ; f u n k c e u l o ž e n á v souboru.asm 2... ; t ě l o f u n k c e 3 b B3 ; skok na n á v r a t o v o u a d r e s u
Pozn.: Vstupní parametry/výstupní hodnota funkce v JSA Funkce v JSA může obsahovat až 10 vstupních parametrů. Ty jsou vždy postupně uloženy v registrech A4, B4, A6, B6, A8, B8, A10, B10, A12 a B12. Pokud funkce vrací hodnotu, je nutné ji před návratem z funkce uložit do registru A4. Funkce se ukončí skokem na návratovou adresu, tj. B B3. Příklad Jaké hodnoty obsahují registry A4 a B4 před a po vykonání funkce y = asmfunction( a, b ), která realizuje operaci y = 2 (a + b)? Necht hodnoty a = 64 a b = 32.
Pozn.: Volání funkce v JSA z jazyka C 1 // SOUBOR: f 1. c 2 extern i n t asmfunction ( short, short ) ; // p r o t o t y p f u n k c e 3 // kód f u n k c e v j i n é m souboru 4 i n t main ( v o i d ){ 5 s h o r t a = 0 x40 ; // d e k l a r a c e l o k á l n í c h proměnných ; 8 b i t o v é 6 s h o r t b = 0 x20 ; 7 i n t y ; // 32 b i t o v á proměnná 8 9 y = asmfunction ( a, b ) ; // v o l á n í f u n k c e v JSA 10 11 w h i l e (1) ; // nekonečná smyčka 12 r e t u r n (1) ; // v ý s t u p n í hodnota f u n k c e = 1 13 } 1 ; SOUBOR: f 2. a s m 2.global _asmfunction ; d e f i n i c e g l o b á l n í h o parametru NUTNÉ 3 4 _asmfunction : ; v o l a n á f u n k c e 5 add.d1x A4, B4, A4 ; A4 + B4 = A4 6 s h l.s1 A4, 1, A4 ; A4 << 1 = A4 7 b.s2 B3 ; skok na n á v r a t o v o u adresu, t j. na r e g i s t r B3 8 nop 4 ; č a s o v á n í i n s t r u k c e B, k t e r á t r v á 5 c y k l ů
Pozn.: Lineární jazyk symbolických adres TMS320C6000 Při programování v JSA signálového procesoru TMS320C6000 je potřeba specifikovat názvy registrů a především respektovat časování jednotlivých instrukcí: např. instrukci pro přístup do paměti je nutné doplnit 4 instrukce NOP, přístup do paměti trvá 5 strojových cyklů; 1. cyklus @ spuštění instrukce; načtená/uložená hodnota je k dispozici za další 4 cykly. Lineární JSA je jakýmsi mezikrokem mezi JSA a jazykem C. Umožňuje snadnější práci pro programátora, ale ponechává mu značnou kontrolu nad výsledným kódem: je možné používat symbolické názvy registrů, včetně předávaných parametrů (podobně jako proměnné v jazyce C), správné časování výkonu instrukcí provádí překladač automaticky, programuje se přímo pomocí instrukcí bez nutnosti specifikovat funkční jednotku. Kód je překladačem optimalizován mezi volné jednotky.
Pozn.: Ukázka aplikace v lineárním jazyce symbolických adres Zdrojový kód uložený v souboru s koncovkou *.sa musí obsahovat několik částí: identifikace symbolu/funkce definovaného v jiném zdrojovém souboru pomocí direktivy.global, specifikace začátku funkce prostřednictvím direktivy.cproc, konec funkce:.endproc, přiřazení vstupních hodnot proměnným za.cproc, deklarace proměnných (symbolické označení registrů):.reg, návratová hodnota funkce + ukončení funkce:.return. 1 ; SOUBOR: f 2. s a 2.global _asmfunction ; d e f i n i c e g l o b á l n í h o parametru NUTNÉ 3 4 _asmfunction :.cproc a, b ; p ř i ř a z e n í hodnot od vstupních operandů 5.reg y ; e k v i v a l e n t l o k á l n í proměnné 6 7 add a, b, y ; a + b = y 8 s h l y, 1, y ; y << 1 = y 9 10.return y ; funkce v r a c í hodnotu y 11.endproc ; konec f u n k c e v LJSA
Pozn.: Kombinace programovacích jazyků Tabulka: Srovnání početní náročnosti 8bodového součtu součinů (SoP). Program. jazyk Číselná reprezentace Počty cyklů Jazyk C Floating-point 404 Jazyk C Fixed-point 352 LJSA Floating-point 203 LJSA Fixed-point 166 JSA Floating-point, VLIW 50 Tabulka: Optimalizační nástroje v prostředí Code Composer Studio (1-D FFT, 1-D DCT). Algoritmus Míra optimalizace Počty cyklů FFT, N = 8 855 FFT, N = 8 -o0 642 FFT, N = 8 -o1 288 DCT, C, N = 8 651 DCT, C, N = 8 -o0 591 DCT, C, N = 8 -o1 214 DCT, LJSA, N = 8 267 DCT, LJSA, N = 8 -o0 263 DCT, LJSA, N = 8 -o1 90
Pozn.: Implementace MAC Multiply-Accumulate (převzato: BROOKERS, M., WARD, W.) A0. A15 Fast MAC using Natural C Memory.D1.M1.L1.S1.D2.M2.L2.S2 Controller/Decoder B0. B15? J@5G(H7DFG(.(n? J@\G(H O DF]M? J@5G(H O =5]M-=7H5.(@7o5=7H p qd-=7h5-]m? J@5G(H7r(o5Dtsvu N?@7Adn-s\u N -Mwv.(@5o7=7HN -[\[7pCq r(o5dt[\scd j-k O = j-kn7xzy 4769698#L NO O >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>O N 8#P8#Q#)R456;698 Q#S+T!Q#4 47)+)!UWV)+X Y!Z([\[\]Y!^(LY+_ `` 47)+)!UWV)+a b!z([\[\]b!^(lb+_ `` 038#c#:d8eV03X(fgY!_(]b+_(]Y+h `` 038#c#:d8eV 03a(fgY!^(]b+^(] b+h `` Y+)+)!:#8eV47X Y!h(]Y+i(]Y+i `` Y+)+)!:#8eV47a b!h(]b+i(]b+i ``Mj Y+X(klb V:#a 456;698 ``MjY+X(kl:#m+b V:#X Y!X(]X(]Y!X NO O >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>O
Pozn.: Implementace MAC (1/9) The Core of DSP : Sum of Products The C6000 Designed to handle DSP s math-intensive calculations Mult.M y = MPY.M a, x, prod ALU.L ADD.L y, prod, y 40 a n * x n n = 1 Note: You don t have to specify functional units (.M or.l) Where are the variables?
Pozn.: Implementace MAC (2/9) Working Variables : The Register File 16 registers Register File A a x prod y..m.l y = 40 a n * x n n = 1 MPY.M a, x, prod ADD.L y, prod, y 32-bits How are the number of iterations specified?
Pozn.: Implementace MAC (3/9) Loops: Coding on a RISC Processor 1. Program flow: the branch instruction B loop 2. Initialization: setting the loop count MVK 40, cnt 3. Decrement: subtract 1 from the loop counter SUB cnt, 1, cnt
Pozn.: Implementace MAC (4/9) The S Unit : For Standard Operations 16 registers Register File A a x cnt prod y..s.m.l loop: y = 40 a n * x n n = 1 MVK.S 40, cnt MPY.M a, x, prod ADD.L y, prod, y SUB.L cnt, 1, cnt B.S loop 32-bits How is the loop terminated?
Pozn.: Implementace MAC (5/9) Conditional Instruction Execution To minimize branching, all instructions are conditional [condition] B loop Execution based on [zero/non-zero] value of specified variable Code Syntax Execute if: [ cnt ] cnt 0 [!cnt ] cnt = 0
Pozn.: Implementace MAC (6/9) Loop Control via Conditional Branch Register File A a x cnt prod y..s.m.l loop: y = 40 a n * x n n = 1 MVK.S 40, cnt MPY.M a, x, prod ADD.L y, prod, y SUB.L cnt, 1, cnt [cnt] B.S loop 32-bits How are the a and x array values brought in from memory?
Pozn.: Implementace MAC (7/9) Memory Access via.d Unit 16 registers Register File A a x cnt prod y *ap *xp *yp.s.m.l.d loop: y = 40 a n * x n n = 1 MVK.S 40, cnt LDH.D *ap, a LDH.D *xp, x MPY.M a, x, prod ADD.L y, prod, y SUB.L cnt, 1, cnt [cnt] B.S loop Data Memory: x(40), a(40), y How do we increment through the arrays?
Pozn.: Implementace MAC (8/9) Auto-Increment of Pointers 16 registers Register File A a x cnt prod y *ap *xp *yp.s.m.l.d loop: y = 40 a n * x n n = 1 MVK.S 40, cnt LDH.D *ap++, a LDH.D *xp++, x MPY.M a, x, prod ADD.L y, prod, y SUB.L cnt, 1, cnt [cnt] B.S loop Data Memory: x(40), a(40), y How do we store results back to memory?
Pozn.: Implementace MAC (8/8) Storing Results Back to Memory Register File A a x cnt prod y *ap *xp *yp Data Memory: x(40), a(40), y.s.m.l.d loop: y = 40 a n * x n n = 1 MVK.S 40, cnt LDH.D *ap++, a LDH.D *xp++, x MPY.M a, x, prod ADD.L y, prod, y SUB.L cnt, 1, cnt [cnt] B.S loop STW.D y, *yp