すべてのハードウェアの並列パフォーマンスのためのプログラムを最適化するには、多くの一般的なプラットフォームで対称的なマルチプロセッシングが嘘であることを受け入れる必要があります。オペレーティングシステムによって検出された「CPU」は、キャッシュ、DRAM、I/O周辺機器などの共有リソースに不平等なアクセスを持つことがよくあります。
これは、最新のMPIのCライブラリであるHWLOCへの最新の錆び結合です。現代アーキテクチャの階層的トポロジーを検出するためのC numaメモリノード、ソケット、共有データと命令キャッシュ、コア、同時マルチスレッドなど。さらに、HWLOCでは、特定のCPUコアとメモリにスレッドを特定のnumaノードにピン留めすることができます。
hwlocalityは、Ichbinjoe/hwloc2-rsおよびdaschl/hwloc-rsでRust hwlocバインディングを書くための以前の、現在維持されていない試みといくつかのコードとデザインを共有しています。ただし、API互換性を目指していません。実際、人間工学、パフォーマンス、およびポインターが非ヌルまたはユニオンフィールドが常にそうであるとは言わないときに有効であると仮定するような未定義の動作の手段を改善することを目的として、HWLOC2-Rに関して多くの変更が加えられてきました。
hwlocality 、 libhwloc v2.0以降と互換性があります。 libhwlocの適切なバージョンを2つの異なる方法でインストールできます。
libhwlocパッケージを提供する場合、関連する開発パッケージ(通常はlibhwloc-devまたはlibhwloc-develと呼ばれる)とともにインストールできます。これは、 hwlocality (re)ビルドを大幅に高速化し、開発環境の残りの部分とともにlibhwloc簡単に最新の状態に保つことができるため、推奨されることを行う方法です。hwlocality代わりにlibhwlocの独自のコピーをダウンロードして構築できます。このような内部ビルドを使用するには、 vendored貨物機能を有効にしてください。動作するCビルド環境に加えて、ユニスでautomakeてlibtool必要とし、Windowsでcmake必要があります。 hwloc of Windowsのベンダーバージョンlibhwloc使用している場合を除き、PKG hwlocality pkg-configまたはそのクローン( pkgconf 、 pkgconfiglite ...)の1つをインストールする必要があります。
デフォルトでは、すべてのHWLOC 2.xバージョンとの互換性が目的とされています。これは、2.xシリーズの新しいバージョンの機能を意味します(または、近い将来、3.xシリーズからの壊れた変更との互換性)はデフォルトではサポートされていません。
それらを有効にして、古い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 ( ( ) )
}可能な出力の1つは次のとおりです。
*** 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シリーズの機能のほとんどは、HWLoCalityによって公開されています。しかし、主に他のAPIとの相互運用性に関連するいくつかの専門的な機能は、さまざまな理由でそれを作ることができませんでした。 「APIカバレッジ」のラベルトラックの問題の問題の問題は、実装されていない機能であり、時間があればこのライブラリへの潜在的な貢献を探すのに最適な場所です。
hwloc c APIにすでに精通している場合は、 #[doc(alias)]属性が広く使用されていることを喜んで知っているため、 hwloc_bitmap_t 、 hwloc_set_cpubind 、 hwloc_obj::arityのドキュメントを検索できます。
この規則の主な例外は、錆型システムで許可されている人間工学の改善のために錆で必要とされない概念です。例えば...
Dropインプルに置き換えられますHWLOC_MEMBIND_BYNODESETのようなタイプ引数の明確なフラグは、自動的に正しいことを行うジェネリックに置き換えられます。 このプロジェクトでは、MITライセンスを使用しています。詳細については、ライセンスファイルをご覧ください。