Como definir a afinidade do processador no OS X?

17

Como você define a afinidade do processador no Snow Leopard em um MacBook Pro? Eu sei que no Windows você pode trocá-lo no Gerenciador de tarefas.

Troggy
fonte
2
<snarky-comment> Executar OS X em uma máquina virtual, e definir a afinidade da máquina virtual </ snarky-comment>
zildjohn01
Por que você quer fazer isso? Geralmente, é uma má ideia, a menos que você esteja tentando executar programas antigos com códigos tão ruins que quebram em sistemas multicore.
jalf
2
@jalf: a afinidade do processador pode melhorar o desempenho, pois reduz a invalidação e a lixeira do cache em alguns casos.
1
Isso é decepcionante. Parece que o Mac nunca será uma plataforma ideal para o desenvolvimento de software em tempo real.
Evan Plaice
1
@jweyrich Excepta em CPUs com QPI (NUMA da Intel), como as do Mac Pro, onde a configuração da afinidade da CPU desativa a afinidade da memória e diminui o desempenho. Isso não se aplica a processadores móveis.
Jano

Respostas:

14

O OS X suporta uma API de afinidade de encadeamento desde a versão 10.5. Aqui está um material relevante da página à qual eu vinculei.

Conjunto de afinidades

Um conjunto de afinidades é uma coleção de threads que compartilham recursos de memória e desejam compartilhar um cache L2. Conjuntos distintos de afinidade representam afinidades separadas - ou seja, encadeamentos pertencentes a um conjunto diferente devem usar um cache L2 separado e, portanto, ser executados em processadores lógicos diferentes.

Um conjunto de afinidades é identificado por uma "tag". Os segmentos são atribuídos a um conjunto de afinidades específico, atribuindo a ele a tag que identifica esse conjunto. Um encadeamento pode pertencer a no máximo um conjunto de afinidades; isto é, possui uma tag de afinidade.

Efeito da definição de tags de afinidade distintas

Por exemplo, um aplicativo que deseja executar 2 threads em caches L2 separados definiria os threads com diferentes tags de afinidade. Em uma máquina com núcleo duplo, essa afinidade será efetivamente ignorada. No entanto, em um MacPro de 4 núcleos, o agendador tentará executar threads em pacotes separados. Da mesma forma, em um MacPro de 8 núcleos, o agendador tentará executar esses threads em matrizes separadas (que podem ou não estar no mesmo pacote físico da CPU).

Exemplo de uso

Um aplicativo que deseja colocar um encadeamento em todos os processadores disponíveis faria o seguinte:

  • Obtenha o número de processadores no sistema usando sysctl (3).
  • Crie esse número de threads.
  • Defina cada segmento com uma marca de afinidade distinta.
  • Inicie todos os threads.

Threads com política de afinidade padrão serão agendados mais livremente em qualquer processador. Esses encadeamentos serão migrados preferencialmente para executar em um processador inativo. Threads com tags de afinidade tendem a permanecer no lugar.

Consulte a fonte para listagens de código e informações sobre o compartilhamento de tags de afinidade entre processos pai e filho, obtendo a configuração do cache da CPU e muito mais.

ponteiro vazio
fonte
Existe um utilitário de linha de comando, além desta API?
Victor Eijkhout 15/05/19
11

http://developer.apple.com/mac/library/releasenotes/Performance/RN-AffinityAPI/

O Mac OS X não exporta interfaces que identificam processadores ou controlam o posicionamento do encadeamento - o encadeamento explícito do encadeamento ao processador não é suportado . Em vez disso, o kernel gerencia todo o posicionamento do encadeamento. Os aplicativos esperam que, na maioria das circunstâncias, o planejador execute seus encadeamentos usando uma boa localização do processador com relação à afinidade do cache.

ta.speot.is
fonte
2
O OS X suporta uma API de afinidade de encadeamento desde a versão 10.5. Veja minha resposta para detalhes.
vazio-pointer
4

Até agora, o agendador XNU (1504.3.12) não implementa a afinidade do processador para processos nem encadeamentos.

Portanto, o MacOSX não fornece meios para fazer isso.

jweyrich
fonte
2

De http://images.apple.com/macosx/docs/OSX_for_UNIX_Users_TB_July2011.pdf

• Threads eficientes do kernel. Cada encadeamento POSIX é enfileirado em uma CPU específica, melhorando a afinidade e a escalabilidade do processador enquanto reduz a contenção de bloqueio. Os encadeamentos estão em conformidade com o POSIX (1c), incluindo suporte para cancelamento e mutexes compartilhados.

Parece um anúncio para mim, meu iMac executando o Lion parece respeitar isso na maioria das vezes, mas não 'fixa' um processo em um núcleo.

Não consegui encontrar nenhuma API para controlar a afinidade do processo para darwin de qualquer maneira.

Alan Baldo
fonte