# hwloc (Hardware Locality)
## 概要
hwloc(Hardware Locality)は、University of Bordeaux・INRIA・CNRS・ENSEIRB(LaBRI)の研究チームが開発した、プロセッサソケット・キャッシュ・コア・NUMAメモリノードなどのハードウェアトポロジ情報を、OS非依存かつ移植可能な階層的な木構造として収集・公開するCライブラリである。Linuxではsysfsを、AIX・DARWIN・OSF・SOLARIS・WINDOWSでは各OS固有の低レベルAPIを読み、単一のオブジェクト木構造(Node・Socket・Cache・Coreなどの型を持つ汎用オブジェクト)に正規化する。低レベル詳細インターフェースと高レベル簡便インターフェースの二層のC APIを提供し、独自のCpuset構造体を通じてスレッド・プロセス・メモリのバインディングを行える。付属ツール`lstopo`はトポロジをグラフィカル/テキスト形式で可視化する。(Source: [[@2010__PDP__hwloc a Generic Framework for Managing Hardware Affinities in HPC Applications]] §III)
前身はlibtopologyという名称のプロジェクトで、同様の目的を持つPortable Linux Processor Affinity(PLPA、OPEN MPIプロジェクト由来)との協業によりhwlocへ統合された。PLPAがLinux専用でソケット/コア/スレッドという固定概念に依存し、共有キャッシュの粒度やNUMAメモリノードの抽象化を欠くのに対し、hwlocはマルチOS対応かつオブジェクト型や相対深さに仮定を置かない設計により、将来のアーキテクチャ変化への適応を志向する。(Source: [[@2010__PDP__hwloc a Generic Framework for Managing Hardware Affinities in HPC Applications]] §V)
hwloc論文の著者の一人[[Brice Goglin]]は、hwlocに先立つ2007年、[[@2007__PDCS__Impact of NUMA Effects on High-Speed Networking with Multi-Opteron Machines]]でAMD OPTERON/HYPERTRANSPORTのNUMAトポロジ情報をLINUXカーネルに公開させ、NEWMADELEINEミドルウェアに通信タスクの自動NUMA配置を実装している。hwlocのハードウェアトポロジ収集・抽象化という設計思想は、この個別ミドルウェアへの手作業的なNUMA情報統合の経験が一般化されたものと位置づけられる。
## 統合実績(2010年時点)
- **FORESTGOMP**(GCCのOpenMPランタイムGOMPの拡張、BUBBLESCHEDベース): hwlocのトポロジ情報をCacheスケジューリングポリシーで用い、キャッシュ親和性に基づくOpenMPスレッド配置を実現。
- **Hydra**(MPICH2の新プロセスマネージャ): hwloc供給情報に基づきMPIプロセスを特定のプロセッサへバインドする機能を追加。
- **KNEM**(MPICH2/NEMESISのLarge Message Transfer機構): 共有キャッシュサイズとプロセス数からI/OATオフロード閾値を動的に決定する際にhwlocのトポロジ情報を利用。
(Source: [[@2010__PDP__hwloc a Generic Framework for Managing Hardware Affinities in HPC Applications]] §IV)
## 可視化ツールでの利用: MemAxes
[[@2018__TVCG__MemAxes - Visualization and Analytics for Characterizing Complex Memory Performance Behaviors]] は、実行対象システムのハードウェアトポロジ取得にhwlocを利用する。ただし、hwloc自体が提供する既定の可視化(水平方向のicicle plot)は、上位階層(大きく少ない資源)に過剰な視覚領域を割く一方、下位階層(小さく多数のプロセッサ)の表示可能数が視野の横幅で制限されるという視覚的スケーラビリティの欠点を持つと指摘されている。MemAxesはhwlocのトポロジデータ取得機能はそのまま利用しつつ、可視化レイアウトのみを放射状(sunburstチャート)の空間充填レイアウトに置き換えることで、この欠点を解消した。すなわちMemAxesは、hwlocを「トポロジ収集」と「トポロジ可視化」に機能分解したうえで、前者を再利用し後者を新規提案した事例と言える。(Source: [[@2018__TVCG__MemAxes - Visualization and Analytics for Characterizing Complex Memory Performance Behaviors]] §6.2, Fig. 4-5)
## 関連
- ソース: [[@2010__PDP__hwloc a Generic Framework for Managing Hardware Affinities in HPC Applications]] / [[@2018__TVCG__MemAxes - Visualization and Analytics for Characterizing Complex Memory Performance Behaviors]]
- 関連概念: [[ハードウェアトポロジ抽象化]] / [[NUMA対応CPUピニング]] / [[性能データの可視化]]