Suchen

Multicore-DSP der dritten Generation Leistungsfähiger Signalprozessor mit vier DSP-Plattformen

Autor / Redakteur: Andreas Straub* / Holger Heller

Der architekturunabhängige Trend bei Prozessoren aller Art ist der Wechsel von Single-Core- auf Multicore-Architekturen. Lange bevor der breite Markt (vor allem durch Multicore-CPUs für PCs) eingenommen wurde, setzte Freescale bei den digitalen Signalprozessoren bereits auf diese Technologie, um die Rechenleistung zu erhöhen, ohne die damit verbundenen Nachteile in Kauf nehmen zu müssen. Der MSC8144 gehört nun schon zur dritten Multicore-DSP-Generation. Neben einer hohen Rechenleistung zeichnet er sich durch eine hohe Integration und leistungsfähige Kommunikationsschnittstellen aus.

Firmen zum Thema

( Archiv: Vogel Business Media )

So einleuchtend die prinzipielle Idee, mehrere Prozessorkerne zu verwenden auf den ersten Blick auch ist, so birgt sie doch etliche Fallstricke, die durch eine elegante und ausgewogene Architektur vermieden werden müssen, um zu der erwarteten Leistungssteigerung zu gelangen. Ein großes Problem ergibt sich z.B. daraus, dass nun mehrere Kerne auf gemeinsame Ressourcen wie den Arbeitsspeicher und die Peripherie zugreifen möchten.

Da es in den meisten Fällen nicht klar festzulegen ist, wann ein Kern dies jeweils tun darf, wäre eine traditionelle Busstruktur ein enormer Flaschenhals. Eine effiziente Lösung für dieses Problem liefert ein blockierungsfreier Bus-Switch. Dieser erlaubt den gleichzeitigen Zugriff zwischen den Master-Busteilnehmern (Prozessoren, DMA, Caches und Peripherie) und den On-/Off-Chip-Speichern sowie den Peripheriekonfigurationsregistern. Bei einer solchen Architektur können alle Verarbeitungselemente praktisch immer mit maximalem Durchsatz arbeiten. Beim Zugriff auf denselben Speicherbereich sollte eine speicherinterne Blockstruktur dafür sorgen, dass es in der Praxis auch dort nur äußerst selten Wartezyklen durch Zugriffskollisionen gibt.

Bildergalerie

Mehr Durchsatz durch blockierungsfreie Bus-Switches

Für die Gesamtleistung eines Multi-Core-Systems wesentlich ist eine praxisorientierte hierarchisch organisierte Speicherarchitektur. Aufgrund der kurzen benötigten Zugriffszeiten ist dabei der größte Teil des Speichers nur On-Chip realisierbar. Die erste Ebene ist immer der Level-1 Cache (Daten/Instruktionen) der eingesetzten Cores. Optional kann in dieser Ebene auch ein schneller Datenspeicher sinnvoll sein (insbesondere, wenn kein Daten-Cache vorhanden ist). Dort können lokale Daten abgelegt werden. Die nächste Ebene ist entweder ein mittelmässig schneller Speicher – insbesondere zur Ablage der von allen Cores gemeinsam benutzten Programme.

Bei besonders hohen Anforderungen an die Systemleistung kann als zweite Ebene noch ein Level-2 Cache eingeschoben werden. Dieser kann gemeinsam für alle Prozessorkerne verwendet werden. In der dritten Ebene folgt entweder bereits externer Speicher, oder – falls ein Level-2 Cache verwendet wurde – eine dritte Ebene mit langsamen On-Chip-Speicher. Wichtig ist auch ein Puffer für anstehende Schreibzugriffe in den Speicher, da diese sonst den Prozessor blockieren würden.

