Als zweiten Punkt in seiner Keynote beschäftigte sich Muller mit der Frage, wie man die Rechenleistung durch architektonsiche Verbesserungen, also nicht mit immer höheren Taktfrequenzen oder mehr Cores, verbessern kann.
Ausgehend von ARMs Big.LITTLE-Prozessing-Modell stellt er einen Ansatz aus der ARM-Forschung vor, der an sich nicht neu ist, allerdings noch nicht bei Allzweck-Prozessoren eingesetzt wurde: SIMT (Single Instruction Multiple Threads). Dieses Verfahren wurde von NVIDIA für Grafik-Prozessoren (GPUs) entwickelt und wurde von ARM offenbar für Forschungszwecke in einen Allzweck-Prozessor portiert (Bild). Au seiner SIMT-Warteschlange werden Instruktionen parallel in drei Pipelines (Integer, Gleitkomma und Laden/Speichern) abgearbeitet, was den Vorteil hat, dass gegenüber anderen Programmiermodellen z.B. mit dem C++-Modell weitergearbeitet werden kann.
Natürlich gibt es auch andere Methoden zur Beschleunigung, diese haben allerdings einen hohen Portierungsaufwand. In der Tabelle zeigte Muller einige Alternativen auf, um den bekannten Matrizen-Multiplikations-Benchmark SGEMM zu beschleunigen. Ausgangspunkt war einen Implementierung in gewöhnlichem “C”, schon ARMs NEON-Engine mit ihren SIMD-Befehlen führte zu einer Verbesserung um Faktor 15 – der Portierungsaufwand ist allerdings nicht vernachlässigbar. Wird das ganze in Assembler umgeschrieben, steigt der Durchsatz sogar um Faktor 26, allerdings auf Kosten eines gigantischen Codierungsaufwandes.
Bleibt man in C und nutzt ARMs SIMT-Architektur, schlängt man 2 Fliegen mit einer Klappe: Die Berechnung beschleunigt sich um Faktor 35, während der Anpassungsaufwand gering ist. Mit Loop-Unrolling steigt die Beschleunigung sogar auf Faktor 44.
Der einzige Weg, die SGEMM-Applikation noch weiter zu beschleunigen, ist eine Portierung auf eine GPU – hier sit sogar Faktor 136 drin, allerdings ist der Aufwand auf Grund der völlig unterschiedlichen Programmiermodelle von CPU und GPU riesig.
SGEMM-Implementierung | Beschleunigungsfaktor | Portierungsaufwand |
---|---|---|
ARM in C | 1 | Gering |
ARM in C mit NEON-SIMD-Befehlen und Prefetching | 15 | Mittel bis Hoch |
ARM in Assembler mit NEON-SIMD-Befehlen und Prefetching | 26 | Hoch |
SIMT-ARM in C | 35 | Gering |
SIMT-ARM in C und Loop-Unrolling | 44 | Gering bis Mittel |
Mali GPU (4-Wege-Prozessing) | 136 | Hoch |
Darstellung unterschiedlicher Wege, die Applikation SGEMM, einen Matrizen-Multiplikations-Benchmark, zu beschleunigen. Quelle: ARM