Article de reference

Cohérence séquentielle

La cohérence séquentielle est un modèle de cohérence utilisé dans le domaine du calcul concurrent (par exemple, dans la mémoire partagée distribuée , les transactions distribuée...

La cohérence séquentielle est un modèle de cohérence utilisé dans le domaine du calcul concurrent (par exemple, dans la mémoire partagée distribuée , les transactions distribuées , etc.).

Il s'agit de la propriété selon laquelle « … le résultat de toute exécution est le même que si les opérations de tous les processeurs étaient exécutées dans un ordre séquentiel, et les opérations de chaque processeur individuel apparaissent dans cette séquence dans l'ordre spécifié par son programme. »

Autrement dit, l'ordre d'exécution d'un programme sur un même processeur (ou thread) correspond à l'ordre d'exécution du programme, tandis que l'ordre d'exécution d'un programme sur des processeurs (ou threads) différents est indéfini. Par exemple :

L'ordre d'exécution entre A1, B1 et C1 est préservé, c'est-à-dire que A1 s'exécute avant B1 et B1 avant C1. Il en va de même pour A2 et B2. Cependant, comme l'ordre d'exécution entre les processeurs est indéfini, B2 peut s'exécuter avant ou après C1 (B2 peut s'exécuter physiquement avant C1, mais son effet peut être visible après celui de C1, ce qui revient à dire « B2 s'exécute après C1 »).

Conceptuellement, il existe une mémoire globale unique et un « commutateur » qui connecte un processeur quelconque à la mémoire à chaque étape temporelle. Chaque processeur effectue des opérations de mémoire dans l'ordre du programme et le commutateur assure la sérialisation globale de toutes ces opérations

La cohérence séquentielle est plus faible que la cohérence stricte . Toutes deux exigent qu'une lecture à une adresse donnée renvoie la valeur de la dernière écriture à cette adresse, et que les opérations soient exécutées dans l'ordre chronologique. La cohérence stricte exige en outre que les différents threads d'exécution s'exécutent de manière synchrone, avec un comportement et un timing déterministes.

La plupart des architectures de jeu d'instructions , notamment x86 , x86-64 , ARM et RISC-V , ne proposent pas un modèle de mémoire séquentiellement cohérent aux programmes. Certaines optimisations matérielles importantes, comme la mise en cache avec écriture différée , sont incompatibles avec la cohérence séquentielle. Par conséquent, les programmes multithreadés exécutés sur des systèmes multiprocesseurs utilisant ces architectures peuvent présenter un comportement incohérent avec l'entrelacement des instructions entre les threads, généralement en lisant des valeurs obsolètes.