모든 하드웨어에서 병렬 성능을위한 프로그램을 최적화하려면 많은 공통 플랫폼에서 대칭 다중화가 거짓말임을 수락해야합니다. 운영 체제가 감지 한 "CPU"는 종종 캐시, 드라마 및 I/O 주변 장치와 같은 공유 리소스에 불평등 한 액세스 권한이 있으며, 때로는 불평등 한 사양 (ARM Big.little, Apple MX 및 Intel Adler Lake에서와 같이) 및 코드에서 이러한 사실을 고려하여 상당한 성능을 얻을 수 있습니다.
이것은 NUMA 메모리 노드, 소켓, 공유 데이터 및 명령어 캐시, 코어, 동시 멀티 스레딩 등을위한 Open MPI의 C 라이브러리 인 HWLOC에 대한 최신 RUST 바인딩입니다. 또한 HWLOC을 사용하면 스레드를 특정 CPU 코어에 고정하고 특정 NUMA 노드에 메모리를 고정 할 수 있습니다. 이는 토폴로지 인식 프로그램 최적화를 수행하기위한 전제 조건입니다.
hwlocality Ichbinjoe/hwloc2-Rs 및 Daschl/hwloc-Rs에서 Rust HWLOC 바인딩을 작성하려는 이전의 메인 메인이 아닌 시도와 함께 일부 코드와 디자인을 기반으로하며 여전히 일부 코드와 디자인을 공유합니다. 그러나 API와의 API 호환성을 목표로하지 않습니다. 실제로, 인체 공학, 성능을 향상시키고, 포인터가 무감각하다고 가정하는 것과 같은 정의되지 않은 행동의 길을 제거하기 위해 HWLOC2-R과 관련하여 많은 변화가 이루어졌습니다.
hwlocality 는 libhwloc v2.0 이상과 호환됩니다. 적절한 버전의 libhwloc 두 가지 방법으로 설치할 수 있습니다.
libhwloc 패키지를 제공하는 경우 관련 개발 패키지 (일반적으로 libhwloc-dev 또는 libhwloc-devel )와 함께 설치할 수 있습니다. 이것은 hwlocality (re) 빌드 속도를 크게 높이고 나머지 개발 환경과 함께 libhwloc 최신 상태로 유지할 수 있기 때문에 일을하는 것이 좋습니다.hwlocality 자체 libhwloc 사본을 다운로드하여 빌드 할 수 있습니다. 이러한 내부 빌드를 사용하려면 vendored 화물 기능을 활성화하십시오. 작동중인 C 빌드 환경 외에도 유엔에는 automake 및 libtool 필요하며 Windows에서 cmake 필요합니다. 공급 된 Windows의 HWLOC 버전 libhwloc 사용하지 않는 한 pkg-config 또는 클론 중 하나 ( pkgconf , pkgconfiglite ...) hwlocality 설치해야합니다.
기본적으로 모든 HWLOC 2.X 버전과의 호환성을 목표로합니다. 이는 2.X 시리즈의 최신 버전의 기능을 의미합니다 (또는 가까운 시일 내에 3.X 시리즈의 변경 사항과의 호환성)는 기본적으로 지원되지 않습니다.
호환되는 가장 낮은 HWLOC 릴리스와 일치하는화물 기능을 활성화하여 구형 HWLOC 2.X 릴리스와의 호환성을 잃는 비용으로이를 가능하게 할 수 있습니다. 자세한 내용은이 Crate 's Cargo.toml의 [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 시리즈의 대부분의 기능은 이제 hwlocality에 의해 노출됩니다. 그러나 대부분 다른 API와의 상호 운용성과 관련된 일부 특수 기능은 여러 가지 이유로이를 만들 수 없었습니다. "API 적용 범위"라벨 트랙에 대한 문제는 구현되지 않은 기능이며, 시간이 있으면이 라이브러리에 잠재적 인 기여를 할 수있는 좋은 장소입니다!
HWLOC C API에 이미 익숙하다면 #[doc(alias)] 속성이 hwloc_bitmap_t , hwloc_set_cpubind 또는 hwloc_obj::arity 와 같은 hwloc api entities에 대한 문서를 검색 할 수 있도록 광범위하게 사용되었다는 것을 알게되어 기쁩니다.
이 규칙의 주요 예외는 Rust Type 시스템에 의해 허용되는 인체 공학 개선으로 인해 Rust에서 필요하지 않은 개념입니다. 예를 들어...
Drop Imps로 대체됩니다HWLOC_MEMBIND_BYNODESET 과 같은 인수 설명 설명 플래그는 올바른 일을 자동으로 수행하는 제네릭으로 대체됩니다. 이 프로젝트는 MIT 라이센스를 사용합니다. 자세한 내용은 라이센스 파일을 참조하십시오.