Warum programmieren wir nicht die üblichen Aufgaben wie "Sortieren", anstatt sie so zu programmieren, und lassen sie dann von der Umgebung kompilieren, um die Hardware optimal zu nutzen? Auf diese Weise könnten wir Computer mit neuer spezialisierter Hardware wie Sortiernetzwerken ausliefern und es würde automatisch mit vorhandenem Code funktionieren.
programming-languages
hardware
sorting
MaiaVictor
quelle
quelle
Antworten:
Zunächst einmal kommen Computer mit spezieller Hardware . Jeder Laptop und Desktop-Computer, der seit einigen Jahren verkauft wird, verfügt über einen speziellen Co-Prozessor, eine Grafikverarbeitungseinheit, die visuelle Verarbeitungsalgorithmen verarbeitet, wie sie für Video- und Spieleanwendungen erforderlich sind. Sehr großer Computer ( zB „Supercomputer“, IBM System Z - Familie) hat eine Vielzahl von spezialisierten Prozessoren numerische Verarbeitung ( „Vektorverarbeitung“), zu handhaben etc .
Zweitens ist das Sortieren einer der am besten erforschten Aspekte des Rechnens und erweist sich als viel zu komplex, um in mehr als den einfachsten Fällen in Hardware eingebaut zu werden. Beim Sortieren dreht sich alles um Geschwindigkeit und Korrektheit. Die Geschwindigkeit hängt von der Wahl des Algorithmus, der Art und Variation der Daten sowie dem Datenvolumen ab. Die Richtigkeit hängt von der Art und dem Kontext der Daten ab. Es ist absolut trivial, ein mittelgroßes Array von Ganzzahlen zu sortieren, die in die native Wortgröße der CPU passen ( z31 oder 63 Bit plus Vorzeichen). Das Sortieren von Zeichenketten, die mehr als nur ASCII-Werte enthalten, ist äußerst komplex. IBM hat vor 20 Jahren ein Buch mit mehr als 500 Seiten veröffentlicht, in dem die Probleme von Zeichensätzen im Kontext nationaler Grenzen und allgemeiner Verwendung erörtert wurden. Und dann ist da noch die Frage nach nicht zusammenhängenden Daten: Beim Sortieren einer verknüpften Liste werden Zeiger im gesamten Speicher verfolgt.
quelle
Das Hauptproblem ist, dass Sortieralgorithmen (1) viel Flexibilität benötigen und (2) mit Hardware ohnehin nur sehr schwer zu beschleunigen sind.
Eine Sache ist, dass Sortieralgorithmen bereits schnell genug sind, um die Speicherbandbreite des Prozessors zu überschreiten - der Prozessor verbringt bereits einen großen Teil seiner Zeit damit, darauf zu warten, dass Daten hin und her in den Hauptspeicher verschoben werden. Ein hardwarebeschleunigter Sortier-Co-Prozessor oder eine spezielle Sortieranweisung hätte das gleiche Problem.
Die Art und Weise, wie diese Speicherbandbreite angesprochen wird, besteht darin, bessere Algorithmen und Datenstrukturen zu verwenden, die eine bessere "Lokalität" aufweisen, und auf diesem Gebiet wird noch erhebliche Arbeit geleistet, insbesondere "Cache-ahnungslose Algorithmen" (sie sind in dem Sinne, dass sie funktionieren, ahnungslos unabhängig von den Details des Caching, während "Cache-fähige" Algorithmen auf eine bestimmte Cache-Seitengröße usw. abgestimmt sind.
Im Gegensatz dazu verwenden Medienanwendungen (Audio und Grafik, insbesondere 3D-Grafik) einige sich sehr wiederholende Strukturen - natürlich gibt es Flexibilität, aber sie bauen auf einer großen und sehr gut strukturierten Grundlage auf. Dadurch konnte die Grafikbeschleunigung einfach mit Blitting (einer konfigurierbaren, aber immer noch sehr strukturierten Blockkopieroperation) und dem Zeichnen von Linien / Polygonen beginnen. Mit zunehmender Komplexität der Grafik- und Tonverarbeitung wurden Vektoroperationen zu einem offensichtlichen Ziel für die Optimierung - zuerst MMX (Vektoren von ganzen Zahlen), dann SSE (Vektoren von Floats). Dies bedeutete, dass es eine ziemlich genau definierte Struktur für die Funktionsweise einer 3D-Grafik-Engine gab, als die alte 3D-Grafik-Pipeline mit fester Funktion auf 3D-Grafikhardware verschoben wurde.
Bei 3D-Grafiken wird das, was früher in Hardware gemacht wurde, jetzt in Software aus Gründen der Flexibilität ausgeführt. Shader sind beispielsweise Software. Auf diese Weise erhalten wir eine große Auswahl an verschiedenen Shadern, die das Erscheinungsbild verschiedener Materialien verleihen. Diese Software funktioniert jedoch immer noch viel strukturierter als allgemeine Software und kann daher immer noch eine viel spezialisiertere Hardwareplattform verwenden. Aus diesem Grund kann Ihre Grafikkarte jetzt alles von der Physik bis zum Knacken von Passwörtern beschleunigen - Anwendungen, die ebenfalls zu demselben Modell passen und mithilfe der Befehlssätze moderner Grafikprozessoren effizient implementiert werden können.
Grafikprozessoren sind heute die geistigen oder tatsächlichen Nachkommen digitaler Signalprozessoren, die eine Art spezialisierter Prozessor für den Umgang mit digitalen Signalen (z. B. Audio) waren (und wahrscheinlich immer noch sind).
Was zu einem letzten Punkt führt - Sortieralgorithmen können durch Hardware beschleunigt werden. Abhängig von Ihren Daten kann die Sortierung mithilfe von MMX- oder SSE-Anweisungen (Single-Instruction-Multiple-Data) auf Ihrem Prozessor durchgeführt werden, aber aufgrund des Problems mit der Speicherbandbreite macht es wahrscheinlich nicht viel Sinn - vielleicht können Sie etwas energieeffizienter sein auf diese Weise jedoch. Sie können jedoch auch Ihre Grafikhardware verwenden. Auf diese Weise können Sie von der oft viel besseren Speicherbandbreite für Grafikkarten profitieren. Sie werden nicht in der Lage sein, alle Arten auf diese Weise zu ersetzen, aber es ist sicherlich möglich und wird wahrscheinlich gegebenenfalls durchgeführt.
IOW ist aufgrund der verschiedenen wirtschaftlichen und praktischen Probleme nicht wirklich sinnvoll , Hardware speziell zu entwickeln, um eine relativ enge Aufgabe wie das Sortieren zu beschleunigen. Eine Funktion, die einen größeren Aufgabenbereich beschleunigt oder vorhandene Beschleunigungshardware auf einen größeren Aufgabenbereich anwendbar macht, ist häufig viel sinnvoller.
quelle
Aber sie tun es! Sie werden Befehlssatzerweiterungen genannt. (Sachen wie SSE und dergleichen)
Bestimmte Aufgaben haben sehr schöne Implementierungen in Software. Normalerweise sind diese Implementierungen gut genug, um die Aufgabe zu erledigen, sodass keine spezielle Hardware erforderlich ist. Wenn Sie eine spezielle Hardware herstellen möchten, benötigen Sie eine Vielzahl von Anwendungen, damit sich diese lohnt.
Wenn Sie sich Hardware ansehen, mit der dies funktionieren könnte, würde ich davon ausgehen, dass Sie sich so etwas wie FPGAs ansehen. Wie Sie bei FPGAs sehen können, würde der Chip viel teurer werden, während er für viele Anwendungen nicht anwendbar wäre.
quelle