Mit Intels tbb (threading building blocks) wurde nun eine Multicore-unterstützte Variante entworfen.
Im Wesentlichen wird die riesige Aufgabe rekursiv in einzelne tasks zerlegt (Rotationsgrenzen der Steine). Die Grenzen werden jedoch lediglich bei einer Tiefe von vier Steinen aufgeteilt, da möglicherweise ansonsten unnötig Tasks erzeugt und zerstört werden müssen. (Da diese ja nichts zu tun haben, weil unter Umständen mit diesen Kombinationen keine Lösungen möglich sind) Diese werden dann von der geeigneten Anzahl an Threads (bei meinem Dualcore 2) abgearbeitet.
Schwierigkeiten dabei: Optimierung, Synchronisation, Abspeichern der Stacks (die Abarbeitung der Tasks ist mehr oder weniger zufällig, daher legt jeder Task eine Speicherungsdatei anhand seiner zugeordneten Rotationsgrenzen = eindeutige Kombination ab. Ob beim nächsten Start an den gespeicherten Lösungen weiter gearbeitet wird oder nicht, ist daher völlig egal, denn die Ergebnisse gehen nicht verloren! Diese werden halt dann später beim übernächsten Mal oder irgendwann anders weiter verwendet. Solange die Dateien nicht gelöscht werden, geht also nichts verloren! Der Task-Scheduler von Intel entscheidet nämlich, wann ein Task verarbeitet wird. Und wenn jetzt ein bereits gespeicherter Task an die Reihe kommt, wird weitergearbeitet. Hat dieser noch nichts gespeichert, fängt er halt von vorne an.)
Zusätzlich läuft im Hintergrund ein Monitorthread, der die in der Queue (high-performance concurrent_queue von Intel) abgespeicherten Lösungen auf die Festplatte knallt.
Für jeden Task wird ein eigenes Model (= Steinliste && Brett && Stack) angelegt, damit jeder Thread unabhängig arbeiten kann.
Dafür wurde gebrauch von einer atomic-Variable gemacht. (Der Monitor-Thread braucht ja Referenzen auf diese Objekte, damit er diese wieder freigeben / beenden / Lösungen holen etc. kann)
Mit einer atomic-Variable erreicht man üblicherweise viel bessere Performance-Werte, als würde man mit Mutexes / Semaphoren oder anderen üblichen Threadsynchronisationsobjekten synchronisieren.
Die Performancewerte sind einfach wahnsinnig: Nach 20 Sekunden wurden bereits über 50 Lösungen berechnet!
Mittwoch, 14. April 2010
Abonnieren
Kommentare zum Post (Atom)
Keine Kommentare:
Kommentar veröffentlichen