Seminar: Multi-Core Architectures and Programming Parallelisierung des Viola-Jones Algorithmus auf Tilera Hardware-Software-Co-Design Universität Erlangen-Nürnberg 1
Übersicht Einleitung Erste Versuche Implementierung Ergebnisse Komplette Parallelisierung Implementierung Ergebnisse Ergebnisse 2
Einleitung Tile Processor von Tilera Multikern-Prozessor Maschine Erhöht Durchsatz durch Einsatz von Parallelität in Anwendungen Programmierbar über ANSI C und C++ Umgebung Prozessoren verbunden über zweidimensionales Mesh Network Integriert externe Speicher- und I/O-Schnittstellen auf dem Chip Jedes Tile implementiert einen unabhängigen 32-bit Integer Prozessor 3
Einleitung 64-core TILEPro64 Tile Prozessor Tile-Prozessor Hardware Architektur, TILE PROCESSOR ARCHITECTURE OVERVIEW FOR THE TILEPRO SERIES 4
Einleitung Einzelnes Tile Unabhängig ausführbar 32-bit Integer Prozessor Bestandteile: Zwischenspeicher, Cache Prozessor Einheit Switch Einheit verbindet Komponenten Drei Operationen pro Zyklus Tile Detail, TILE PROCESSOR ARCHITECTURE OVERVIEW FOR THE TILEPRO SERIES 5
Einleitung Eigenschaften Taktung: 866Mhz oder 700MHz 64 Kerne, davon 56 zur Verfügung Parallelisierung durch Threads Synchronisation über Mutex Programmiersprache: C++ Emulierte Floating-Point Berechnung 6
Erster Versuch - Skalierung Implementierung der Bild-Skalierung Bilineare Interpolation Gewichtung der Eckpunkte mit Distanzen d und y d x Geringe Änderung des gefundenen Objekts und Radius (303,292) Radius 87 Etwa 5% Performanceverlust Ausführung der Implementierung auf Tilera ca. 100-fache Ausführungszeit 35.000ms 7
Erster Versuch - Skalierung Parallelisierung Unterteilung des Bildes in kleinere Abschnitte Skalierung der Abschnitte auf Threads aufteilen Ablauf: Thread erzeugen Parameter: Anfangs- und Endpunkt des zu skalierenden Bildes sowie Originalbild skalierte Werte in interpoliertes Bild schreiben Thread beenden Ergebnis: ca. doppelter Zeitaufwand Problem: ständiges Erstellen und Beenden der Threads Lösung: Threads bekommen Signal, wenn neues Arbeitspaket bereit ist 8
Zweiter Versuch - Skalierung Vater Erstellt einmalig alle Threads Methode zerteilt Bild und erstellt Arbeitspakete für Threads Vater signalisiert Threads über Variable ob und was zu tun ist Threads Threads warten auf Signal vom Vater Dann entweder Skalierung mit Arbeitspaket durchführen oder beenden Ergebnis: Kein Zeitgewinn gegenüber nicht-paralleler Ausführung Problem: Skalierung nicht rechenaufwändig genug um Parallelität richtig auszunutzen Lösung: Gesamte Gesichtserkennung parallelisieren 9
Dritter Versuch - Detektion Vater Erstellt nach wie vor einmalig alle Threads Vorbereitung der Arbeitspakete für die Threads Sobald keine Arbeitspakete mehr vorhanden, warten bis alle Threads fertig sind Ergebnis ausgeben Threads Threads warten auf Signal vom Vater dass Arbeitspaket vorhanden ist Detektion durchführen und anschließend Signal an Vater Ergebnis: Erhebliche Schwierigkeiten bei der Implementierung Problem: Häufiges Sperren von vielen Variablen zur Synchronisation Lösung: Gesamte Arbeit an Threads auslagern, Vater verwaltet Threads nur 10
Vierter Versuch - Detektion Vater Vorinitialisierung des Skalierungsfaktors (erste Skalierung erst mit Faktor 1,331) Erstellen der Threads mit festen Parametern und Zeigern für Result-Set und Kaskade Warten bis alle Threads zurückkehren Ausgabe der Ergebnisse Threads Holt sich eigenständig aktuellen Skalierungsfaktor und startet Detektion Beendet sich wenn Grenze für Skalierungsfaktor erreicht ist Vorteil: Nur kurzzeitiges Sperren des globalen Skalierungsfaktors nötig Einfache Parameterverwaltung Ergebnis: Erhebliche Performancesteigerung Lösung: Gesamte Arbeit an Threads auslagern, Vater verwaltet Threads nur 11
Vierter Versuch - Detektion - Vater 12
Vierter Versuch - Detektion - Thread 13
Tim e in m iliseconds Ergebnisse Average execution tim e 60000 55000 50000 45000 40000 35000 30000 25000 20000 15000 10000 5000 0 1 2 3 4 5 6 8 10 12 14 16 18 20 22 26 32 N um ber of used tiles 866 M hz 700 M H z no Tiles x86 14
Ergebnisse Tiles 1 2 3 4 5 6 8 10 12 14 16 18 20 22 26 32 866 Mhz 59365,00 29345,67 19815,00 14884,80 12026,80 9954,60 7994,80 8006,00 7997,60 8008,20 7998,80 8007,60 8016,00 8021,40 8025,00 8030,20 700 MHz 18097 15178 12984 9720 9716 9714 9720 9718 9718 9720 no Tiles x86 35784 324 Optimale Leistung bei ca. 8 bis 16 parallelen Threads Bei dieser Variante maximal etwa 18 parallele Bearbeitungen möglich Detektion auf erster Skalierung braucht mehr als 2/3 der Zeit (5783,66 ms) Verbesserungspotential: Parallelisierung der Kaskaden Fix-Point statt Floating-Point verwenden 15
Fragen? 16