[LINUX] Comment définir l'affinité du processeur pour les threads de processus

Notez que j'ai dû définir l'affinité du processeur pour que le thread fasse une certaine expérience.

Qu'est-ce que l'affinité CPU?

Le thread de processus s'exécute sur l'un des cœurs du processeur en fonction du système d'exploitation. En définissant l'affinité du processeur, il est possible de limiter et de spécifier arbitrairement le cœur du processeur à exécuter.

Définir l'affinité du processeur pour le processus

Linux a une fonction sched_setaffinity pour définir l'affinité CPU.

Pour le moment, un exemple


#define _GNU_SOURCE
#include <sched.h>

int main() {
  pid_t pid;
  cpu_set_t cpu_set;
  int result;

  pid = getpid;
  CPU_ZERO(&cpu_set);
  CPU_SET(2, &cpu_set);

  result = sched_setaffinity(pid, sizeof(cpu_set_t), &cpu_set);
  if (result != 0) {
    //Erreur
  }

  //En traitement

  return 0;
}

La structure cpu_set_t représente un ensemble de processeurs. Initialisez la structure cpu_set_t avec la fonction CPU_ZERO, puis spécifiez le cœur de CPU à exécuter avec la fonction CPU_SET. Pour un processeur à 4 cœurs, spécifiez une valeur comprise entre 0 et 3 comme premier argument. Pour plus de détails, reportez-vous au Manual.

sched_setaffinity L'argument de la fonction est l'ID de processus, la taille des données de cpu_set_t et le pointeur de cpu_set_t dans l'ordre.

Le premier argument peut être la fonction getpid. Le deuxième argument est fondamentalement sizeof (cpu_set_t). Le troisième argument spécifie le pointeur de la variable de structure cpu_set_t spécifiée par CPU_SET.

Définir l'affinité du processeur pour les threads

Avec la méthode ci-dessus, il est défini dans le processus lui-même, donc si vous souhaitez définir une affinité pour chaque thread, c'est un peu différent.

Selon l'environnement, c'est possible avec pthread_setaffinity_np. L'exemple de programme est omis car il est décrit dans Manual.

Si la fonction ci-dessus ne peut pas être utilisée, elle peut être définie en passant l'ID de thread au premier argument de la fonction sched_setaffinity. Si vous pouvez utiliser la fonction gettid, vous pouvez simplement lancer la variable de structure pid_t obtenue par la fonction gettid.

Si la fonction gettid ne peut pas être utilisée, appelez directement l'appel système pour obtenir l'ID de thread.

Exemple d'obtention de l'ID de thread à l'aide d'un appel système et de la définition de l'affinité du processeur


#include <sched.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>


pid_t gettid(void) {
  return syscall(SYS_gettid);
}


void* thread_main(void* args) {
  pid_t pid;
  cpu_set_t cpu_set;
  int result;

  pid = gettid;
  CPU_ZERO(&cpu_set);
  CPU_SET(2, &cpu_set);

  result = sched_setaffinity(pid, sizeof(cpu_set_t), &cpu_set);
  if (result != 0) {
    //Erreur
  }

 //En traitement

  return NULL;
}


int main() {
  pthread_t p;
  pthread_create(&p, NULL, thread_main, NULL);

  //En traitement

  return 0;
}

Résumé

Veuillez signaler toute erreur.

Recommended Posts

Comment définir l'affinité du processeur pour les threads de processus
Comment configurer Ubuntu pour le sous-système Windows pour Linux 2 (WSL2)
[Pour les non-programmeurs] Comment marcher Kaggle
Comment configurer cron pour le scraping Python normal sur le serveur Sakura.
Comment définir la résolution de sortie pour chaque image clé dans Blender
[Blender] Comment définir shape_key avec un script
Comment définir optuna (comment écrire un espace de recherche)
Comment configurer SVM à l'aide d'Optuna
Comment régler l'heure du serveur sur l'heure japonaise
Comment faire exécuter un thread de processus uniquement sur un cœur de processeur spécifique
Comment configurer XG Boost à l'aide d'Optuna
[Python] Organisation de l'utilisation des instructions
Comment installer le sous-système Windows pour Linux
Comment utiliser "deque" pour les données Python
Comment écrire ce processus en Perl?
Comment utiliser l'authentification par empreinte digitale pour KDE
[Pour l'enregistrement] Système d'image Keras Partie 1: Comment créer votre propre ensemble de données?
Comment utiliser MkDocs pour la première fois
Comment créer un plug-in Spigot (pour les débutants Java)
Comment configurer une forêt aléatoire à l'aide d'Optuna
Comment utiliser Template Engine pour Network Engineer
Comment définir l'emplacement du navigateur dans Headless Chrome
Comment définir la base de données de Django sur Mongodb Visual Studio 2019
Comment utiliser les outils d'analyse de données pour les débutants
Pilote de périphérique pour obtenir des informations sur le processeur d'ARM
Comment écrire une instruction ShellScript Bash for
Comment configurer une forêt aléatoire à l'aide d'Optuna
Comment configurer un serveur de développement local
[ESXi (vCenter)] Comment ajouter une carte réseau pour CentOS 7.3
[Pour les débutants] Comment étudier la programmation Mémo privé
Comment trouver la corrélation pour les variables catégorielles
Trouvez une ligne directrice pour le nombre de processus / threads à définir sur le serveur d'applications
Comment définir l'environnement de développement pour chaque projet avec VSCode + extension Python + Miniconda
Comment configurer l'authentification par clé publique avec SSH
Comment vérifier les valeurs manquantes (Kaggle: House Prices)
Comment traiter les images de caméra avec Teams et Zoom
[BigQuery] Comment utiliser l'API de BigQuery pour Python -Création de table-
[Pour les débutants] Comment utiliser la commande say avec python!
Comment configurer un environnement Python à l'aide de pyenv
[Pour les débutants] Comment étudier le test d'analyse de données Python3
Comment exécuter python dans l'espace virtuel (pour MacOS)
[Go] Comment créer une erreur personnalisée pour Sentry
Comment faire un test unitaire Part.2 Conception de classe pour les tests
Comment configurer Layer sur Lambda à l'aide d'AWS SAM
J'ai réfléchi à la façon d'apprendre la programmation gratuitement.
Comment créer un référentiel local pour le système d'exploitation Linux
[Blender] Comment définir dynamiquement les sélections EnumProperty
Comment créer un environnement de développement pour TensorFlow (1.0.0) (Mac)
[Introduction à Udemy Python3 + Application] 30. Comment utiliser l'ensemble
Python # Comment vérifier le type et le type pour les super débutants
Comment configurer et compiler l'environnement Cython
Comparez comment écrire le traitement des listes par langue
[Introduction à Python] Comment écrire des instructions répétitives à l'aide d'instructions for
Comment configurer WSL2 sur Windows 10 et créer un environnement d'étude pour les commandes Linux
Comment définir des variables pouvant être utilisées dans toute l'application Django ~ Utile pour les modèles, etc. ~