J'ai lu des articles sur le nouveau modèle de mémoire C++11 et je suis tombé sur l'article std::kill_dependency
(§29.3/14-15). J'ai du mal à comprendre pourquoi je voudrais l'utiliser.
J'ai trouvé un exemple dans le Proposition N2664 mais ça n'a pas beaucoup aidé.
Il commence par montrer le code sans std::kill_dependency
. Ici, la première ligne transporte une dépendance dans la seconde, qui transporte une dépendance dans l'opération d'indexation, puis transporte une dépendance dans l'opération d'indexation. do_something_with
fonction.
r1 = x.load(memory_order_consume);
r2 = r1->index;
do_something_with(a[r2]);
Il existe un autre exemple qui utilise std::kill_dependency
pour rompre la dépendance entre la deuxième ligne et l'indexation.
r1 = x.load(memory_order_consume);
r2 = r1->index;
do_something_with(a[std::kill_dependency(r2)]);
Pour autant que je puisse dire, cela signifie que l'indexation et l'appel à do_something_with
ne sont pas ordonnées en fonction de la dépendance avant la deuxième ligne. Selon N2664 :
Cela permet au compilateur de réordonner l'appel à
do_something_with
par exemple, en effectuant des optimisations spéculatives qui prévoient la valeur dea[r2]
.
Afin d'effectuer l'appel à do_something_with
la valeur a[r2]
est nécessaire. Si, hypothétiquement, le compilateur "sait" que le tableau est rempli de zéros, il peut optimiser cet appel à do_something_with(0);
et réorganiser cet appel par rapport aux deux autres instructions comme bon lui semble. Il peut produire n'importe lequel de :
// 1
r1 = x.load(memory_order_consume);
r2 = r1->index;
do_something_with(0);
// 2
r1 = x.load(memory_order_consume);
do_something_with(0);
r2 = r1->index;
// 3
do_something_with(0);
r1 = x.load(memory_order_consume);
r2 = r1->index;
Ma compréhension est-elle correcte ?
Si do_something_with
se synchronise avec un autre thread par un autre moyen, qu'est-ce que cela signifie en ce qui concerne l'ordre des x.load
appel et cet autre fil ?
En supposant que ma compréhension soit correcte, il reste une chose qui me chiffonne : lorsque j'écris du code, quelles raisons me conduiraient à choisir de tuer une dépendance ?