Diese Hierarchie in Zusammenarbeit mit effektiven Prefetch-Mechanismen der Caches und einem DMA-Controller führt dazu, dass nur in Ausnahmefällen längere Wartezeiten auf angeforderte Instruktionen oder Daten auftreten. Wesentlich ist die effektive Abstimmung der verschiedenen Speichergrössen und Geschwindigkeiten. Hier sind sehr aufwändige Simulationen echter Anwendungen im Vorfeld der Chip-Entwicklung notwendig. Genauso wichtig für ein leistungsfähiges Multi-Core Design ist eine effektive Cache-Struktur. Hierbei sollte nicht nur auf einen hohen Nutzungsgrad durch Mehrwege-Set-assoziative Strukturen geachtet werden, sondern auch darauf, dass unterschiedliche Tasks sich nicht gegenseitig verdrängen. Dies ist insbesondere in Echtzeitsystemen wichtig. Erreicht werden kann es z.B. durch die Möglichkeit, Tasks zu kennzeichnen und ihnen gewisse Bereiche in den Caches zuzuweisen. Außerdem sollte es möglich sein, bestimmte Routinen in den Caches generell als nicht verdrängbar (locked) halten zu können (z.B. für Interrupts oder Kommunikation zwischen den Cores). Eine Cache-Architektur mit mehreren Ebenen (L1/L2) kann zusätzliche Leistung bei langsameren Speichern bieten und hilft die Kosten im Griff zu halten.

Inter-Core-Kommunikation regeln

Nachdem nun die Cores alle effizient Programme ausführen und auf ihre Daten zugreifen können, bleibt die Frage, wie sie denn miteinander kommunizieren können. Dies ist insbesondere zur Synchronisation verschiedener Prozesse unerlässlich. Die hierzu notwendigen Grundmechanismen sind:

  • gemeinsam benutzte Speicher und die zugehörigen Semaphore und
  • virtuelle Interrupts.

Die Semaphoren werden verwendet, um eindeutige Reihenfolgen beim Zugriff auf gemeinsam benutzte Speicher zu erhalten. Virtuelle Interrupts sind Mechanismen, um bei anderen Cores einen Interrupt auszulösen, z.B. um ein Kommunikationsprotokoll zwischen den beiden Partnern anzustossen, oder den Start oder Abschluss einer Transaktion zu signalisieren. Semaphore können sowohl in Software als auch in Hardware realisiert werden.

Grundsätzlich wird zwischen lokaler und gemeinsam genutzter Peripherie unterschieden

Grundsätzlich ist einem Multicore System zwischen lokaler und gemeinsam genutzter Peripherie zu unterscheiden. Lokale Peripherie ist jeweils nur von einem Core zugreifbar und problemlos. Gemeinsam genutzte Peripherie wird jedoch von allen Mastern im System genutzt. Da hierbei häufige Zugriffe durch mehrere Cores zu einem reduzierten Durchsatz führen würden, ist es wichtig, dass alle Peripheriesysteme mit hohem Durchsatz in der Lage sind, nach einem kurzem Anstoss durch einen Core selbstständig die angeforderten Daten zu puffern, zu selektieren und sie per DMA an den vorbestimmten Ort zu transportieren. Mittels integrierten DMA-Controllern und hoher Eigenintelligenz dieser Blöcke kann erreicht werden, dass die Belastung der Cores durch Peripherie-Interrupts minimal bleibt. Durch die blockierungsfreien Bus-Switches können dabei auch kaum Blockaden beim Transport der Daten von und zu den Peripherieblöcken auftreten.

Der MSC8144 verbindet vier Hochgeschwindigkeits-DSP-Plattformen mit einem leistungsfähigen Kommunikationsprozessor und einem großen On-board-RAM (>10 MByte) zu einem leistungsfähigen Signalprozessor für Anwendungen im Infrastrukturbereich (VoIP Gateways, Mobilfunk-Infrastruktur) oder in der Bildverabeitung (Überwachungs- und Sicherheitstechnik, Bild- und Videobearbeitung). Die vier DSP-Plattformen, der DMA-Controller, die Peripherie und die Speicher sind über einen CLASS-Bus-Switch miteinander verbunden (CLustered Arbitration and Switching System), um den bestmöglichen Durchsatz erreichen zu können. Dieser liegt für jede Verbindung durch die CLASS-Switches bei mindestens 128 Bit Breite bei 400 MHz, also bei 6,4 GByte/s. Im Blockdiagramm (Bild 1) sind die Master- und Slave-Teilnehmer am CLASS-Switch durch die entsprechende Pfeilrichtung gekennzeichnet. Die entsprechenden Bandbreiten an den verschiedenen Ports finden sich in Bild 3.

