Kann ich alle 4 Kerne der Raspberry Pi-CPU verwenden?

11

Ich habe mich gefragt, ob es eine einfache Möglichkeit gibt, alle 100% der CPU "einzuschalten", damit ich Prozesse schneller ausführen kann (z. B. Python-Berechnungen).

1) Ist das möglich?

2) Gibt es eine einfache Möglichkeit, zum Normalzustand zurückzukehren?

3) Gibt es eine Möglichkeit, auf Wunsch weniger CPU zu verbrauchen?

Ich denke an eine Befehlszeileninteraktion wie:

pi@raspberry:~ $ sudo turnOnFourCores python run.py

NaN
quelle
1
Die kurze Antwort ist Nein
Steve Robillard
16
Die lange Antwort lautet "Wenn es so einfach wäre, wäre es die Standardeinstellung"
Shadow
18
Ihre beiden Kommentare sind irreführend und könnten bedeuten, dass der Pi 4 Kerne hat, aber immer nur 1 verwendet. Eine bessere Antwort ist, dass alle vier Kerne bereits aktiviert sind, Python (und jedes andere Programm) jedoch nur mehr verwendet als 1 Kern, es sei denn, sie sind Multithread-fähig. Python kann aufgrund der globalen Interpretersperre auch mit Multithreading effektiv mit einem einzigen Kern stecken bleiben, aber das geht etwas über den Rahmen dieser Frage hinaus.
Sohcahtoa82
13
Zur Verdeutlichung denke ich, dass das OP ein Missverständnis darüber hat, wie Multi-Core-CPUs funktionieren, und Ihre Antworten verstärken nur ihr Missverständnis.
Sohcahtoa82
6
Der einfachste Weg, ein Python-Programm schneller zu machen, besteht darin, in einer kompilierten Sprache neu zu schreiben (oder zumindest die zeitkritischen Aufgaben mit einem Wechselstrommodul zu erledigen).
Milliways

Antworten:

21

Standardmäßig versucht jeder Computer, alle seine Kerne zu verwenden, wenn dies möglich ist. Dies kann jedoch nur erreicht werden, wenn eine Anwendung über mehrere Threads verfügt. Wenn dies nicht der Fall ist (dh ein Python-Skript, das das threadingModul nicht verwendet ), kann maximal ein Kern verwendet werden. Dies entspricht 25% der CPU einer Vierkern-CPU. Wenn Sie Ihr Skript so ändern möchten, dass mehrere Kerne verwendet werden, können Sie Ihre Berechnung in mehrere Teile aufteilen und wie in der Python-Dokumentation gezeigt mit mehreren Threads versehen .

Aktualisieren:

Wie Anon antwortete , funktioniert dies nicht, ohne mit Pythons GIL (Global Interpreter Lock) zu arbeiten. Dadurch können Aufgaben (scheinbar) gleichzeitig ausgeführt werden, Code kann jedoch nicht über mehrere Kerne ausgeführt werden. Wenn Sie in C geschriebene Module verwenden (z. B. numpy), können Sie mit dieser Option mehrere Kerne verwenden , um diese Einschränkung zu umgehen . Wenn dies keine Option ist, bietet Python außerdem Multiprocessing an , mit dem Sie jede Aufgabe auf mehreren Kernen ausführen können.

