Die Verwendung von Vektoroperationen hat des Weiteren gravierende Auswirkungen auf das Design der Algorithmen-Implementierungen.
Die Anpassung einer Implementierung an eine SIMDArchitektur nennt sich Vektorisierung. Bild 1 zeigt eine vektorisierte Implementierung eines FIR-Filters (Finite Impulse Response), in der ein Vektor vier Werte enthält. Zu Beginn einer jeden Iteration der äußeren Schleife wird ein Vektor mit Signalproben aus dem Speicher geholt. In der inneren Schleife multipliziert der Prozessor vier Koeffizienten-Vektoren mit dem Signalproben-Vektor, die Ergebnisse summiert er in vier Akkumulatoren auf. Nach der letzten Schleife befinden sich in diesen Akkumulatoren Teilsummen, die zum Produzieren von vier Ergebniswerten kombiniert werden müssen. Hierbei ist hervorzuheben, dass dieser Prozess in verschiedenen Bereichen ineffizient ist. Zum Beispiel muss eine Reihe von Multiplikationen mit Null explizit ausgeführt werden, und außerdem sind vier Tabellen mit Filterkoeffizienten zu erstellen (eine Tabelle für jeden Offset der Koeffizienten innerhalb der Vektorstruktur). Alternative Strukturen können für Filter mit wenigen Koeffizienten besser geeignet sein, und sogar eine skalare Implementierung kann sich als beste Variante herausstellen.
Die Sache mit dem Cache
Das Speichermanagement ist meist derjenige Faktor, der die weitreichendsten Auswirkungen auf die Performance einer PC-CPU hat, da der eigentliche Hauptspeicher (gegenüber dem Speicher eines DSP-Systems) stets langsam ist. Dieser Speicherengpass betrifft übrigens nicht nur DSP-Algorithmen, sondern die gesamte auf einem PC laufende Software. Aus diesen Gründen haben die Prozessorhersteller viel Erfindergeist in das Design von Cache-Speichern investiert, um die Langsamkeit des Speichers wirksam zu kompensieren. Die Cache-Systeme der verschiedenen PC-CPUs unterscheiden sich erheblich. Als Beispiel soll hier der Level-1-Daten-Cache des »Pentium 4« dienen (Bild 2). Dabei handelt es sich um einen »4-Way Set Associative «-Cache mit jeweils 64 Byte langen Zeilen und einer Kapazität von 8 KByte. Speicherinhalte werden stets in Blöcken zu je 64 Byte im Cache abgelegt. Welche Zeile im Cache verwendet wird, hängt von der Adresse des ersten Bytes in dieser Zeile ab, die logischerweise immer ein Vielfaches von 64 ist. Fünf Bits der Adresse dienen zur Identifikation einer von 32 Zeilen, die sich zum Cachen eines bestimmten Datenblocks nutzen lassen. Jede Zeile wird somit zum Ablegen einer ganzen Reihe verschiedener Adressregionen (Pages oder Seiten) verwendet. Um zu verhindern, dass eine Cache-Zeile durch den ersten Zugriff von/aus einer ebenfalls dieser Zeile zugeordneten Adresse überschrieben wird, gibt es für jede Zeile vier »Ways«. Überschrieben wird stets derjenige Weg, dessen Nutzung am längsten zurückliegt.
Aus dieser Architektur ergeben sich verschiedene Konsequenzen: