2010-11-21 27 views
2

Pouvez-vous penser à des moyens d'améliorer considérablement un moteur traditionnel comme ID Tech 3? En essayant de le faire sur le sous-système audio, j'ai remarqué qu'il inflige un ralentissement plutôt qu'une accélération. Je soupçonne que de gros morceaux de données doivent être calculés en boucle et communiquent rarement avec le noyau.Quel type d'optimisations peut-on réaliser sur un moteur de jeu traditionnel à un seul thread comme ioquake3 avec OpenMP?

Répondre

2

Je ne sais rien au sujet de ioquake3 ou id Tech 3 mais un peu juste sur OpenMP donc je vais tirer la bonne question à vous.

OpenMP était, au départ, développé pour distribuer des itérations en boucle sur de grands réseaux à travers des processeurs avec accès à la mémoire partagée. Ceci est une exigence dans une grande partie des programmes scientifiques et d'ingénierie, il n'est donc pas surprenant que OpenMP soit beaucoup utilisé pour de tels programmes.

Plus récemment, avec OpenMP 3.0, il dispose de bonnes installations pour la décomposition des tâches directeur/travailleur qui étend son champ d'application. Je n'ai pas beaucoup d'expérience avec ces nouvelles fonctionnalités, mais elles semblent prometteuses.

La question pour vous est la suivante: Dans quelle mesure votre base de calcul correspond au modèle de calcul qui prend en charge OpenMP?

+0

On dirait que openMP est plus pour plusieurs processus, alors qu'un jeu rapide voudra plusieurs threads dans le même processus. –

+0

@Mark Storer - pas vraiment, OpenMP est presque toujours implémenté en tant que threads puisque la plupart des o/s travaillent très dur pour empêcher des processus séparés de partager de la mémoire. C'est le type de parallélisme présent dans le calcul qui (dis) qualifie OpenMP. –

0

OpenMP est très efficace lors d'un fonctionnement sur des données qui ne dépendent pas d'autres éléments dans la boucle. Par exemple:

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

optimiserait bien avec OpenMP, mais

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); 
} 

ne serait pas.

Vous pouvez également jouer avec les paramètres OpenMP pour voir si elles améliorer vos résultats. Pour plus d'informations, http://www.amazon.com/Multi-Threaded-Engine-Design-Jonathan-Harbour/dp/1435454170 a tout un chapitre sur OpenMP (ainsi que boost, posix-threads et Threads Windows).