Lichter0123
quelle
Das Update - was richtig ist - erklärt, warum der erste Teil der Antwort in Bezug auf Python falsch ist. Sie umgehen diese Einschränkung von Python nur, indem Sie Module C oder eine kompilierte Sprache schreiben. Zu diesem Zeitpunkt schreiben Sie Python überhaupt nicht mehr wirklich. Wenn die Leistung kritisch ist, ist die Verwendung einer kompilierten Sprache die richtige Antwort. (Multiprocessing ist aus Sicht der Ressourcennutzung nicht dasselbe.)
Brick
4
@Brick Um ganz klar zu sein, eine kompilierte Sprache ist sicherlich keine Voraussetzung für ein ordnungsgemäßes Multithreading im Prozess. Heck, sogar Pythons GIL ist ein Implementierungsdetail (gewährt für das beliebte CPython) - es gibt andere Python-Interpreter, die gerne Multithreading betreiben, z. B. Jython und IronPython.
Bob
4
Zu der Verwirrung, Python wird zusammengestellt; Im Fall von CPython wird der CPython-Bytecode kompiliert, der in der CPython-VM ausgeführt wird. Für Jython wird es zu Java-Bytecode kompiliert, der in der JVM ausgeführt wird. Und schließlich wird IronPython zu CIL kompiliert, das auf die .NET-Laufzeit abzielt. Also, "in eine kompilierte Sprache gehen" für die Aufführung macht nicht wirklich Sinn;)
marcelm
Jeder Computer wird versuchen, alle seine Kerne zu verwenden, wenn er kann. Nicht wirklich, es wird nur alle seine Kerne verwenden (oder irgendetwas anderes tun), wenn es dazu aufgefordert wird . Diese Unterscheidung mag für den Erfahrenen offensichtlich oder sogar bevormundend erscheinen, aber es klingt so, als müsste das OP erkennen, dass dies nicht automatisch geschieht.
nekomatisch
13

Ich habe mich gefragt, ob es eine einfache Möglichkeit gibt, alle 100% der CPU "einzuschalten", damit ich Prozesse schneller ausführen kann (z. B. Python-Berechnungen).

Nicht in dem Sinne, wie ich denke, dass Sie es implizieren. Dies ist auch kein pi-spezifisches Problem, sondern eine logische Einschränkung.

Alleine Computer haben derzeit nicht viel Kapazität, um zu bestimmen, dass ein Prozess, der als einzelner Thread ausgeführt wird, stattdessen parallel ausgeführt werden kann. Beachten Sie, dass zu dem Zeitpunkt, an dem sie möglicherweise über diese Kapazität verfügen, keine Computerprogrammierer erforderlich sind, da ein Computersystem, das dies tun könnte, auch seinen eigenen Code 1 schreiben könnte .

Betrachten Sie den folgenden einfachen mathematischen Ausdruck:

(4 + 2) * 17 / (3 + 6)

Es besteht ein gewisses Potenzial für eine parallele Berechnung, das jedoch logisch begrenzt ist. Ich würde sagen, dass es in mehr als zwei Threads keinen Sinn macht, und selbst dann wird es meistens nur einer sein:

#1 a) 4 + 2 b) 6 * 17 c) 102 / 9
#2 a) 3 + 6

Thread Nr. 2 hat dazu beigetragen, indem er 3 + 6 = 9 berechnet hat, das in Schritt C von Thread Nr. 1 verwendet wurde, und es einen Schritt gespeichert hat. Aber das ist so weit, wie Parallelität hier sinnvoll sein wird. Während Thread Nr. 2 17/9 berechnen könnte , während Nr. 1 6 * 17 ausführt, wäre dies sinnlos, da Sie jetzt zwei verschiedene Pfade zum selben Ziel haben, die nicht neu kombiniert werden können. Dh # 2 könnte weiterarbeiten:

b) 17 / 9 c) 1.888 * 6

Und am Ende das gleiche Ergebnis wie in Thread Nr. 1 (11.333), aber sie haben sich über Schritt A hinaus nicht gegenseitig geholfen. Daher ist es Zeitverschwendung, wenn zwei von ihnen dieses Ziel verfolgen.

(Beachten Sie, dass es sich bei diesem Beispiel nicht um ein wörtliches Beispiel handelt. Es soll ein logisches Prinzip demonstrieren. Der Umfang, in dem Aufgaben in Benutzercode eingefügt werden, ist viel größer, aber Sie benötigen keine echte Lektion in Multithread-Programmierung, um dies zu tun begreife die Idee hier.)

Für die Nutzung mehrerer Prozessoren ist Code erforderlich, der dafür geschrieben wurde. Sie können nicht einfach etwas nehmen und sagen: "Oh, verwenden Sie alle 4 Kerne und machen Sie es schneller!". Das würde nicht passieren. Logischerweise beinhalten viele (..oder die meisten) Probleme und Aufgaben Schritte, die nicht parallel ausgeführt werden können. Sie müssen nacheinander ausgeführt werden.


