HeadlinesBriefing HeadlinesBriefing.com

Optimisation du Performances de l'Allocateur de Pile

Hacker News •
×

Lors de la programmation d'applications haute performance telles que les jeux vidéo, les développeurs recherchent des astuces pour écrire du code rapide qui maximise les ressources limitées. L'allocation de mémoire est critique pour le code critique en termes de performance nécessitant une mémoire variable. Un "bump allocator" ou un allocateur de pile optimise cela en traitant l'allocation comme une simple addition d'entiers et la désallocation comme une assignation d'entiers encore moins coûteuse.

Vers 2010, alors que je travaillais chez Surreal Software sur le projet annulé "This is Vegas," la programmation d'animation a rencontré des allocations temporaires fréquentes pour le mélange d'animations. Ces allocations n'existaient que brièvement à chaque image et dépendaient des personnages actifs, déterminés par le frustum de la caméra. L'allocateur est apparu comme un point chaud dans le profilage.

La solution consistait à implémenter un allocateur de pile où l'allocation n'est qu'une addition d'entiers, et libérer de la mémoire est une seule assignation d'entiers. En allouant un bloc fixe (par exemple, 1 Mo) et en maintenant une variable "tos" (top of stack), la gestion de la mémoire est devenue presque instantanée. Le résultat a été une amélioration significative des performances, avec des temps d'allocation mesurables dans les profils.

Une limitation clé est que cet allocateur ne détruit pas automatiquement les destructeurs ; alors que le placement new peut gérer les constructeurs, la gestion des destructeurs est manuelle et sujette aux erreurs. De plus, les allocateurs de pile brillent dans les environnements multithreadés si la variable "tos" utilise une addition atomique, permettant à plusieurs threads d'allouer à partir du même pool, bénéfique dans les situations de CPU fork/join ou les algorithmes GPU. Les désallocations partielles sont également possibles, en mémorisant l'état "tos" au début des processus récursifs et en le réinitialisant à la fin.

La technique offre des gains de vitesse substantiels pour les besoins en mémoire temporaire pendant une image de jeu.

Source: Hacker News · Résumé par HeadlinesBriefing