要優化在所有硬件上並行性能的程序,您必須接受在許多通用平台上,對稱的多處理是一個謊言。操作系統檢測到的“ CPU”通常會無法訪問CACHES,DRAM和I/O外圍設備等共享資源,有時甚至是不平等的規範(如Arm Big.Little,Apple MX和Intel Adler Lake),並且可以通過將這些事實考慮到您的代碼中來實現巨大的績效增長。
這是與HWLOC的最新維護的生鏽綁定,HWLOC是一個從Open MPI中的C庫,用於檢測現代體系結構的層次結構拓撲:NUMA內存節點,插座,共享數據和指令庫,核心,同時多線程等等。此外,HWLOC使您可以將線程固定到特定的CPU內核和內存到特定的NUMA節點,這是執行拓撲感知程序優化的先決條件。
hwlocality基於並仍然與以前的,現在未經維護的嘗試在Ichbinjoe/hwloc2-rs和Daschl/hwloc-rs編寫Rust HWLOC綁定的嘗試共享一些代碼和設計。但是,它並不是要與它們的API兼容性。的確,在HWLOC2-RS方面已經進行了許多變化,目的是改善人體工程學,績效,並刪除未定義行為的途徑,例如假設指針是非零下或聯合領域是有效的,而沒有人告訴您他們總是會。
hwlocality與libhwloc v2.0及更高版本兼容。您可以通過兩種不同的方式安裝合適的libhwloc版本:
libhwloc軟件包,則可以將其與關聯的開發軟件包一起安裝(通常稱為libhwloc-dev或libhwloc-devel )。這是做事的推薦方法,因為它將大大加快您的hwlocality (re)構建,並讓您輕鬆地將libhwloc與其他開發環境一起保持最新。hwlocality可以或者可以下載並構建自己的libhwloc副本。要使用這種內部構建,請啟用vendored商貨物功能。除了有效的C構建環境外,您還需要在Unices上automake和libtool ,以及在Windows上的cmake 。除非您使用Windows的HWLOC供應商版本,否則您還需要安裝pkg-config或其克隆之一( pkgconf , pkgconfiglite ...),因為它用於查找libhwloc並設置hwlocality並鏈接到它。
默認情況下,與所有HWLOC 2.x版本的兼容性都是針對2.x系列中較新版本的功能(或者在不久的將來,默認情況下不支持與3.x系列的破壞變化的兼容性)。
您可以通過啟用與您需要兼容的最低HWLOC版本的貨物功能來啟用與舊HWLOC 2.x版本的兼容性,以啟用它們。有關更多信息,請參見此板條箱貨物的[features]部分。
首先,添加hwlocality作為一種依賴性:
cargo add hwlocality然後,在代碼內部設置Topology 。這是HWLOC庫的主要入口點,您可以通過它訪問HWLOC允許的每個操作。
這是一個快速用法示例,它通過檢測到的硬件拓撲來行走,並打印出HWLOC已知的每個CPU和高速緩存對象的簡短描述:
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 ( ( ) )
}一個可能的輸出是:
*** 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
源存儲庫中提供了更多示例。
HWLOC 2.X系列中的大多數功能現在都被HWLOCAITY公開。但是,出於各種原因,一些專業功能(主要與與其他API的互操作性有關)無法實現。 “ API覆蓋範圍”標籤曲目毫不啟用的功能的問題,如果您有時間,可以為此圖書館尋找潛在的貢獻!
If you are already familiar with the hwloc C API, you will also be happy to know that #[doc(alias)] attributes are extensively used so that you can search the documentation for hwloc API entities like hwloc_bitmap_t , hwloc_set_cpubind or hwloc_obj::arity and be redirected to the suggested replacement in the Rust API.
該規則的主要例外是由於生鏽類型系統允許的人體工程學改進,生鏽中不需要的概念。例如...
Drop Impls取代HWLOC_MEMBIND_BYNODESET被自動執行正確事物的仿製藥所取代。 該項目使用MIT許可證,請參閱許可證文件以獲取更多信息。