1. Aber siehe Felix Dombeks Kommentar unten; Ich bin kein Experte für KI. Es kann auch erwähnenswert sein, dass gemäß den Kommentaren von Peter Corde zeitgemäße Befehlssätze und Prozessoren vom Betriebssystem genutzt werden können, um sehr feinkörnige Dinge parallel zu optimieren, und Hardware-Pipelines tun dies ebenfalls, wenn auch nicht über Kerne hinweg (eine einzige) Core hat mehr als eine Sache: Er arbeitet an verschiedenen Stellen mit dem Befehlsstrom, bevor er endgültig ausgeführt wird. Ich habe versucht, mich hier an das Thema der Benutzer-Threads zu halten, da ich denke, dass dies mehr oder weniger das ist, worauf Sie abzielen.

Goldlöckchen
quelle
4
Ich habe viel parallelen numerischen Code geschrieben, und dies ist in Bezug auf die Details etwas irreführend. Sie parallelisieren nicht auf der Ebene einzelner arithmetischer Operationen wie dieser. (Wenn wir über Raspberry Pi hinaus expandieren, werden einige Complier und Prozessoren einen Teil davon ohnehin bereits außerhalb von Threading-Strukturen parallelisieren.) Sie parallelisieren ganze Aufgaben in größeren Blöcken.
Brick
4
@Brick "Sie parallelisieren nicht auf der Ebene einzelner arithmetischer Operationen wie dieser." -> Natürlich nicht, aber ich werde noch deutlicher machen, dass dies eine Analogie ist, keine Lektion über die Multithread-Programmierung von Schrauben und Muttern.
Goldlöckchen
4
Die Parallelität in der Berechnung, die Sie als Beispiel verwenden, ist so lokalisiert, dass in einem Programm, das sie berechnet, Parallelität auf Befehlsebene erzeugt wird, und CPUs mit Ausführung außerhalb der Reihenfolge können diese Parallelität selbst ausnutzen.
Peter Cordes
2
RPi3 verwendet ein in der Reihenfolge 2 breites Superskalar en.wikipedia.org/wiki/ARM_Cortex-A53 , sodass ein Compiler bei sorgfältiger Befehlsplanung das ILP weiterhin ausnutzen kann, indem er zwei addBefehle nebeneinander platziert, sodass beide im selben ausgeführt werden können Taktzyklus. Der folgende Multiplikations- und Divisionsrest wird jedoch durch Datenabhängigkeiten serialisiert, wie Sie hervorheben.
Peter Cordes
1
Das Bestimmen parallelisierbarer Teile erfordert nicht unbedingt eine starke KI. Im "allgemeinen" Sinne könnte es sein; Es ist jedoch leicht vorstellbar, dass Computer einen heuristischen Ansatz verwenden könnten, der meist in vielen praktischen Fällen funktioniert. Ein Computer hat Fermats letzten Satz nicht bewiesen, aber es gibt sicherlich Satzbeweisprogramme. Beachten Sie, dass moderne Compiler für Programmiersprachen im Rahmen ihrer Optimierungsschritte bereits viele Code-Neuanordnungen vornehmen, bei denen über parallelisierbare Teile nachgedacht wird.
Felix Dombek
7

Nein für Python.

Andere Leute schlagen vor, dass Sie sich mit Threading befassen, was für die meisten Sprachen eine gültige Antwort ist, aber sie haben nicht berücksichtigt, dass Sie Python verwenden.

Mit der Python- GIL können Sie mehrere Kerne nicht effektiv nutzen.

Anon
quelle
3
Die GIL macht es etwas schwieriger , alle 4 Kerne zu verwenden. In keiner Weise macht es das unmöglich oder sogar wirklich so herausfordernd.
Gefälschter Name
5

Die Verwendung mehrerer Kerne erfordert die explizite Offenlegung der Parallelität auf Thread-Ebene für das Betriebssystem, sodass der Programmierer normalerweise ein Multithread-Programm schreiben muss. (Oder um ein Single-Thread-Programm mehrmals auf verschiedenen Eingaben auszuführen, z. B. beim Kompilieren mit make -j4)

