[LINUX] Festlegen der CPU-Affinität für Prozessthreads

Beachten Sie, dass ich die CPU-Affinität für Threads festlegen musste, um ein bestimmtes Experiment durchzuführen.

Was ist CPU-Affinität?

Der Prozessthread wird je nach Betriebssystem auf einem der CPU-Kerne ausgeführt. Durch Einstellen der CPU-Affinität ist es möglich, den auszuführenden CPU-Kern willkürlich zu begrenzen und anzugeben.

Stellen Sie die CPU-Affinität für den Prozess ein

Linux verfügt über eine Funktion sched_setaffinity zum Festlegen der CPU-Affinität.

Vorerst ein Beispiel


#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) {
    //Error
  }

  //wird bearbeitet

  return 0;
}

Die Struktur cpu_set_t repräsentiert eine Reihe von CPUs. Initialisieren Sie die Struktur cpu_set_t mit der Funktion CPU_ZERO und geben Sie dann den CPU-Kern an, der mit der Funktion CPU_SET ausgeführt werden soll. Geben Sie für eine 4-Kern-CPU als erstes Argument einen Wert zwischen 0 und 3 an. Weitere Informationen finden Sie unter Handbuch.

sched_setaffinity Das Argument der Funktion ist die Prozess-ID, die Datengröße von cpu_set_t und der Zeiger von cpu_set_t in der angegebenen Reihenfolge.

Das erste Argument kann die Funktion getpid sein. Das zweite Argument ist im Grunde sizeof (cpu_set_t). Das dritte Argument gibt den Zeiger der von CPU_SET angegebenen Strukturvariablen cpu_set_t an.

Stellen Sie die CPU-Affinität für Threads ein

Mit der obigen Methode wird es im Prozess selbst festgelegt. Wenn Sie also die Affinität für jeden Thread festlegen möchten, ist dies etwas anders.

Abhängig von der Umgebung ist dies mit [pthread_setaffinity_np] möglich (http://linuxjm.osdn.jp/html/LDP_man-pages/man3/pthread_setaffinity_np.3.html). Das Programmbeispiel wird weggelassen, da es in Manual beschrieben ist.

Wenn die obige Funktion nicht verwendet werden kann, kann sie festgelegt werden, indem die Thread-ID an das erste Argument der Funktion sched_setaffinity übergeben wird. Wenn Sie die Funktion gettid verwenden können, können Sie einfach die von der Funktion gettid erhaltene Strukturvariable pid_t auslösen.

Wenn die Funktion gettid nicht verwendet werden kann, rufen Sie den Systemaufruf direkt auf, um die Thread-ID abzurufen.

Beispiel beim Abrufen der Thread-ID mithilfe eines Systemaufrufs und Festlegen der CPU-Affinität


#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) {
    //Error
  }

 //wird bearbeitet

  return NULL;
}


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

  //wird bearbeitet

  return 0;
}

Zusammenfassung

Bitte weisen Sie auf Fehler hin.

Recommended Posts

Festlegen der CPU-Affinität für Prozessthreads
So richten Sie Ubuntu für Windows Subsystem für Linux 2 (WSL2) ein
[Für Nicht-Programmierer] Wie man Kaggle läuft
So stellen Sie cron für reguläres Python-Scraping auf dem Sakura-Server ein.
So stellen Sie die Ausgabeauflösung für jeden Keyframe in Blender ein
[Blender] So legen Sie shape_key mit dem Skript fest
Wie man optuna einstellt (wie man einen Suchraum schreibt)
So richten Sie SVM mit Optuna ein
So stellen Sie die Serverzeit auf japanische Zeit ein
So führen Sie einen Prozessthread nur auf einem bestimmten CPU-Kern aus
So stellen Sie xg boost mit Optuna ein
[Python] Organisieren der Verwendung für Anweisungen
So installieren Sie das Windows-Subsystem für Linux
Verwendung von "deque" für Python-Daten
Wie schreibe ich diesen Prozess in Perl?
Verwendung der Fingerabdruckauthentifizierung für KDE
[Zur Aufnahme] Keras-Bildsystem Teil 1: Wie erstelle ich einen eigenen Datensatz?
So verwenden Sie MkDocs zum ersten Mal
So erstellen Sie ein Spigot-Plug-In (für Java-Anfänger)
So richten Sie eine zufällige Gesamtstruktur mit Optuna ein
Verwendung von Template Engine für Network Engineer
So legen Sie den Browserstandort in Headless Chrome fest
So stellen Sie Djangos DB auf mongodb visual studio 2019 ein
Verwendung von Datenanalysetools für Anfänger
Gerätetreiber zum Abrufen der CPU-Informationen von ARM
So schreiben Sie einen ShellScript Bash für Anweisung
So richten Sie eine zufällige Gesamtstruktur mit Optuna ein
So richten Sie einen lokalen Entwicklungsserver ein
[ESXi (vCenter)] Hinzufügen einer Netzwerkkarte für CentOS 7.3
[Für Anfänger] Wie man Programmierung studiert Private Memo
So finden Sie die Korrelation für kategoriale Variablen
Suchen Sie eine Richtlinie für die Anzahl der Prozesse / Threads, die auf dem Anwendungsserver festgelegt werden sollen
So legen Sie die Entwicklungsumgebung für jedes Projekt mit VSCode + Python-Erweiterung + Miniconda fest
So richten Sie die Authentifizierung mit öffentlichem Schlüssel mit ssh ein
So suchen Sie nach fehlenden Werten (Kaggle: House Prices)
So verarbeiten Sie Kamerabilder mit Teams und Zoom
[BigQuery] Verwendung der BigQuery-API für die Python-Tabellenerstellung-
[Für Anfänger] Wie man den Befehl say mit Python benutzt!
So richten Sie eine Python-Umgebung mit pyenv ein
[Für Anfänger] So studieren Sie den Python3-Datenanalysetest
So führen Sie Python im virtuellen Raum aus (für MacOS)
[Go] So erstellen Sie einen benutzerdefinierten Fehler für Sentry
So führen Sie einen Komponententest durch Teil 2 Klassendesign zum Testen
So konfigurieren Sie Layer auf Lambda mit AWS SAM
Ich dachte darüber nach, wie man kostenlos Programmieren lernt.
So erstellen Sie ein lokales Repository für Linux
[Blender] So legen Sie die Auswahlelemente von EnumProperty dynamisch fest
So erstellen Sie eine Entwicklungsumgebung für TensorFlow (1.0.0) (Mac)
[Einführung in die Udemy Python3 + -Anwendung] 30. Verwendung des Sets
Python # So überprüfen Sie Typ und Typ für Super-Anfänger
So richten Sie die Cython-Umgebung ein und kompilieren sie
Vergleichen Sie, wie die Verarbeitung für Listen nach Sprache geschrieben wird
[Einführung in Python] So schreiben Sie sich wiederholende Anweisungen mit for-Anweisungen
So richten Sie WSL2 unter Windows 10 ein und erstellen eine Lernumgebung für Linux-Befehle
So legen Sie Variablen fest, die in der gesamten Django-App verwendet werden können ~ Praktisch für Vorlagen usw. ~