Como você controla a afinidade de threads em vários processos no Linux?

0

Pergunta

Como faço para executar dois benchmarks tais que:

  • Eles estão executando simultaneamente
  • Os dois benchmarks têm metade de seus threads em cada soquete.
  • Não há dois segmentos compartilhando o mesmo núcleo.

Antecedentes

Eu tenho dois programas: um benchmark escrito Fortran e um benchmark escrito em C. Ambos implementam a biblioteca OpenMP e estão configurados para.

Atualmente, estou tentando distribuir os encadeamentos de ambos os processos por vários sockets, evitando que os dois encadeamentos precisem compartilhar o mesmo núcleo. O OpenMP permite que os encadeamentos sejam distribuídos uniformemente em vários sockets usando a variável de ambiente OMP_PROC_BIND=spread . No entanto, ao executar os dois programas simultaneamente, acabo com os dois benchmarks compartilhando os mesmos núcleos.

Estou executando esses benchmarks em um servidor que tem dois processadores Haswell-E de 12 núcleos, e tenho os benchmarks ajustados para criar 12 threads por peça, então não há escassez de núcleos. Atualmente estou executando o CentOS 7.3.1611.

Nota lateral

Estou ciente de que esta é uma configuração estranha, no entanto, é necessária para a análise de desempenho. Muito obrigado antecipadamente a todos aqueles que contribuíram para este assunto.

    
por Derek Rodriguez 09.06.2017 / 00:56

1 resposta

0

Primeiro: obtenha seu layout de cpu em / proc / cpuinfo, que será algo como (isso está em uma listagem de 2 soquetes, 6 núcleos, truncada):

> cat /proc/cpuinfo |grep -P 'processor|physical id|core id'
processor : 0
physical id : 1
core id   : 0
processor : 1
physical id : 0
core id   : 0
processor : 2
physical id : 1
core id   : 1
processor : 3
physical id : 0
core id   : 1

physical-id será o seu socket, observe no meu caso, o toggle do core-id entre soquetes.

use 'schedtool' para definir a afinidade de 1 grupo para todos em 1 ID físico. Então, no meu caso, como as variáveis e probabilidades estão em CPUs (sockets) separados, eu usaria:

schedtool -a 0,2,4,6,8,10 -e run_group1 &
schedtool -a 1,3,5,7,9,11 -e run_group2 &

onde run_group1 inicia todos os seus tópicos que você quer em 1 core, e run_group2 inicia os outros. (olhe para 'man schedtool' (em seção 8 para mais opções. Eu coloquei os dois no fundo então ambos os grupos devem ser executados simultaneamente.

Você pode precisar ser root para definir a afinidade - não tenho certeza.

Isso resolve o seu Q ou eu entendi mal alguma coisa?

    
por 09.06.2017 / 05:28