Compiler für einige Sprachen unterstützen jedoch die automatische Parallelisierung. Beispielsweise kann C oder C ++ mit OpenMP eine gewöhnliche for()Schleife in ein Programm kompilieren , das mehrere Threads startet.

#pragma omp parallel for
for(int i = 0; i < 1000000; ++i)
{
   A[i] = B[i] * constant + C[i];
}

Dies muss jedoch passieren, wenn Sie das Programm geschrieben oder kompiliert haben. Derzeitige Hardware und Betriebssysteme können nicht mehrere Kerne verwenden, um ein Single-Thread-Programm zu beschleunigen.


Verwandte: Wie läuft ein einzelner Thread auf mehreren Kernen? : Antwort: Sie tun es nicht. Es gibt jedoch auch andere Arten von Parallelität, z. B. Parallelität auf Befehlsebene , die ein einzelner CPU-Kern findet und ausnutzt, um einen einzelnen Thread schneller als jeweils einen Befehl auszuführen.

Meine Antwort auf diese Frage geht auf einige Details ein, wie moderne CPUs feinkörnige Parallelität auf Befehlsebene finden und ausnutzen. (Hauptsächlich mit Fokus auf x86). Dies ist nur ein Teil der Funktionsweise normaler CPUs, da mehrere Anweisungen gleichzeitig im Flug sind, und muss nicht speziell aktiviert werden. (Es gibt Leistungsindikatoren, mit denen Sie sehen können, wie viele Anweisungen pro Takt Ihre CPU während der Ausführung eines Programms oder anderer Maßnahmen ausführen konnte.)

Beachten Sie, dass RPi3 in der Reihenfolge ARM Cortex-A53-CPU-Kerne verwendet . Jeder Kern ist 2-fach superskalar (2 Befehle pro Takt, wie ILP dies zulässt), kann jedoch keine Befehle neu anordnen, um mehr Parallelität auf Befehlsebene zu finden und die Latenz zu verbergen.

Da die CPU dennoch über eine Pipeline verfügt, ist die Gesamtzahl der Befehle im Flug (vom Abrufen und Decodieren bis zur Rückschreibphase am Ende der Pipeline) erheblich. Wenn Datenabhängigkeiten die Dinge nicht einschränken, können in jeder Pipeline-Phase, an der die CPU arbeitet, 2 Befehle mit einem Durchsatz von 2 Befehlen pro Takt vorhanden sein. (Das bedeutet 2-weit.)

Es kann keine Befehle außerhalb der Reihenfolge ausführen, aber bei sorgfältiger Befehlsreihenfolge (normalerweise durch einen Compiler) kann es dennoch die Latenz eines Befehls verbergen, der mehrere Zyklen benötigt, bis seine Ausgabe bereit ist. (zB ein Ladevorgang, selbst wenn er im Cache eintrifft oder multipliziert wird, dauert mehrere Zyklen, während ein Add im nächsten Zyklus bereit ist). Der Trick besteht darin, die asm-Anweisungen so zu ordnen, dass zwischen der Anweisung, die ein Ergebnis erzeugt, und der Anweisung, die es verwendet, mehrere unabhängige Anweisungen bestehen.

Wenn Software (ein Compiler) Anweisungen statisch plant, ist dies spröder als Hardware, die intern neu angeordnet werden kann, während die Illusion erhalten bleibt, in Programmreihenfolge ausgeführt zu werden. Für Compiler ist es sehr schwierig, so gute Arbeit zu leisten wie für ein kleines Fenster außerhalb der Reihenfolge, in dem Anweisungen neu angeordnet werden können, da Cache-Fehler nicht vorhersehbar sind und es schwierig ist, Abhängigkeitsketten über Funktionsaufrufe hinweg zur Kompilierungszeit zu analysieren. Und die Anzahl der Register ist ohne Umbenennen der Hardwareregister begrenzt.


All dies ist ein kleiner Komfort, wenn Ihr Code langsamer ausgeführt wird, als Sie möchten. Sicher, in einem Cortex-A53 steckt viel cooles Zeug unter der Haube, aber in einem Cortex-A57 steckt noch mehr cooles Zeug unter der Haube (wie die Ausführung von bis zu 3 Anweisungen pro Uhr außerhalb der Reihenfolge) und noch mehr in eine große x86-CPU wie Skylake (ganz zu schweigen von den Taktgeschwindigkeitsunterschieden).

