PC-Prozessor statt DSP?

15. April 2009, 10:26 Uhr | Peter Massam
Diesen Artikel anhören

Fortsetzung des Artikels von Teil 2

Cache-Misses vermeiden

Es gibt mehrere Verfahren, die Cache-Nutzung zu optimieren. Erwähnenswert ist jedoch die in vielen CPUs verfügbare »Prefetch«-Anweisung, die den Cache-Controller anweist, den Inhalt einer bestimmten Speicherstelle (tatsächlich sogar die gesamte Zeile, in der sich die betreffende Adresse befindet) dediziert in den Cache zu laden. Mit diesem Befehl lässt sich der Cache auf eine Instruktion vorbereiten, die zu einem späteren Zeitpunkt einen Lesezugriff auf diese Adresse ausführt. Zwar erhöht Prefetch den Verarbeitungsaufwand in einer Schleife, doch kann sie die Gesamtverarbeitungszeit erheblich reduzieren, indem sie den von einem Cache-Miss verursachten Stillstand vermeidet.

Auswirkungen auf die Verarbeitungsgeschwindigkeit hat jedoch nicht nur der Daten-Cache, sondern auch der Befehls-Cache. Den effizientesten Code erhält man, wenn man die innere Schleife eines Algorithmus’ so arrangiert, dass sie in eine einzige Cache-Zeile passt. Die meisten »x86«-CPUs besitzen separate Level-1-Caches für Befehle und Daten, und in älteren Designs sind die Cache-Speicher ähnlich gestaltet. Anders ist es bei neueren CPU-Architekturen: Hier hat man den Befehls-Cache in die CPU hinein verlagert – häufig im Anschluss an die Decodiereinheit.

Die Kapazität von Level-1-Daten-Caches liegt heute meist zwischen 8 KByte und 64 KByte. CPUs von AMD besitzen vorwiegend größere Caches, die dafür in weniger »Ways« gegliedert sind (zwei sind üblich). Dagegen findet man in Intel-CPUs tendenziell kleinere Cache-Speicher mit mehr »Ways« (meist vier). Bei Level-2-Caches gibt es keine Aufteilung in Befehls- und Daten-Caches mehr. Ebenso wie Level-1-Caches verfügen sie vorzugsweise über 64-Byte-Zeilen, während die Zahl der »Ways« in der Regel größer ist. Ihre Kapazität liegt derzeit zwischen 0 KByte (d.h. kein Level-2-Cache vorhanden) und mehreren Megabyte. Nach wie vor selten sind Level-3-Caches. Die »Phenom«-Reihe von AMD verfügt über 2 MByte Level-3-Cache, den sich die vier Cores, die jeweils mit 512 KByte Level-2-Cache ausgestattet sind, teilen.

Mittlerweile können Anwender aus einer immer größer werdenden Palette an Multicore-PC-Prozessoren wählen, wenn ein Algorithmus eine Verarbeitungsleistung auf diesem Niveau benötigt. Die Probleme, die beim Programmieren von derartiger Prozessoren auftreten, ähneln jenen, mit denen man bei der Programmierung von Multicore-DSPs (z.B. dem »ADSPBF561 « aus der »Blackfin«-Serie von Analog Devices) konfrontiert wird.

Mehrere Kerne effizient nutzen

Tatsächlich haben die vorgefundenen Besonderheiten sogar Ähnlichkeit mit jenen beim Design von Mehrprozessor-Systemen. Meist geht es um die Frage, wie sich die anstehenden Algorithmen so auf die verfügbaren Cores verteilen lassen, dass sich die optimale Performance einstellt. Möchte der Entwickler die Aktivitäten der einzelnen Cores eng miteinander verzahnen (z.B. bei der Verteilung einer FFT-Implementierung dergestalt, dass jeder Core eine der zusammengesetzten FFTs implementiert), wird der Datenaustausch zwischen den Cores kritisch. Diese Tatsache ist der Beweggrund für die Einführung des Level-3-Cache, den alle Cores gemeinsam nutzen.

Möchte der Entwickler die Aktivitäten der Cores nicht eng miteinander verzahnen, wird es schwierig, die Last so zu verteilen, dass alle Cores effizient genutzt werden (die Cores verarbeiten dann verschiedene Algorithmen und sind mit großer Wahrscheinlichkeit zu unterschiedlichen Zeiten mit ihrer Arbeit fertig). Häufig gehen Entwickler den Weg, einen Core für Management-Aufgaben zu verwenden und den beziehungsweise die anderen für DSP-Algorithmen zu nutzen. Dies dürfte wahrscheinlich ineffizient sein, jedoch ist das Design hierbei am einfachsten.

Außerdem ist dies ein klassisches Beispiel für den immer wieder erforderlichen Kompromiss zwischen der Entwicklungszeit und der Effizienz zur Laufzeit.

Die Auswahl an Compilern ist groß. Es lohnt sich jedoch, nach jenen Ausschau zu halten, welche die Vektoroperationen des Zielprozessors mit den so genannten »Intrinsics« unterstützen. Hierbei handelt es sich um Funktionen, die 1:1 einem CPU-Befehl entsprechen. Da sie jedoch als Funktionen auftreten (und nicht als Schlüsselwörter), können sie durch eine gleichwertige Implementierung ersetzt werden, wenn die gewählte Ziel-Architektur diesen CPU-Befehl nicht unterstützen sollte.


  1. PC-Prozessor statt DSP?
  2. Schnelle Evaluierung
  3. Cache-Misses vermeiden
  4. PC-Prozessor statt DSP?
  5. PC-Prozessor statt DSP?
  6. Sind PC-Prozessoren wie der »Pentium« die besseren DSPs? Tatsächlich sind solche CPUs oft mit deutlich höherer Frequenz getaktet als DSPs. Und da sie oft im Gaming-Bereich eingesetzt werden, unterstützen viele von ihnen beispielsweise auch komplexe Vektoroperationen. Doch welche Vor- und Nachteile hat es, PC-Prozessoren als DSPs einzusetzen?

Jetzt kostenfreie Newsletter bestellen!