要优化在所有硬件上并行性能的程序,您必须接受在许多通用平台上,对称的多处理是一个谎言。操作系统检测到的“ 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许可证,请参阅许可证文件以获取更多信息。