2010-11-21 5 views
2

Können Sie sich überlegen, wie Sie einen herkömmlichen Motor wie Id Tech 3 deutlich verbessern können? Bei dem Versuch, es auf dem Audio-Subsystem zu tun, bemerkte ich, dass es eher eine Verlangsamung als eine Beschleunigung verursachte. Ich vermute, dass große Datenmengen in Schleifen berechnet werden müssen und nur selten mit dem Kern kommunizieren.Welche Optimierungen können bei einer herkömmlichen single-threaded Game-Engine wie ioquake3 mit OpenMP erreicht werden?

Antwort

2

Ich weiß nichts über ioquake3 oder id tech 3, aber ein bisschen über OpenMP, also werde ich die Frage direkt an Sie zurückschicken.

OpenMP wurde ursprünglich entwickelt, um Schleifeniterationen über große Arrays auf Prozessoren mit Zugriff auf gemeinsamen Speicher zu verteilen. Dies ist eine Anforderung in einem großen Teil der wissenschaftlichen und technischen Programme, so dass es nicht verwunderlich ist, dass OpenMP für solche Programme viel verwendet wird.

In jüngerer Zeit, mit OpenMP 3.0, hat es gute Möglichkeiten zur Dekomposition von Director/Worker-Tasks, die den Anwendungsbereich erweitern. Ich habe nicht viel Erfahrung mit diesen neuen Funktionen, aber sie sehen vielversprechend aus.

Die Frage für Sie ist also: Wie gut passt Ihr rechnerischer Kern zu dem Berechnungsmodell, das OpenMP unterstützt?

+0

Sounds wie openMP ist mehr für mehrere Prozesse, während ein schnelles Spiel mehrere Threads in demselben Prozess wollen. –

+0

@Mark Storer - nicht wirklich, OpenMP ist fast immer als Threads implementiert, da die meisten o/s sehr hart arbeiten, um separate Prozesse zu verhindern, die Speicher teilen. Es ist die Art der Parallelität in der Berechnung, die OpenMP (dis) qualifiziert. –

0

OpenMP ist sehr effektiv, wenn Daten bearbeitet werden, die nicht von anderen Elementen in der Schleife abhängen. Zum Beispiel:

std::vector<int> big_vector(1000, 0); 
for (int i = 0; i < big_vector.size(); ++i) 
{ 
    big_vector[i] = i; 
} 

würde optimieren gut mit OpenMP, aber

std::vector<int> big_vector(1000, 0); 
for (int i = 1; i < big_vector.size(); ++i) 
{ 
    big_vector[i] = i * (big_vector[i - 1] + i); 
} 

wollte nicht.

Sie können auch mit den OpenMP-Einstellungen experimentieren, um zu sehen, ob sie Ihre Ergebnisse verbessern. Für weitere Informationen, http://www.amazon.com/Multi-Threaded-Engine-Design-Jonathan-Harbour/dp/1435454170 hat ein ganzes Kapitel über OpenMP (sowie Boost, Posix-Threads und Windows-Threads).