So weisen Sie einen Prozess zwei CPUs zu

So weisen Sie einen Prozess zwei CPUs zu

Ich habe einen Ubuntu-Server mit 16 CPUs. ( nproc --allzeigen Sie es mir 16)

Ich habe ein Bash-Skript mit test.shdem folgenden Namen geschrieben:

#!/bin/bash


while :
do
    echo xxx
done

Ich habe es ausgeführt: ./test.sh >/dev/null &.

Dann habe ich den Befehl verwendet, topum die CPU-Auslastung zu überwachen, und ich habe festgestellt, dass eine CPU aufgrund des folgenden Prozesses fast zu 100 % ausgelastet war test.sh:

6411 me       20   0   11240   3052   2852 R  93.8  0.0   0:11.71 test.sh
%Cpu5 : 96.7 us,  3.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

Wie wir sehen können, test.shwurde der Prozess der 5. CPU zugewiesen, die fast zu 100 % genutzt wurde.

Ist es möglich, einen schweren Prozess mehr als einer CPU zuzuweisen, damit wir die CPUs besser nutzen können? Warum hat das Betriebssystem den Prozess nicht test.shmehr als einer CPU zugewiesen? Liegt es daran, dass der Prozess test.shnicht schwer genug ist, oder müssen wir eine Konfiguration vornehmen, damit das Betriebssystem dies tut?

Antwort1

Ein einzelner Thread kann nicht auf mehrere Kerne aufgeteilt werden:

Ein Programm muss so geschrieben werden, dass es mehr als einen Thread hat (einen pro Kern), oder es muss mehr als ein Programm geben. Wenn nicht, werden Sie die Kerne nicht verwenden.

Das Schreiben von Programmen zur Verwendung mehrerer Kerne ist nicht trivial, und nicht alle Probleme können parallelisiert werden (so geschrieben werden, dass sie auf mehr als einem Kern ausgeführt werden). Wenn ein Problem zu 20 % aus im Wesentlichen sequentiellem Code besteht, ist es bei einer unendlichen Anzahl von Prozessoren nicht schneller als 20 % der ursprünglichen Ausführungszeit (500 % Geschwindigkeitssteigerung). Dann gibt es noch die Overheads (Kommunikation zwischen Threads).

Wenn Sie keine Verwendung für die Kerne haben, ist es besser, sie zu verkaufen und sich eine günstigere Maschine anzuschaffen.

Jeder Kern verfügt über eine Menge Parallelität, um einen einzelnen Thread zu verarbeiten, aber das ist nicht sichtbar. Jetzt haben wir Mühe, einen einzelnen Kern schneller zu machen, wenn wir Kerne hinzufügen. Das funktioniert zunächst gut.

Unix-Systeme (wie Gnu/Linux, z. B. Ubuntu) nutzen zusätzliche Kerne gut aus, bis zu etwa 2→4. Microsoft Windows profitiert von Verbesserungen, wenn Sie einen Kern für den Virenscanner, einen für den Defragmentierer und einen für alles andere haben.

Danach macht es nur noch einen Unterschied, wenn Sie Anwendungen haben, die für Multi-Core ausgelegt sind.

Antwort2

Hier sind Beispiele für Linux-Befehle, die mehrere Prozessoren verwenden können:

  • make -j
  • gcc -pipe

makeBesonders hilfreich und einfach ist diese Option beim Kompilieren großer Projekte mit gcc.

  • Fügen Sie die -fopenmpOption zu Ihren Build-Optionen hinzu, wenn Sie gcc aufrufen.

  • Versuchen Sie, das folgende Pragma direkt über Ihren For-Schleifen hinzuzufügen:

    #pragma omp parallel for
    for(i=0; i<8000000000; i++) {
        ptr[i] = i/10000;
    }
    

Standardmäßig erstellt OpenMP so viele Threads wie Kerne auf Ihrem Computer vorhanden sind und verteilt die Arbeitslast gleichmäßig auf sie.

verwandte Informationen