Welche CPU-Architekturen unterstützen Compare And Swap (CAS)?
einfach nur neugierig zu wissen, welche CPU-Architekturen unterstützen, vergleichen und tauschen Atomare primitive?
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Powerpc stärker primitive zur Verfügung: "lwarx" und "stwcx"
lwarx lädt einen Wert aus dem Speicher, aber merkt sich die Position. Von einem anderen thread oder cpu, die Details, Lage bewirkt, dass die "stwcx", einer bedingten store-Instruktion, zu scheitern.
Also die lwarx /stwcx combo erlaubt Ihnen die Implementierung von atomaren Inkrement /Dekrement, zu vergleichen und zu tauschen, und mehr leistungsstarke Atomare Operationen wie "atomic increment Ringpuffer-index"
InformationsquelleAutor der Antwort jdkoftinoff
Einen anderen und einfacheren Weg, um diese Frage zu beantworten werden kann, um die Liste Multiprozessor-Plattformen, die NICHT unterstützen, compare and swap (oder eine load-link/store-conditional verwendet werden können, um eines zu schreiben).
Die einzige, die ich kenne, ist PARISC, die nur eine Atomare klares Wort Anleitung. Dies kann verwendet werden, zu konstruieren, ein mutex (vorausgesetzt, man richtet das Wort an einen 16-byte-Grenze). Es gibt keine CAS auf dieser archetecture (im Gegensatz zu x86, ia64, ppc, sparc, mips, s390, ...)
InformationsquelleAutor der Antwort
Ein paar Leute kommentiert/gefragt, ob der "lock" - Präfix ist erforderlich, auf x86/x64 für cmpxchg. Die Antwort ist ja für multicore-Maschinen. Die Anleitung ist komplett atomic für single-core-Maschinen ohne Schloss.
Es ist schon eine Weile her, seit ich studierte dieses Material, das tief, aber ich glaube mich zu erinnern, dass Sie die Anleitung technisch neu gestartet - es kann zu einem Abbruch der Unterricht mitten im Flug (wenn es nicht gehabt hat, irgendwelche Nebenwirkungen noch) zu vermeiden, verzögern die Behandlung von Interrupts zu lange.
InformationsquelleAutor der Antwort
Intel x86 hat diese Unterstützung. IBM ist es Solaris to Linux Porting Guide gibt dieses Beispiel:
InformationsquelleAutor der Antwort mat_geek
Beginnend mit der ARMv6-Architektur ARM hat die LDREX/STREX-Anweisungen, die verwendet werden können, um zu implementieren eine Atomare compare-exchange-operation.
InformationsquelleAutor der Antwort Michael Burr
Sorry für eine Menge von Briefen. 🙁
Fast alle Anweisungen in der x86 ISA (außer so genannte string-Anweisungen, und vielleicht ein paar andere), einschließlich CMPXCHG sind atomic im Rahmen des unicore-CPU. Dies ist, weil nach der x86-Architektur, CPU prüft angekommen unterbricht nach jeder Befehlsausführung Fertigstellung und nie in der Mitte. Als Ergebnis, interrupt-Anforderung erkannt werden können und es Umgang nur gestartet, auf der Grenze zwischen der Ausführung von zwei aufeinanderfolgenden Anweisungen. Aufgrund dieser alle Speicher-Referenzen, die von der CPU während der Ausführung von Einzel-Unterricht sind isoliert und können sich nicht überlappen von anderen Aktivitäten. Dieses Verhalten ist üblich für unicore und multicore-CPUs. Aber, wenn im Rahmen des unicore-CPU gibt es nur eine Einheit des Systems, führt den Zugriff auf den Speicher, in den Kontext von multicore-CPU gibt es dann eine weitere Einheit des Systems führt, die Zugriff auf den Speicher gleichzeitig. Anleitung isolation ist nicht genug für Konsistenz in solcher Umgebung, denn die Speicher-Zugriffe von unterschiedlichen CPUs in der gleichen Zeit kann interleave jedes andere. Aufgrund dieser zusätzlichen Schutzschicht aufgebracht werden muss, um die Daten ändern zu Protokoll. Für die x86-diese Schicht ist lock-Präfix, initiiert atomaren Transaktion auf dem Systembus.
Zusammenfassung: Es ist sicherer und weniger teuer zu verwenden, sync-Anweisungen wie CMPXCHG XADD, BTS, etc. ohne lock-Präfix, wenn Sie versichert, dass die Daten zugreifen, die durch diese Anweisung kann nur zugegriffen werden, indem ein Kern. Wenn Sie nicht gewährleistet, gelten lock-Präfix, um die Sicherheit zu gewährleisten, die durch den Handel aus Leistung.
Gibt es zwei wichtige Ansatz für hardware-Synchronisation-Unterstützung von CPU:
Niemand ist Silber Kugel. Beide Ansätze haben Sie vor-und Nachteile.
Atomare Transaktionen basierende Ansatz stützt sich auf die Unterstützung der besonderen Art der Transaktionen auf den Speicher-bus. Während einer solchen Transaktion nur ein agent (CPU-Kern) mit dem bus verbunden ist, ist berechtigt access-Speicher. Als Ergebnis, auf der einen Seite, alle Speicherzugriffe durch den bus-Besitzer in atomaren Transaktion sicher zu sein gemacht als ein einziges Unterbrechungsfreie die Transaktion. Auf der anderen Seite alle anderen bus-Agenten (CPU-Kerne), erzwungen, zu warten, die Atomare Transaktion Abschluss, um wieder die Möglichkeit auf den Speicher zugreifen. Es spielt keine Rolle, welche Speicher Zellen, die Sie zugreifen möchten, selbst wenn Sie Zugriff auf den Speicher region, die nicht verwiesen wird, die von bus-Besitzer in atomic transaction. Als Ergebnis umfangreiche Verwendung von lock-Präfix Anweisungen verlangsamen das system deutlich. Auf der anderen Seite, aufgrund der Tatsache, dass der bus-arbiter Zugriff auf die bus-für jeden bus-Agenten gemäß der round-robin-scheduling, es ist eine Garantie, dass jeder bus-agent wird haben relativ faire Zugriff auf den Speicher und alle Agenten werden in der Lage sein, um Fortschritte machte und es mit der gleichen Geschwindigkeit. Zusätzlich, ABA problem, kommen Sie in den spielen bei atomaren Transaktionen, da durch seine Natur, Atomare Transaktionen ist sehr kurz (einige Speicher-Hinweise single instruction) und alle Handlungen, die auf Speicher während der Transaktion verlassen Sie sich nur auf den Wert der memory-region, ohne zu berücksichtigen, dass-Speicherbereich zugegriffen wurde, von einigen anderen, die zwischen zwei Transaktionen.
Gutes Beispiel der atomic transaction-basierte sync-Unterstützung für x86-Architektur, in der die lock Präfix Anweisungen durchzusetzen, die die CPU ausführen kann, in Atomare Transaktionen.
Cache-Kohärenz-Protokoll-basierte Ansatz stützen sich auf die Tatsache, dass die Speicher-Zeile zwischengespeichert werden kann, nur in dem einen L1-cache in einem Augenblick der Zeit. Die memory-access-protocol-im cache-Kohärenz-system ist vergleichbar mit der nächsten Sequenz von Aktionen:
Danke zu Protokoll, dass der CPU-Kern immer Zugriff auf die aktuellen Daten im Speicher, und die Zugriffe auf den Speicher werden serialisiert, in der strengen Ordnung, ein Zugang in der Zeit.
Cache-Kohärenz-Protokoll-basierte sync-Unterstützung angewiesen, um die Tatsache, dass der CPU schnell erkennen, dass die jeweiligen Speicher-Zeile zugegriffen wurde zwischen zwei Zeitpunkten. Während der erste Speicher Zugang zu den line-X, muss die offene Transaktion, CPU mark, memory line in L1-cache müssen gesteuert werden-snooping-agent. In seiner turn-snooping-agent kann während der cache line flush neben der überprüfung zu erkennen ist, dass die Linie markiert ist, für die Kontrolle und das interne flag, wenn die kontrollierte Zeile geleert. Als Ergebnis, wenn der CPU überprüfen, das interne flag während memory access, schließen Sie die Transaktion, wird es wissen wird kontrolliert-Speicher-Linie war in der Lage zu sein, die von jemand anderem verändert und Abschluss wird die Transaktion durchgeführt werden müssen, mit Erfolg, oder als fehlgeschlagen anzusehen ist.
Dies ist der Weg des LL\SC-Unterricht Klasse Umsetzung. Dieser Ansatz ist einfacher, atomic transaction und bietet viel mehr Flexibilität bei der Synchronisierung, denn viel mehr Anzahl der verschiedenen sync-primitives werden kann bauen Sie auf it-Basis im Vergleich zu atomaren Transaktionen Ansatz. Dieser Ansatz ist skalierbar und effizient, weil es nicht zu blockieren den Zugriff auf den Speicher für alle anderen Teile des Systems. Und wie Sie sehen können, es löst das ABA-problem, weil es auf der Basis der Tatsache, memory-region-access-Erkennung, nicht aber auf den Wert von " Speicher-region (change detection). Jeder Zugriff auf den Speicher region die Teilnahme in der Laufenden Transaktion als eine Transaktion fehlschlagen. Und das kann gut und schlecht in der gleichen Zeit, da bestimmten Algorithmus sein kann, daran interessiert sind nur in den Wert von " Speicher region, und nicht in dem account ist, dass Standort zugegriffen wurde, indem jemand in der Mitte, bis Sie, dass der Zugang ändern Sie den Speicher. Lesen Sie In diesem Fall der Wert für den Speicher in der Mitte führen zu falsch-negativ-Transaktion fehlschlagen. Neben diesem Ansatz kann zu großen Leistungseinbußen von Ablaufsteuerungen contenting auf den gleichen Speicher Linie, weil Sie sind in der Lage, ständig Edelstahl-Speicher Linie von jedem anderen, und durch das verhindern von einander vom Abschluss der Transaktion mit Erfolg. Das ist wirklich großes problem, denn in terminal Fall kann es drehen system in livelock.
Cache-Kohärenz-Protokoll-basierte sync-support in der Regel verwendet in RISC-CPU, weil es Einfachheit und Flexibilität. Aber es muss angemerkt werden, dass sich Intel entschieden, zur Unterstützung solcher Ansatz für die Synchronisation Unterstützung für x86-Architektur zu. Im letzten Jahr Intel angekündigt, die Transactional Synchronization Extensions auf x86-Architektur implementiert werden, die in Haswell generation von Intel-Prozessoren. Im Ergebnis sieht es so aus, die x86 werden die meisten leistungsstarke Unterstützung von Synchronisierung und ermöglichen, system-Entwickler nutzen Vorteile beider Ansätze.
InformationsquelleAutor der Antwort
Nur um die Liste zu vervollständigen, MIPS hat Load-Linked (ll) und Store Conditional (sc) Anweisungen, die Belastung einen Wert aus dem Speicher und später bedingt speichern, wenn keine andere CPU hat Zugriff auf die location. Es ist wahr, dass Sie können verwenden Sie diese Anweisungen ausführen, swap -, Inkrement -, und andere Operationen. Aber der Nachteil ist, dass mit einer großen Anzahl von CPUs Ausübung Schlösser sehr stark erhalten Sie in livelock: die bedingte Geschäft wird Häufig nicht und erfordern eine weitere Schleife, um erneut zu versuchen, was fehlschlägt, etc.
Die software mutex_lock Umsetzung kann sehr kompliziert werden zu versuchen, eine exponentielle backoff, wenn diese Situationen werden als wichtig genug angesehen, um über sorgen. In einem system, auf dem ich gearbeitet mit 128 cores, Sie wurden.
InformationsquelleAutor der Antwort DGentry
X86-und Itanium haben CMPXCHG (compare and exchange)
InformationsquelleAutor der Antwort Darksider
Vergleichen und swap wurde Hinzugefügt IBM-mainframes im Jahr 1973. Es ist (verglichen mit Doppelbett und swap) sind immer noch auf die IBM-mainframes (zusammen mit neueren multi-Prozessor-Funktionen wie PLO - durchführen locked operation).
InformationsquelleAutor der Antwort
Sparc-v9 ist ein cas-Unterricht. Die SPARC v9 Architektur-Handbuch beschreibt die Verwendung der CAS-Instruktion in Anhang J,, Aussehen, speziell bei Beispiele 11 J. und 12 J..
Ich glaube, der name der Anweisung ist eigentlich "casa", denn es kann den Zugriff entweder die aktuelle Adresse, Leerzeichen oder eine Alternative. "cas" ist ein assembler-makro, das auf die aktuelle ASI.
Gibt es auch einen Artikel auf developers.sun.com Diskussion der verschiedenen atomaren Anweisungen, die Sparc-Prozessoren umgesetzt haben, im Laufe der Jahre, einschließlich cas.
InformationsquelleAutor der Antwort DGentry