Cortex-A53 ist ziemlich fantastisch im Vergleich zu einer https://en.wikipedia.org/wiki/Classic_RISC_pipeline wie Original-MIPS, die Sie im Computerarchitekturunterricht kennenlernen würden, aber für moderne Verhältnisse ist es ziemlich billig.

Peter Cordes
quelle
1
"Derzeitige Hardware und Betriebssysteme können nicht mehrere Kerne verwenden, um ein Single-Thread-Programm zu beschleunigen." ist nicht streng wahr. Beispielsweise kann Java in einem Java-Programm mit einem Thread alle GC- und Laufzeitanalysen / -kompilierungen auf zusätzlichen CPU-Kernen durchführen. Die Laufzeitanalyse ist eine große Sache, da sie entscheiden kann, einige Optimierungen basierend auf der Ausführung von Codepfaden vorzunehmen, ohne Ihren "einzelnen Thread" etwas zu kosten, und sie mit dem, was sie aus der Analyse lernt, erheblich beschleunigen kann. Im Allgemeinen ist Ihr Punkt jedoch gut.
Bill K
@BillK Um fair zu sein, das "Programm" in diesem Zusammenhang ist es javanicht myapp.jarund es ist sicherlich kein Single-Thread.
Goldlöckchen
1
Es stimmt, ich habe nur darauf hingewiesen, dass der "Code, den Sie schreiben", je nachdem, wie die Laufzeit gestaltet wurde, zusätzliche Kerne nutzen kann, ohne ihn explizit als Multithread-App zu codieren. Python könnte auch eine leistungsfähigere Laufzeit liefern, aber es wäre irgendwie sinnlos. Es ist sowieso kein großer Sprung - ich denke, sogar Java verwendet nur einen zusätzlichen 1/2 Kern, um mit einer einzigen Thread-App zu helfen.
Bill K
" Es gibt keine Möglichkeit für aktuelle Hardware und Betriebssysteme, mehrere Kerne zu verwenden, um ein Single-Thread-Programm zu beschleunigen. " Unmittelbar danach erklären Sie, wie Hardware Anweisungen parallel ausführt.
Thomas Weller
3
@ThomasWeller Ja, aber um wählerisch zu sein, werden beim Pipelining von Prozessoren nicht mehrere Kerne verwendet. Es ist in einem Kern enthalten, ermöglicht jedoch die Arbeit an mehreren Befehlsströmen. Das heißt, es ist eine Form der Parallelität, aber es ist keine Form des Mehrkern-Threadings.
Goldlöckchen
4

So funktionieren CPUs überhaupt nicht.

Gegenwärtig ist Ihre CPU perfekt in der Lage, zu 100% ausgelastet zu sein, vorausgesetzt, sie wird aufgrund von Temperaturproblemen bei 80 Grad Celsius oder mehr nicht gedrosselt. Davon abgesehen möchten Sie (im Allgemeinen) nicht, dass Ihre CPU zu 100% gebunden ist. Wenn Sie routinemäßig eine CPU-Auslastung von 100% haben, haben Sie wahrscheinlich zu viel für Ihren Prozessor. Dies führt zu Stottern und einer allgemein unglücklichen Benutzererfahrung.

Im Vergleich zu etwas physischerem ähnelt Ihre CPU-Auslastung einem Auto. Das Auto ist wahrscheinlich in der Lage, 100 Meilen pro Stunde zu fahren, aber es besteht eine gute Chance, dass Ihr Tacho etwas deutlich darunter anzeigt. Wenn Sie in der Stadt sind, können Sie möglicherweise nie ungefähr 40 km / h erreichen. Das ändert jedoch nichts daran, dass das Auto 100 Meilen pro Stunde fahren kann. Sie haben das Gaspedal einfach nicht stark genug gedrückt.

Wenn Sie das RPi einfach dazu bringen, mehr zu tun (mehr auf das Gaspedal drücken), steigt die CPU-Auslastung. Beobachten Sie beispielsweise die CPU-Auslastung, wenn Sie den Befehl yesin einem ctrl+cTerminalfenster ausführen (Denken Sie daran, dass Terminalbefehle beendet werden). Dies erhöht Ihre CPU um 25%, da einer Ihrer vier CPU-Kerne maximal genutzt wird.

