Um die Programme für die parallele Leistung auf allen Hardware zu optimieren, müssen Sie akzeptieren, dass symmetrische Multiprozessing auf vielen gemeinsamen Plattformen eine Lüge ist. "CPUs", die vom Betriebssystem festgestellt wurden, haben häufig einen ungleiche Zugang zu gemeinsamen Ressourcen wie Caches, Dram und I/O -Peripheriegeräten, manchmal sogar ungleiche Spezifikationen (wie in ARM Big.Little, Apple MX und Intel Adler Lake), und erhebliche Leistungsgewinne können erreicht werden, indem diese Tatsachen in Ihrem Code berücksichtigt werden.
Dies ist die neueste aufrechterhaltene Rostbindung an HWLOC, eine C -Bibliothek von Open MPI zum Erkennen der hierarchischen Topologie moderner Architekturen: Numa -Speicherknoten, Sockeln, gemeinsam genutzte Daten und Anweisungen, Caches, Cores, gleichzeitiges Multi -Threading und vieles mehr. Darüber hinaus können Sie mit HWLOC Threads an bestimmte CPU-Kerne und Speicher an bestimmte NUMA-Knoten stecken.
hwlocality basiert auf und teilt immer noch Code und Design mit den vorherigen, inzwischen ungestörten Versuchen, Rost-HWLOC-Bindungen an Ichbinjoe/hwloc2-rs und Daschl/hwloc-rs zu schreiben. Es zielt jedoch nicht auf eine API -Kompatibilität bei ihnen ab. In der Tat wurden viele Änderungen in Bezug auf HWLOC2-RS vorgenommen, um die Ergonomie, die Leistung und das Entfernen von Wegen für undefinierte Verhaltensweisen zu verbessern, z.
hwlocality ist mit libhwloc v2.0 und später kompatibel. Sie können eine geeignete Version von libhwloc auf zwei verschiedene Arten installieren:
libhwloc Paket bietet, können Sie es zusammen mit dem zugehörigen Entwicklungspaket installieren (in der Regel libhwloc-dev oder libhwloc-devel bezeichnet). Dies ist die empfohlene Möglichkeit, Dinge zu tun, da dies Ihre hwlocality -Builds erheblich beschleunigt und Ihnen ermöglicht, libhwloc zusammen mit dem Rest Ihrer Entwicklungsumgebung problemlos auf dem neuesten Stand zu halten.hwlocality alternativ eine eigene Kopie von libhwloc herunterladen und erstellen. Um einen solchen internen Build zu verwenden, aktivieren Sie bitte die vendored Frachtfunktion. Zusätzlich zu einer funktionierenden C -Build -Umgebung benötigen Sie automake und libtool auf Eingeräten und cmake unter Windows. Sofern Sie nicht eine mitgeführte Version von HWLOC von Windows verwenden, müssen Sie auch pkg-config oder einen seiner Klone ( pkgconf , pkgconfiglite ...) installieren, da es verwendet wird, um libhwloc zu finden und hwlocality so einzustellen, um sich gegen sie zu verbinden.
Standardmäßig ist die Kompatibilität mit allen HWLOC 2.x -Versionen ausgerichtet, was Merkmale aus neueren Versionen in der 2.x -Serie (oder in naher Zukunft die Kompatibilität mit Bruchänderungen aus der 3.x -Serie) nicht standardmäßig unterstützt wird.
Sie können sie auf Kosten des Verlusts der Kompatibilität mit älteren HWLOC 2.x -Releases aktivieren, indem Sie die Frachtfunktion aktivieren, die der niedrigsten HWLOC -Version entspricht, mit der Sie kompatibel sein müssen. Weitere Informationen finden Sie im Abschnitt [features] der Fracht der Fracht dieser Kasse.
Fügen Sie zunächst hwlocality als Abhängigkeit hinzu:
cargo add hwlocality Richten Sie dann in Ihrem Code eine Topology ein. Dies ist der Haupteintrittspunkt in die HWLOC -Bibliothek, über den Sie auf fast jeden Vorgang zugreifen können, den Hwloc zulässt.
Hier finden Sie ein kurzes Nutzungsbeispiel, das durch die erkannte Hardware -Topologie läuft und eine kurze Beschreibung jedes CPU- und Cache -Objekts ausdruckt, das HWLOC bekannt ist:
use hwlocality :: { object :: depth :: NormalDepth , Topology } ;
fn main ( ) -> eyre :: Result < ( ) > {
let topology = Topology :: new ( ) ? ;
for depth in NormalDepth :: iter_range ( NormalDepth :: MIN , topology . depth ( ) ) {
println ! ( "*** Objects at depth {depth}" ) ;
for ( idx , object ) in topology . objects_at_depth ( depth ) . enumerate ( ) {
println ! ( "{idx}: {object}" ) ;
}
}
Ok ( ( ) )
}Ein möglicher Ausgang ist:
*** Objects at depth 0
0: Machine
*** Objects at depth 1
0: Package
*** Objects at depth 2
0: L3 (16MB)
*** Objects at depth 3
0: L2 (512KB)
1: L2 (512KB)
2: L2 (512KB)
3: L2 (512KB)
4: L2 (512KB)
5: L2 (512KB)
*** Objects at depth 4
0: L1d (32KB)
1: L1d (32KB)
2: L1d (32KB)
3: L1d (32KB)
4: L1d (32KB)
5: L1d (32KB)
*** Objects at depth 5
0: Core
1: Core
2: Core
3: Core
4: Core
5: Core
*** Objects at depth 6
0: PU
1: PU
2: PU
3: PU
4: PU
5: PU
6: PU
7: PU
8: PU
9: PU
10: PU
11: PU
Weitere Beispiele finden Sie im Quell -Repository.
Die meisten Merkmale der HWLOC 2.x -Serie sind nun durch Hwlocality ausgesetzt. Einige spezialisierte Merkmale, die hauptsächlich mit der Interoperabilität mit anderen APIs zusammenhängen, konnten es aus verschiedenen Gründen nicht schaffen. Probleme mit den "API Coverage" -Label -Track -Track Unimplemented Features und sind ein großartiger Ort, um potenzielle Beiträge zu dieser Bibliothek zu suchen, wenn Sie Zeit haben!
Wenn Sie bereits mit der HWLOC C -API vertraut sind, werden Sie auch froh sein zu wissen, dass #[doc(alias)] zu Attributen ausgiebig verwendet werden, damit Sie die Dokumentation für Hwloc -API -Entitäten wie hwloc_bitmap_t , hwloc_set_cpubind oder hwloc_obj::arity und tecirected zu der vorgefertigten Ersetzungseinführung durchsuchen können.
Die Hauptausnahmen zu dieser Regel sind Vorstellungen, die aufgrund von Ergonomieverbesserungen, die vom Rost -System zulässig sind, nicht benötigt werden. Zum Beispiel...
Drop ersetzt.HWLOC_MEMBIND_BYNODESET durch Generika ersetzt, die automatisch das Richtige tun. Dieses Projekt verwendet die MIT -Lizenz. Weitere Informationen finden Sie in der Lizenzdatei.