11
votes

Mot déchirant x86

Dans quelles circonstances est-elle dangereuse d'avoir deux threads différents en écrivant simultanément sur des éléments adjacents du même tableau sur x86? Je comprends que sur certaines architectures de type DS9K avec des modèles de mémoire insensée, cela peut entraîner une déchirure de mot, mais sur X86, les octets individuels sont adressables. Par exemple, dans le langage de programmation D réel est un type de point flottant 80 bits sur x86. Serait-il prudent de faire quelque chose comme: XXX

Remarque: Je sais que, même si cela est sûr, cela peut parfois causer de faux problèmes de partage avec le cache, entraînant des performances lentes. Toutefois, pour les cas d'utilisation que j'ai dans l'esprit écrit sera assez peu fréquent pour que cela ne soit pas important dans la pratique.

Edit: Ne vous inquiétez pas de lire les valeurs écrites. L'hypothèse est qu'il y a sera Synchronisation avant que toutes les valeurs soient lues. Je me soucie seulement de la sécurité de l'écriture de cette manière.


1 commentaires

Je suppose que vous regardez des écrivies sales des adresses adjacentes?


3 Réponses :


1
votes

Je serais peut-être manquant quelque chose, mais je ne prévois pas de problèmes. L'architecture X86 n'écrit que ce dont il a besoin, cela ne fait aucun écriture en dehors des valeurs spécifiées. Cache-Snooping gère les problèmes de cache.


0 commentaires

11
votes

Le X86 a des caches cohérentes. Le dernier processeur à écrire dans une ligne de cache acquiert le tout et fait une écriture sur le cache. Cela garantit que l'octet unique et 4 valeurs d'octets écrites sur les valeurs correspondantes sont mises à jour atomiblement.

c'est différent de "son coffre-fort". Si les processeurs n'écrivent chacun que les octets / DWORD "appartenant" par ce processeur par conception, les mises à jour seront correctes. En pratique, vous voulez qu'un processeur lise des valeurs écrites par d'autres personnes, et cela nécessite synchronisation.

Il est également différent de celui qu'il est "efficace". Si plusieurs processeurs peuvent chacun écrire à différents endroits de la ligne de cache, la ligne de cache peut ping-pong entre les processeurs et celle qui est beaucoup plus chère que si la ligne de cache va à un seul processeur et y reste. La règle habituelle consiste à mettre des données spécifiques au processeur dans sa propre ligne de cache. Bien sûr, si vous allez écrire uniquement à un mot, juste une fois, et La quantité de travail est significative par rapport à un mouvement de la ligne de cache, puis Votre performance sera acceptable.


1 commentaires

En ce qui concerne votre point sur la lecture: l'idée était de remplir un énorme tableau en parallèle en utilisant quelque chose comme une carte parallèle. La fonction de cartographie prendrait la majeure partie du temps, de sorte que le temps passé à écrire est négligeable et que les lignes de cache ne seraient partagées que près des limites des unités de travail de toute façon. Avant que toutes les valeurs soient relues de ce tableau, une synchronisation de certains types serait utilisée.



1
votes

Vous posez des questions sur X86, mais votre exemple est dans une langue de haut niveau. Votre question spécifique à propos de D ne peut être répondu que par les personnes qui ont écrit le compilateur que vous utilisez, ou peut-être la spécification de langue D. Java, par exemple, nécessite que l'accès à l'élément de matrice ne doit pas causer de déchirure.

Concernant X86, l'atomicité des opérations est spécifiée à la section 8.1 de Manuel du développeur de logiciels Intel 3A . Selon elle, les opérations de magasin atomique comprennent: stocker un octet, stocker le mot de mot et dword aligné de mots sur tous les processeurs X86. Il spécifie également que sur les processeurs P6 et ultérieurs non alignés 16-, 32 et 64 bits à la mémoire mise en cache dans une ligne de cache sont atomiques.


0 commentaires