Jacobm001
quelle
5
Ich denke, diese Antwort ist irreführend, wenn man sagt, dass Sie im Allgemeinen nicht möchten, dass Ihre CPU zu 100% ausgelastet ist. Es gibt viele numerisch intensive Anwendungen, bei denen Sie unbedingt eine 100% ige Auslastung wünschen, da Sie die Maschine (n) der Berechnung gewidmet haben. Um echte Supercomputerzeit zu erhalten, müssen Sie häufig nachweisen, dass Ihr Code dafür gut genug optimiert ist. Andernfalls werden Sie als Ressourcenverschwendung abgelehnt. Wenn Sie einen Pi-Cluster haben, erhalten Sie natürlich keine Super-Computerleistung, aber das könnte es kritischer machen, die Nutzung zu maximieren, nicht weniger!
Brick
3
Ich stimme Brick in dem Sinne zu, dass es hier impliziert zu sein scheint, dass wenn ein Prozessor bei 25% liegt, es daran liegt, Benzin zu sparen oder das Tempolimit einzuhalten;) oder höflich zu sein und keine Schweineressourcen. Vielleicht möchten Sie klarer machen, dass dies im Allgemeinen darauf zurückzuführen ist, dass jede Aufgabe die meiste Zeit auf E / A wartet. Dinge, die einen einzelnen Kern bis zum Ende ausführen können, werden es tun. Was (idealerweise) verhindert, dass dies die Benutzeroberfläche stört, ist die Zeitersparnis - aber realistisch gesehen ist es immer noch ziemlich einfach, eine kleine Single-Core-Maschine zu blockieren.
Goldlöckchen
Eine 100% ige CPU-Auslastung führt im Allgemeinen nicht zu einer schlechten UX. Sogar 1000% können gut genug sein, da die meisten Programme nicht durch die CPU, sondern durch andere Faktoren begrenzt sind. Die einzigen Programme, die aufgrund einer extremen CPU-Auslastung langsam werden, sind die Programme, die die CPU tatsächlich ständig verwenden.
Oskar Skog
4

Die anderen Antworten enthalten zwar gute Details, scheinen jedoch Ihre Frage (n) nicht speziell zu beantworten.

  1. Ja, wenn das Programm (und das Betriebssystem) so programmiert sind, dass mehrere Kerne berücksichtigt werden. ('Threading' ist hier der Begriff in der Programmierung)
  2. Die Maschine verwendet so viel oder so wenig von jedem Kern, wie sie benötigt, um die Aufgabe abzuschließen. Es besteht also keine Notwendigkeit, etwas zu ändern.
  3. Sie können die maximale Nutzung einschränken, dies ist jedoch bei normaler Verwendung nicht erforderlich. Schauen Sie sich die Antworten hier an: - /unix/151883/limiting-processes-to-not-exceed-more-than-10-of-cpu-usage

NB:

Wenn Sie die Leistung des Pi insgesamt verbessern möchten, sollten Sie sich mit Übertakten befassen. Dadurch kann die CPU schneller laufen. Die Nachteile sind eine erhöhte Wärmeerzeugung, eine geringere Lebensdauer des Prozessors und ein höherer Stromverbrauch.

Stese
quelle
2

Wenn möglich, würde ich das Skript parametrisieren und in separaten Python-Prozessen ausführen. Beispielsweise:

cat parameters.txt | xargs -n1 -P4 python run.py

Eine andere Alternative ist die bereits erwähnte Multiprocessing-Bibliothek, mit der Sie Python-Prozesse verzweigen und verbinden können. Dazu müssen Sie jedoch auch eine Liste von Parametern (z. B. einen Dateinamen) haben, für die Berechnungen ausgeführt werden sollen.

NikoNyrh
quelle
Erster Teil: Ja, die Annahme des vorliegenden Problems ist peinlich parallel .
Peter Mortensen
Ahaa stimmt, ich war nur mit dem Verarbeitungspool von Multiprocessing vertraut, mapaber anscheinend hat er auch viele ziemlich ausgefeilte Shared-Memory-Konstrukte.
NikoNyrh
1

