
Como posso definir a afinidade do processador de um processo no Linux?
Responder1
Eu usei o conjunto de tarefas para isso. Se você tiver o conjunto de tarefas instalado, algo como:
taskset -cp 0,2 45678
definiria o processo com id 45678 para ter afinidade com cpus 1 e 3.
Responder2
Dentro do processo, a chamada seria sched_setaffinity()
, ou para coisas de pthreads,pthread_setaffinity_np()
Por falar no assunto, se você está preocupado com a afinidade da CPU do seu programa, pode valer a pena prestar atenção em como ele está fazendo a alocação de memória também. Sistemas maiores com memória conectada a mais de um controlador (ou seja, vários soquetes de CPU, cada um com o seu próprio) terão latência e largura de banda variáveis entre diferentes pares de CPU-memória. Você também desejará examinar a afinidade NUMA, usando o numactl
comando ou as chamadas do sistema com as quais ele funciona. Um programa em que trabalhei obteve uma melhoria de desempenho de 10% com isso.
Responder3
Você precisa instalar schedutils
(utilitários de agendamento do Linux). Eu o usei no meu Ubuntu Desktop.
SFlink
Responder4
taskset -c 1-3 ./a.out arg1 arg2
inicia o a.out
processo com determinados argumentos e afinidade definida para os processadores 1, 2 ou 3 (baseado em zero).
Aqui está um programa de teste C mínimo que pode ser usado para vê-lo em ação:https://stackoverflow.com/questions/10490756/how-to-use-sched-getaffinity-and-sched-setaffinity-in-linux-from-c/50117787#50117787