# Aufgabe 5: Parallelisierung Spielsuche

## Am Beispiel des Brettspiels Abalone
HPC-Praktikum SS07

### 1. Minimax

Zur Einarbeitung in die für die spätere Parallelisierung benötigten Codeteile soll zunächst eine sequentielle Minimax-Suchestrategie entwickelt werden. Implementieren sie die Minimax-Suchestrategie für Abalone in einer Klasse MinimaxStrategy mit OneLevelStrategy als Vorlage und SearchStrategy::_maxDepth als Tiefe, bis zu der Minimax suchen soll; Aufrufbeispiele und Details zum Code sind in der README-Datei zum Code zu finden.

Welche Leistung (Einheit "Bewertete Stellungen pro Sekunde") erreichen Sie bei Nutzung "bester" Compileroptionen auf der Altix bei verschiedenen Maximal-Suchtiefen (2,3,4,5) bezogen auf

- die Anfangsposition des Spiels
- die Position in "position-midgame1"
- "position-midgame2" und
- "position-endgame"?

Notieren sie sich auch die absolute Anzahl durchgeführter Bewertungen. Hinweis: "Bewertungen/s" gibt "player -v ..." aus.

### 2. Parallelisierung Minimax

Parallelisieren Sie die Minimaxsuche entweder mit OpenMP (eventuell mit Workqueuing-Konstrukten; siehe Manual des Intel Compilers) oder MPI mit einer geeigneten Parallelisierungsstrategie (für MPI müssen Sie player.c:main() entsprechend abändern).

Welchen Speedup bekommen Sie für die in (1) beschriebenen Parameter, also bezogen auf der Performance-Wert "Bewertungen/s" für 2,4,6,8 Prozessoren? Wann kann der erreichbare Speedup von der aktuellen Stellung abhängen?

Hinweis:

- Überlegen Sie, welche Variablen bei der Parallelisierung mit OpenMP als privat deklariert werden müssen. Dazu gehören bei C++ auch Objekte, die in jedem Thread privat vorhanden sein müssen, damit sich die Threads keine Daten überschreiben (z.B. das Objekt für die Spielposition).

### 3. Einfache Parallelisierung Alpha-Beta

Der vorgegebene Alpha-Beta-Alogrithmus (ABID) lässt unnötige Bewertungen aus. Um wieviel Prozent sinkt die absolute Anzahl bewerteter Stellungen in den in Teilaufgabe (1) notierten Fällen?

Was wäre eine einfache Parallelisierung des Alpha-Beta-Algorithmus? Implementieren Sie Ihre einfache Strategie. Der Suchparallelisierungs-Overhead ist der Prozentsatz an unnötig durchgeführten Bewertungen. Wie hoch ist dieser Overhead in ihrer einfachen Strategie bei 2,3,4,6 Prozessoren und den in Teilaufgabe (1) vorgegebenen Stellungen? Welche Probleme hat die Parallelisierung ausserdem? Hinweise kann eine Speedup-Kurve geben (und bei MPI-Code der Traceanalyzer!).

### 4. Effiziente Parallelisierung Alpha-Beta

Um zu einer besseren Parallelisierung zu gelangen, ist eine gut ausbalancierte Partitionierung des erwarteten Berechnungsaufwandes wichtig. Man kann davon ausgehen, dass der Alpha-Beta Suchbaum mit passender Heuristik der minimalen Form sehr nahe kommt. Wie sieht diese aus? Fündig wird man in "Lu: Parallel Search of Narrow Game Trees", siehe HPC-Webseite. In der Arbeit sind auch Parallelisierungsstrategien beschrieben. Eine wichtige Strategie ist PVSplit, die in einem minimalen Alpha-Beta-Suchbaum die Kinder der sogenannten ALL-Knoten in einer Tiefensuche parallel behandelt. Implementieren Sie PVSplit in OpenMP oder MPI für Abalone. Geben Sie entsprechend zu Aufgabe 3 Speedupwerte für ihre Parallelisierung von PVSplit an.

Hinweise:

- Bei Nutzung von OpenMP sollten Sie hier Workqueuing-Konstrukte einsetzen
- Welche Bedingung und Codestelle bezeichnet einen ALL-Knoten in PVSplit? Genau an diesen Stellen muss parallelisiert werden.