Der neue SC3400-Kern und seine Umgebung

Jede der SC3400-DSP-Plattformen (Bild 2) besteht aus dem SC3400-Kern (maximal 1 GHz Taktrate), einer MMU und den Level-1-Daten- und Instruktionscaches. Insgesamt ergibt sich daraus eine Gesamtrechenleistung von 16 GMACs. Der eigentliche SC3400-Kern ist eine Weiterentwicklung der lange eingeführten SC140(0)-Architektur. Um leichter auf höhere Taktraten zu kommen, wurde die interne Pipeline von 5 auf 12 Stufen verlängert. Die sich hieraus ergebende längere Latenz beim Wechsel des Programmflusses wurde durch einen neu hinzugekommenen Branch Target Buffer, also einen Cache für Sprungziele entschärft. Dieser enthält die jeweils wahrscheinlichste Adresse für das Sprungziel einer Verzweigung, welche dann vorsorglich bereits in den Programmfluss eingefügt wird, so dass die sich sonst ergebende Latenz durch das notwendige Leeren der internen Pipeline nicht entsteht.

Auf der Instruktionsseite wurden 66 neue Befehle ergänzt. Interessant sind neue Dual-Befehle, die es z.B. erlauben, bei nur 8 Bit Datenbreite der Operanden zwei MACs in einer ALU parallel auszuführen. Damit verdoppelt sich die mögliche MAC-Rate in solchen Fällen. Im Durchschnitt konnte durch alle Erweiterungen auch die durchschnittliche Codegrösse noch um zusätzliche 10% gesenkt werden. Der SC3400 ist nach wie vor rückwärts binärkompatibel mit den älteren StarCore-SC140(0)-Programmen. Erstmalig beherrscht der SC3400 auch Precise Exceptions, kann also nach einer Fehlerbedingung immer den Fehler erkennen und nach Korrektur der Fehlerbedingung wieder dort aufsetzen, wo der dieser auftrat.

Neu beim MSC8144 ist eine Speicherverwaltungseinheit

Neu beim MSC8144 ist eine Speicherverwaltungseinheit (MMU). Diese dient nicht nur zur Sicherung der Speicherzugriffe der Kerne, sondern auch zum Schutz einzelner Tasks untereinander. Zusätzlich ermöglicht die MMU die Nummerierung einzelner Tasks, die wiederum dazu verwendet werden kann, um den Bereich im Cache festzulegen, den dieser Task belegen darf. So kann weitestgehend verhindert werden, dass sich einzelne Tasks mit gleicher Priorität gegenseitig verdrängen.

Für die Caches wurde eine effiziente 8-Wege-Set-assoziative-Architektur gewählt, die zu einem hohen Nutzungsgrad dieser teuren Speicher führt. Jeder Core enthält jeweils einen Level-1 Daten- und Instruktionscache. Eine dedizierter M1-Speicherblock (wie z.B. bei den beiden vorhergehenden Generationen der Freescale Multi-Core DSPs) ist beim MSC8144 zugunsten des Level-1-Datencaches entfallen. Allen Cores gemeinsam ist ein Level-2-Cache, der nur für Instruktionen verwendet wird. Der große M3-Speicherblock ermöglicht es, in den meisten Anwendungen ohne externen Speicher auszukommen. Zudem ergibt sich aus der breiten 128-Bit-Anbindung dieses Speichers an den Switch ein Durchsatz, der sich extern nicht erreichen lässt. Insgesamt sieht die Speicherstruktur folgendermassen aus:

  • Ebene 1: interne Level-1 Daten- und Instruktionscaches (32 und 16 KByte)
  • Ebene 2: interner, allen Kernen gemeinsamer Level-2 Instruktionscache (128 KByte) und interner M2-Arbeitsspeicher (512 KByte)
  • Ebene 3: interner grosser M3-Speicher (10 MByte)
  • Ebene 4: externer DDR-Speicher (16/32 Bit, DDR I/II, max. 200 MHz)