Ich denke, OP versteht die Konzepte der Multi-Core / Multi-Thread-Programmierung möglicherweise nicht vollständig und wie schwierig es ist, 100% des Multi-Core vollständig zu nutzen, es sei denn, der Algorithmus kann leicht zu einer peinlichen Parallele gemacht werden Problem gemacht werden.

Weitere Informationen finden Sie unter dem bekannten Artikel "The Free Lunch Is Over" unter http://www.gotw.ca/publications/concurrency-ddj.htm

sonofusion82
quelle
0

Wenn Sie Ihr RPI testen möchten. Sie können stresswie hier ausführen und dann sehen, wie Ihre CPUs verwendet werdenhtop . Dies ist nützlich, da Sie sehen können, ob Ihre Stromquelle ausreicht. Wenn dies nicht ausreicht, versucht Ihr RPI, zu viel Strom (Stromstärke) zu verbrauchen, und es wird heruntergefahren.

Wenn Sie dagegen Python-Skripte verwenden möchten, sollten Sie sehen, joblibwelche Funktion hervorragend funktioniert, wenn Sie Prozesse parallelisieren möchten, und daher die gewünschte Anzahl von Prozessoren verwenden.

Silgon
quelle
0

Obwohl all diese Antworten auf unterschiedliche Weise richtig sind, verwendet das Betriebssystem automatisch die verschiedenen Kerne, um die Last zu verteilen. Sie können dies mit einem einfachen Python-Programm sehen (temp.py say)

while True:
  x = 1.0

Öffnen Sie ein Terminal von Ihrem RPi-Desktop und geben Sie ein, $ topdas die Prozessorarbeit anzeigt . Öffnen python3 temp.pySie dann ein anderes Terminal und Sie werden sehen, dass ein Python3-Job auf 100% Prozessorzeit ansteigt. Öffnen Sie dann ein anderes Terminal und wiederholen Sie den Vorgang, um zu sehen, wie Sie sich bis zu 400% bewegen. Auf einer Ebene, wie @Shadow kommentierte, ist es so einfach und es ist die Standardeinstellung. Das Entwerfen von Programmen, die die Parallelverarbeitung verwenden können, ist jedoch nicht trivial, wie andere erklärt haben.

paddyg
quelle
0

Die Antwort ist ein klares JA! Sie müssen einfach Ihr Programm schreiben, um sie zu erkennen und zu verwenden. Programme, die dies tun, können die Kerne verwenden. Ich schreibe meine, um dies in Java zu tun und somit kann ich.

Die obigen Antworten von Python-Entwicklern haben ein sehr begrenztes Konzept für diese Antwort und können daher sehr verwirrend sein, aber die Antwort lautet JA und nur JA!

Orubel
quelle
Können Sie bitte näher darauf eingehen?
SDsolar
0

Da das OP in seiner Frage kein Python angegeben hat, möchte ich zwei weitere moderne Sprachen vorschlagen, die auf dem Raspberry Pi einwandfrei funktionieren und sehr einfache Möglichkeiten zur Verwendung der Parallelität bieten.

Mein aktueller Favorit ist die Rust-Sprache. Ich habe Programme auf dem Pi geschrieben und kompiliert. Rust ist insofern gut, als es viele Arten von Zeiger- und Race-Condition-Bugs verhindert, was das Schreiben von gleichzeitigem Code sowohl einfacher als auch sicherer macht. Rust ist als Systemprogrammiersprache gedacht, kann aber so ziemlich alles, was C kann.

Eine andere solche Sprache ist Go (auch Golang genannt, um die Suche zu erleichtern). Go wurde vom Google-Team erstellt und ist eine einigermaßen ausgereifte Sprache. Es ist einfach, Coroutinen in Go zu erstellen, die sie "Go-Routinen" nennen.

Beide Sprachen können Code auf dem Raspberry Pi kompilieren, sogar auf dem Pi Zero. Beide können jedoch von einem schnelleren Computer aus kompiliert werden, was für große Programme gut ist.

NomadMaker
quelle