Untuk mengoptimalkan program untuk kinerja paralel pada semua perangkat keras, Anda harus menerima bahwa pada banyak platform umum, multiproses simetris adalah kebohongan. "CPU" yang terdeteksi oleh sistem operasi sering kali memiliki akses yang tidak adil ke sumber daya bersama seperti cache, dram dan periferal I/O, kadang -kadang bahkan spesifikasi yang tidak setara (seperti dalam lengan besar. Little, Apple MX dan Intel Adler Lake), dan perolehan kinerja yang signifikan dapat dicapai dengan mempertimbangkan fakta -fakta ini dalam kode Anda.
Ini adalah ikatan karat terbaru yang dipertahankan dengan HWLOC, perpustakaan C dari MPI terbuka untuk mendeteksi topologi hierarkis arsitektur modern: node memori NUMA, soket, data bersama & cache instruksi, inti, multi -threading simultan, dan banyak lagi. Selain itu, HWLOC memungkinkan Anda menyematkan utas ke inti CPU tertentu dan memori ke node NUMA tertentu, yang merupakan prasyarat untuk melakukan optimisasi program yang sadar topologi.
hwlocality didasarkan pada dan masih berbagi beberapa kode dan desain dengan upaya sebelumnya yang sekarang tidak terawat untuk menulis binding Rust HWLOC di Ichbinjoe/HWLOC2-RS dan DASCHL/HWLOC-RS. Namun, itu tidak bertujuan untuk kompatibilitas API dengan mereka. Memang, banyak perubahan telah dilakukan sehubungan dengan HWLOC2-RS dalam tujuan meningkatkan ergonomi, kinerja, dan menghapus jalan untuk perilaku yang tidak terdefinisi seperti dengan asumsi pointer adalah bidang non-nol atau Union adalah valid ketika tidak ada yang memberi tahu Anda bahwa mereka akan selalu.
hwlocality kompatibel dengan libhwloc v2.0 dan yang lebih baru. Anda dapat menginstal versi libhwloc yang cocok dengan dua cara berbeda:
libhwloc yang cukup baru, maka Anda dapat menginstalnya bersama dengan paket pengembangan terkait (biasanya disebut libhwloc-dev atau libhwloc-devel ). Ini adalah cara yang disarankan untuk melakukan hal -hal karena akan sangat mempercepat pembuatan hwlocality Anda dan memungkinkan Anda untuk dengan mudah menjaga libhwloc tetap terbaru bersama dengan sisa lingkungan pengembangan Anda.hwlocality dapat mengunduh dan membangun salinan libhwloc sendiri. Untuk menggunakan build internal seperti itu, harap aktifkan fitur kargo vendored . Selain lingkungan pembuatan C yang berfungsi, Anda akan membutuhkan automake dan libtool pada unes, dan cmake di Windows. Kecuali jika Anda menggunakan versi vendor HWLOC Windows, Anda juga perlu menginstal pkg-config atau salah satu klonnya ( pkgconf , pkgconfiglite ...), karena digunakan untuk menemukan libhwloc dan mengatur hwlocality untuk menghubungkannya.
Secara default, kompatibilitas dengan semua versi HWLOC 2.x ditujukan untuk, yang berarti fitur dari versi yang lebih baru dalam seri 2.x (atau, dalam waktu dekat, kompatibilitas dengan perubahan perubahan dari seri 3.x) tidak didukung oleh default.
Anda dapat mengaktifkannya, dengan biaya kehilangan kompatibilitas dengan rilis HWLOC 2.X yang lebih lama, dengan memungkinkan fitur kargo yang cocok dengan rilis HWLOC terendah yang perlu Anda kompatibel dengan. Lihat bagian [features] dari kargo peti ini.toml untuk informasi lebih lanjut.
Pertama, tambahkan hwlocality sebagai ketergantungan:
cargo add hwlocality Kemudian, di dalam kode Anda, atur Topology . Ini adalah titik masuk utama ke perpustakaan HWLOC, yang melaluinya Anda dapat mengakses hampir setiap operasi yang diizinkan HWLOC.
Berikut adalah contoh penggunaan cepat yang berjalan melalui topologi perangkat keras yang terdeteksi dan mencetak deskripsi singkat dari setiap objek CPU dan cache yang diketahui hwloc:
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 ( ( ) )
}Salah satu output yang mungkin adalah:
*** 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
Lebih banyak contoh tersedia di repositori sumber.
Sebagian besar fitur dari seri HWLOC 2.x sekarang diekspos oleh hwlocality. Tetapi beberapa fitur khusus, sebagian besar terkait dengan interoperabilitas dengan API lain, tidak dapat membuatnya karena berbagai alasan. Masalah dengan label label "Cakupan API" fitur yang tidak diimplementasikan, dan merupakan tempat yang tepat untuk mencari kontribusi potensial ke perpustakaan ini jika Anda punya waktu!
Jika Anda sudah terbiasa dengan HWLOC C API, Anda juga akan senang mengetahui bahwa #[doc(alias)] atribut digunakan secara luas sehingga Anda dapat mencari dokumentasi untuk entitas API hwloc seperti hwloc_bitmap_t , hwloc_set_cpubind atau hwloc_obj::arity dan red hwloc_set_cpubind atau hwloc_obj: arity dan red red.
Pengecualian utama untuk aturan ini adalah gagasan yang tidak diperlukan dalam karat karena perbaikan ergonomi yang diizinkan oleh sistem jenis karat. Misalnya...
Drop implsHWLOC_MEMBIND_BYNODESET digantikan oleh obat generik yang melakukan hal yang benar secara otomatis. Proyek ini menggunakan lisensi MIT, silakan lihat file lisensi untuk informasi lebih lanjut.