Frage

Unter welchen Umständen ist es nicht sicher zu haben zwei verschiedene Threads gleichzeitig auf x86 zu benachbarten Elementen des gleichen Array zu schreiben? Ich verstehe, dass auf einigen DS9K artigen Architekturen mit wahnsinnigen Speichermodelle dieses Wort Reißen verursachen können, aber auf x86 sind einzelne Bytes adressierbar. Zum Beispiel in der Programmiersprache real D ist ein 80-Bit-Gleitkomma-Typ auf x86. Wäre es sicher sein, etwas zu tun:

real[] nums = new real[4];  // Assume new returns a 16-byte aligned block.
foreach(i; 0..4) {
    // Create a new thread and have it do stuff and 
    // write results to index i of nums.
}

Hinweis: Ich weiß, dass, auch wenn dies sicher ist, ist es manchmal falsch Sharing Probleme mit dem Cache verursachen kann, was die Leistung zu verlangsamen. Doch für die Anwendungsfälle ich im Sinn haben, wird selten genug schreibt dies in der Praxis nicht auf die Materie.

Edit: Mach dir keine Sorgen über das Lesen der Werte zurück, die geschrieben werden. Die Annahme ist, dass es sein Synchronisation, bevor Werte gelesen werden. Ich kümmere mich nur um die Sicherheit von Schreiben auf diese Weise.

War es hilfreich?

Lösung

Die x86 hat kohärenten Caches. Der letzte Prozessor zu schreiben, um eine Cache-Zeile, die ganze Sache erwirbt und macht einen Schreibvorgang in die Cache. Dadurch wird sichergestellt, dass einzelne Byte und 4 Byte-Werte geschrieben auf Werte entsprechend atomar aktualisiert werden.

Das ist etwas anderes als „seine sichere“. Wenn die Prozessoren, die jeweils nur Schreib zu Bytes / DWORDS „Besitz“ von diesem Prozessor durch Design, werden die Updates korrekt sein. In der Praxis sollten Sie einen Prozessor Wert zu lesen, die von anderen geschrieben, und das erfordert Synchronisation.

Es ist auch anders, als es „effizient“ ist. Wenn mehrere Prozessoren können jeweils an verschiedenen Orten in der Cache-Zeile zu schreiben, dann kann der Cache-Zeile Pingpong zwischen CPUs und das ist viel teurer, als wenn es die Cache-Zeile auf einer einzigen CPU geht und bleibt dort. Die übliche Regel ist prozessorspezifische Daten in seiner eigenen Cache-Zeile zu setzen. wenn Sie natürlich gehen schreiben nur auf nur dieses ein Wort, nur ein einziges Mal, und die Menge der Arbeit ist signifikant im Vergleich zu einer Cache-Zeile zu bewegen, dann Ihre Leistung wird akzeptabel sein.

Andere Tipps

Ich könnte etwas fehlen, aber ich voraussehen keine Probleme. x86-Architektur schreibt nur das, was es braucht, es macht kein Schreiben außerhalb der angegebenen Werte. Cache-Snooping behandelt die Cache-Probleme.

Sie fragen über x86 Besonderheiten, aber Ihr Beispiel ist in einigen High-Level-Sprache. Ihre spezielle Frage zu D kann nur von den Menschen beantwortet werden, die den Compiler geschrieben Sie verwenden, oder vielleicht die D-Sprachspezifikation. Java zum Beispiel erfordert, dass die Array-Zugriffselement darf nicht Reißen führen.

In Bezug auf x86, Unteilbarkeit der Operationen wird in Abschnitt 8.1 von Intel Software Developer Manual Volume 3A . Nach ihren Atomspeicheroperationen umfassen: einen Byte speichern, wortausgerichtet Wort- und dword-ausgerichtet dword auf allen x86 CPUs zu speichern. Es gibt auch, dass auf P6 und später CPUs unaligned 16-, 32- und 64-Bit-Zugriff auf im Cache-Speicher innerhalb einer Cache-Zeile atomar ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top