CppCon 2014 - La programmation multicœur dans les jeux C++
Une vidéo de Jeff Preshing
Le 2014-12-22 19:44:33, par LittleWhite, Responsable 2D/3D/Jeux
Jeff Preshing, architecte logiciel à Ubisoft Montréal nous montre les contraintes liés à la programmation multicoeurs dans les jeux vidéos AAA.
Dans cette vidéo, vous comprendrez mieux comment découper la boucle principale du jeu afin de paralléliser les calculs et comment utiliser les nouveautés du C++11 pour les opérations atomiques.
Bonne vidéo.
Dans cette vidéo, vous comprendrez mieux comment découper la boucle principale du jeu afin de paralléliser les calculs et comment utiliser les nouveautés du C++11 pour les opérations atomiques.
Bonne vidéo.
-
"CPU manages its cores at very low level" =
programmation multicoeurs= mulitthreading
https://software.intel.com/en-us/com...1#comment-form
Il y a une différence entre thread et coeurs du CPU:
* thread = file d'attente d'instruction asm de tous les programmes tournant sur l'OS, organisation ? pos = instruction du programme#1 , pos-1 = instruction du programme#2.
* coeurs = vitesse d'éxécution d'instruction * nbr_coeurs
le 04/01/2015 à 20:45 -
AstrayaMembre chevronné"CPU manages its cores at very low level" = programmation multicoeurs = mulitthreading
https://software.intel.com/en-us/com...1#comment-form
Il y a une différence entre thread et coeurs du CPU:Uh, cela me semble être une erreur. volatile ne fait qu'interdire au compilateur de faire le mariole avec les lecture/ecriture optimisées en registre, aucun mécanisme d'atomicité n'entre en jeu.
Et côté pédagogique, il faut par ailleurs justement marteler que les volatile n'ont rien à voir avec l'atomicité car c'est une croyance ancrée par VC++ qui n'était ainsi pas conforme au standard.
Je pense qu'il ne parle vraiment que du compilateur Visual Studio ici, les autres comme GCC je ne sais pas trop, il doit exister des options de compilations pour faire de même...On peut voir à partir de la 24min de la vidéo que le compilateur PowerPC fait un peu n'importe quoi, pourquoi changer l'ordre des instructions de manière aussi brutale ? On dirait plus un bug que de l'optimisation.Pourquoi ne pas simplement utiliser un lock ?pas optimal le code de l'exemple (try_pop/try_push): une semantics acquire/release va être suffisant et plus performant. là on a une semantics memory_order_seq_cst c'est tout à fait superflue
Il exite un très bon articile d'un autre lead de Ubisoft Montreal dans le livre Game Programming Gems 8 de Jean-François Dubé qui parle également du meme systeme. " Efficient and Scalable Mutli-Core Programming"le 05/01/2015 à 16:09 -
MoDDiBMembre expert*Erreur 404*
Je répondais à ce post en fait : http://www.developpez.net/forums/d14...p-jeux-triple/
...le 23/12/2014 à 12:20 -
germinolegrandMembre expertles opérations atomiques bas niveau (similaires aux variables volatiles du C/C++).
Et côté pédagogique, il faut par ailleurs justement marteler que les volatile n'ont rien à voir avec l'atomicité car c'est une croyance ancrée par VC++ qui n'était ainsi pas conforme au standard.le 04/01/2015 à 23:01 -
guillaume07Débutantpas optimal le code de l'exemple (try_pop/try_push): une semantics acquire/release va être suffisant et plus performant. là on a une semantics memory_order_seq_cst c'est tout à fait superfluePourquoi ne pas simplement utiliser un lock ?le 05/01/2015 à 13:27
-
germinolegrandMembre expertEn effet. Mais c'est parce qu'il me semble qu'il précise que dans le vrai code c'est acquire/release (ce que je fais dans mon code aussi) et qu'il n'a pas souhaité compliquer l'exemple puisque le code est fonctionnel (l'optimisation se fait facilement lorsqu'on a étudié les barrières mémoire), ce qui est toujours le cas en C++11 lorsqu'on utilise les atomic.
@Gugelhupf: Un seul thread est autorisé à appeler tryPush, et un seul thread est autorisé à appeler tryPop.le 05/01/2015 à 14:10 -
BouskRédacteur/ModérateurJe n'ai pas encore vu la vidéo, mais ce tryPush est une liste "thread-safe".
Son utilisation est justement pas pour 2 threads fassent un tryPush mais pour un unique thread en écriture, et un unique en lecture.le 05/01/2015 à 14:39 -
AstrayaMembre chevronnéIntel a également fait de très bonne vidéo sur la création de task dans un game engine.
https://software.intel.com/en-us/vid...threads-part-1
https://software.intel.com/en-us/vid...threads-part-2
https://software.intel.com/en-us/vid...threads-part-3
Bon la troisième vidéo est plus branché sur leur techno TBB. Mais bon, c'est toujours bon a connaitre pour ceux que ça intéresse.le 05/01/2015 à 16:19 -
GugelhupfModérateurOn peut voir à partir de la 24min de la vidéo que le compilateur PowerPC fait un peu n'importe quoi, pourquoi changer l'ordre des instructions de manière aussi brutale ? On dirait plus un bug que de l'optimisation.
Aussi il y a un truc que je ne comprends pas :
Code : 1
2
3
4
5
6
7
8
9
10
11
12
13
14T m_items[size]; atomic<int> m_writePos; // ... bool tryPush(const T& item) { int w = m_writePos if (w >= size) return false; m_items[w] = item; m_writePos = w + 1; return true; }
PS: On va commencer avec m_writePos = 0.
Ligne du temps :
- Thread 1 : int w = m_writePos; -> m_writePos vaut 0, donc w vaut 0
- Thread 2 : int w = m_writePos; -> m_writePos vaut 0, donc w vaut 0
- Thread 2 : if (w >= size) return false; -> On considère qu'on ne dépasse pas size, donc on ne retourne pas false
- Thread 2 : m_items[w] = item; -> m_items[0] vaut itemX
- Thread 1 : if (w >= size) return false; -> On considère qu'on ne dépasse pas size, donc on ne retourne pas false
- Thread 1 : m_items[w] = item; -> m_items[0] vaut itemY -> On a écrasé la valeur itemX à la position m_items[0].
C'est moi ou bien y a un problème ?
Je ne comprenais pas non plus pourquoi j'avais cette croyance entre volatile et atomicité, ça devait venir de làle 05/01/2015 à 13:25