Eu usei o taskset para isso. Se você tem taskset instalado, algo como:
taskset -c 1,3 -p 45678
configuraria o processo com o ID 45678 para ter uma afinidade com os processadores 1 e 3.
A questão está no título: Como posso definir a afinidade do processador de um processo no Linux?
Dentro do processo, a chamada seria sched_setaffinity()
, ou para coisas pthreads, pthread_setaffinity_np()
Em uma nota relacionada, se você estiver preocupado com a afinidade da CPU com seu programa, talvez valha a pena prestar atenção em como ela está fazendo a alocação de memória também. Sistemas maiores com memória conectada a mais de um controlador (isto é, múltiplos soquetes de CPU, cada um com seus próprios) terão latência e largura de banda variáveis entre diferentes pares de memória de CPU. Você também desejará examinar a afinidade NUMA, usando o comando numactl
ou as chamadas do sistema com as quais ele trabalha. Um programa em que trabalhei obteve uma melhoria de desempenho de 10% com isso.
Você precisa instalar schedutils
(utilitários do Linux Scheduler).
Eu tenho usado no meu Ubuntu Desktop.
SF link
taskset -c 1-3 ./a.out arg1 arg2
inicia o processo a.out
com argumentos e afinidades determinados configurados para os processadores 1, 2 ou 3 (com base em zero).
Aqui está um programa de teste C mínimo que pode ser usado para vê-lo em ação: link