Para otimizar os programas para desempenho paralelo em todo o hardware, você deve aceitar que, em muitas plataformas comuns, o multiprocessamento simétrico é uma mentira. Os "CPUs" detectados pelo sistema operacional geralmente têm acesso desigual a recursos compartilhados, como caches, DRAM e E/S periféricos, às vezes até especificações desiguais (como no ARM BIG.Little, Apple MX e Intel Adler Lake), e ganhos significativos de desempenho podem ser alcançados, assumindo esses fatos em consideração em seu código.
Esta é a mais recente ligação de ferrugem mantida ao HWLOC, uma biblioteca C da MPI aberta para detectar a topologia hierárquica das arquiteturas modernas: nós de memória NUMA, soquetes, caches de dados e instruções compartilhados, núcleos, fios multi -threads simultâneos e muito mais. Além disso, o HWLOC permite fixar threads em núcleos específicos da CPU e memória em nós específicos do NUMA, o que é um pré-requisito para realizar otimizações de programa com reconhecimento de topologia.
hwlocality é baseada em e ainda compartilha algum código e design com as tentativas anteriores e agora sem apoio de escrever ligações hwloc de ferrugem em Ichbinjoe/hwloc2-rs e Daschl/hwloc-rs. No entanto, ele não busca a compatibilidade da API com eles. De fato, muitas mudanças foram feitas com relação ao HWLOC2-RS no objetivo de melhorar a ergonomia, o desempenho e a remoção de avenidas para comportamentos indefinidos, como assumir que os ponteiros não são nulos ou os campos sindicais são válidos quando ninguém diz que sempre será.
hwlocality é compatível com libhwloc v2.0 e posterior. Você pode instalar uma versão adequada do libhwloc de duas maneiras diferentes:
libhwloc razoavelmente recente, você poderá instalá-lo junto com o pacote de desenvolvimento associado (normalmente chamado de libhwloc-dev ou libhwloc-devel ). Essa é a maneira recomendada de fazer as coisas, pois acelerará bastante sua hwlocality (re) construir e permitir que você mantenha facilmente libhwloc atualizado junto com o restante do seu ambiente de desenvolvimento.hwlocality poderá baixar e criar sua própria cópia da libhwloc . Para usar essa compilação interna, ative o recurso de carga vendored . Além de um ambiente de construção C em funcionamento, você precisará automake e libtool em unidades e cmake no Windows. A menos que você esteja usando uma versão vendida do HWLOC do Windows, você também precisará instalar pkg-config ou um de seus clones ( pkgconf , pkgconfiglite ...), como é usado para encontrar libhwloc e configurar hwlocality para vincular-se.
Por padrão, a compatibilidade com todas as versões HWLOC 2.x é direcionada, o que significa recursos de versões mais recentes da série 2.x (ou, em um futuro próximo, a compatibilidade com as mudanças de quebra da série 3.x) não são suportadas por padrão.
Você pode habilitá -los, com o custo de perder a compatibilidade com as liberações HWLOC 2.x mais antigas, permitindo o recurso de carga que corresponde à menor versão do HWLOC com a qual você precisa ser compatível. Consulte a seção [features] da carga desta caixa.toml para obter mais informações.
Primeiro, adicione hwlocality como uma dependência:
cargo add hwlocality Então, dentro do seu código, configure uma Topology . Este é o principal ponto de entrada para a biblioteca HWLOC, através da qual você pode acessar quase todas as operações que o HWLOC permite.
Aqui está um exemplo de uso rápido que caminha pela topologia de hardware detectada e imprime uma breve descrição de cada objeto de CPU e cache conhecido pelo HWLOC:
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 ( ( ) )
}Uma saída possível é:
*** 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
Mais exemplos estão disponíveis no repositório de origem.
A maioria dos recursos da série HWLOC 2.x agora está exposta pela Hwlocality. Mas alguns recursos especializados, principalmente relacionados à interoperabilidade com outras APIs, não conseguiram fazer isso por vários motivos. Problemas com a etiqueta "Cobertura da API" Recursos de rastreamento não implementados e são um ótimo lugar para procurar contribuições potenciais para esta biblioteca, se você tiver tempo!
Se você já está familiarizado com a API HWLOC C, também ficará feliz em saber que os atributos #[doc(alias)] são amplamente utilizados para que você possa pesquisar na documentação de entidades de API HWLOC como hwloc_bitmap_t , hwloc_set_cpubind ou hwloc_obj::arity .
As principais exceções a esta regra são noções que não são necessárias na ferrugem devido a melhorias em ergonomia permitidas pelo sistema do tipo ferrugem. Por exemplo...
Drop implsHWLOC_MEMBIND_BYNODESET são substituídos por genéricos que fazem a coisa certa automaticamente. Este projeto usa a licença do MIT, consulte o arquivo de licença para obter mais informações.