Ich habe einen Ubuntu-Server mit 16 CPUs. ( nproc --all
zeigen Sie es mir 16
)
Ich habe ein Bash-Skript mit test.sh
dem 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, top
um 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.sh
wurde 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.sh
mehr als einer CPU zugewiesen? Liegt es daran, dass der Prozess test.sh
nicht 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
make
Besonders hilfreich und einfach ist diese Option beim Kompilieren großer Projekte mit gcc
.
Fügen Sie die
-fopenmp
Option 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.