Der M3-Speicher ist als 512 Bit breites DRAM ausgeführt (unterstützt 4er-Bursts) und befindet sich auf einem separaten Chip. Da sich die Anforderungen bzgl. Stromaufnahme und Geschwindigkeit bei den DSP-Kernen und dem DRAM widersprechen, wurden zwei getrennte Chipteile in einem Gehäuse integriert. So konnte die Gesamtstromaufnahme im Bereich weniger Watt erreicht werden, ohne dabei Kompromisse beim CPU-Takt oder der Stromaufnahme der Speicher eingehen zu müssen.

Intelligente Peripherie-Schnittstellen

Um die DSP-Kerne nicht durch I/O-Zugriffe zu belasten, sind alle schnellen Schnittstellen auf dem MSC8144 mit Eigenintelligenz ausgestattet worden. Besonders wichtig war dies für die serielle RapdIO-Schnittstelle (bis zu 1,25 GBit/s) und die zwei Gigabit-Ethernet-Schnittstellen, die sowohl RGMII, SGMII, RMII, MII als auch SMII unterstützen. Aber auch der Utopia Level-2 Slave-Port mit bis zu 50 MHz Datenrate (16/8 Bit, unterstützt AAL1, AAL2, AAL5 in Microcode) würde die DSPs recht spürbar belasten. Daher werden diese Schnittstellen durch den integrierten Packet-Controller gesteuert. Dieser wickelt den kompletten Datentransfer und auch die ersten Protokollschichten ab.

Er wird durch Buffer-Descriptoren im Speicher gesteuert – genau wie im CPM oder der QUICC Engine auf den PowerQUICC-Produkten von Freescale. Wie dort besteht auch hier die Möglichkeit, zusätzliche Kommunikationsprotokolle per Microcode nachzuladen. Die beiden Ethernet-Controller können ebenfalls selbstständig Frames aus dem ankommenden Datenstrom aussieben (z.B. nach IP-Adressen oder VLAN-Tag) und auf Wunsch in bis zu vier verschieden Eingangsqueues ablegen. Zusätzlich findet sich noch ein leistungsfähiger TDM-Block auf dem Baustein, der auf bis zu acht unabhängigen Links bis zu 2048 Kanäle bearbeiten kann. Ebenfalls integriert wurde ein PCI-2.2-kompatibler Controller, der als Master/Agent fungiert und bei einer Busbreite von 32 Bit mit bis zu 66 MHz arbeitet. Der gemeinsame Peripherieblock enthält zudem noch einige kleinere Schnittstellen wie I2C und einen UART. Zum Bootstrap des gesamten Bausteins fähig sind die I2C-, Ethernet-, sRIO-Schnittstellen und der PCI-Controller.

Zur Softwareentwicklung gibt es zum MSC8144 die bewährte Codewarrior-Entwicklungsumgebung und ein kostenloses RTOS (SmartDSP OS). Als Entwicklungshardware lässt sich das Application Development System (ADS) von Freescale einsetzen, das neben dem MSC8144 auch einen Kommunikationsprozessor MPC8560 enthält. Unterstützung von Drittherstellern ist angekündigt.

Ein nicht zu unterschätzendes Thema ist bei einem derartig komplexen und leistungsfähigen Prozessor das Debugging und das Finden von Systemengpässen. Daher wurden neben einer erheblichen Erweiterung der On-Chip-Debugschnittstelle OCE auch an allen leistungskritischen Stellen Zähler zur Messung von Latenzen, Systemdurchsätzen etc. integriert, die eine vielfältige Protokollierung des Datenflusses im Baustein ermöglichen. Dadurch lassen sich komplexe Multiprozessoraufgaben optimal auf die Hardware abstimmen.

Freescale Tel. +49(0)89 92103559

*Andreas Straub ist Senior Field Application Engineer bei Freescale in München.

(ID:189810)