Der neu veröffentlichte Raspberry Pi 2 verfügt über eine 4-Kern-CPU. Es ist eine gute Idee, also möchte ich die verteilte Verarbeitung durchführen und alle 4 Kerne verbrauchen.
Ich habe ein einfaches verteiltes Verarbeitungsprogramm mit dem Distributed Processing Framework Parallel Python ausgeführt und die Verarbeitungsgeschwindigkeiten des alten und des neuen Modells verglichen. Wir haben auch die Nutzungsrate jedes Kerns mit mpstat überprüft.
Im Vergleich zum alten Modell ist es bei Verwendung von 4 Kernen ** ungefähr 8,5-mal ** und selbst mit 1 Kern allein ** ungefähr 2,4-mal ** schneller. Wenn 4 Kerne verbraucht waren, war das Ergebnis von mpstat 100% aller Kerne.
Ich bin zufrieden, weil ich 4 Kerne verbraucht habe. Es stellte sich auch heraus, dass auch nur ein Kern schnell genug ist. Es gibt einen Bericht, dass der Desktop-Bildschirm und der Chrome-Browser 2,2- bis 2,6-mal schneller gestartet werden oss & P = 2) Da die Geschwindigkeitsverbesserungsrate nahe ist, hat die Leistungsverbesserung für einen Kern möglicherweise erheblich dazu beigetragen.
Zählen Sie eine gerade Anzahl natürlicher Zahlen von 1 bis N. Die Zählmethode wird bestimmt, indem der Rest eins nach dem anderen durch 2 geteilt wird. Eine natürliche Zahl von 1 bis N wird in k unterteilt, und jeder wird von k Kernen für die verteilte Verarbeitung geteilt. Es ist ein Problem, das auf einen Schlag zu finden ist, wenn Sie N / 2 machen, aber ich entschuldige mich zuerst bei Razpai, dass ich einen langweiligen Job machen durfte.
Diesmal ist N = 10 Millionen.
pptest.py
# coding: UTF-8
import pp
#Bestimmen Sie, ob n ein Vielfaches von m ist
def ismultiples(n,m):
return n % m == 0
#von n1 bis n2(Einschließlich n2)Finden Sie heraus, wie viele Vielfache von m zu den natürlichen Zahlen von gehören
def sum_multiples(n1,n2,m):
cnt = 0
for x in range(n1,n2+1):
if ismultiples(x,m):
cnt += 1
return cnt
#IP-Adresse des zu verarbeitenden Raspeltorten
ppservers = ("192.168.1.241","192.168.1.241","192.168.1.241","192.168.1.241",) #Verwenden Sie 4 Kerne
# ppservers = ("192.168.1.241",) #1 Kern verwendet
#Maximalwert der natürlichen Zahl
N = 10000000
#Das Vielfache, das Sie zählen möchten
M = 2
#Anzahl der Knoten
num_node = len(ppservers)
#Registrieren Sie den Verbindungszielknoten und generieren Sie ein Serverobjekt
job_server = pp.Server(0, ppservers)
#Aufgabengenerierung
jobs = []
for i in range(num_node):
#Finden Sie den Bereich der natürlichen Zahlen, die vom i-ten Knoten verarbeitet werden
indSt = N/num_node*i+1
if (i==num_node-1):
indEnd = N
else:
indEnd = indSt+N/num_node-1
#Wirf eine Aufgabe auf einen Knoten
jobs.append(job_server.submit(sum_multiples, (indSt, indEnd, M), (ismultiples,), ("math",)))
print("task%d args:(%d,%d,%d)" % (i,indSt,indEnd,M))
#Sammlungsergebnisse sammeln. sum_mutiples()Bild, um den Rückgabewert von zu erhalten.
#Wenn die Verarbeitung auf dem Knoten noch nicht abgeschlossen ist, wird die Verarbeitung hier blockiert, bis sie abgeschlossen ist..
result = 0;
for i in range(num_node):
result += jobs[i]()
#Ergebnisse anzeigen
print "%Von natürlichen Zahlen kleiner oder gleich d%Anzahl der Vielfachen von d= %d" % (N, M, result)
job_server.print_stats()
In ppservers werden vier gleiche IP-Adressen beschrieben. Auf diese Weise können Sie die in 4 Teile unterteilte Aufgabe in dieselbe Raspeltorte werfen und die 4 Kerne vollständig nutzen. Wenn nur ein Kern verwendet wird, beschreiben Sie nur einen. Wenn Sie die Verarbeitung mit mehreren Rasppies verteilen möchten, können Sie hier die IP-Adresse jedes Raspeye festlegen.
> python setup.py
> ppserver.py &
> python pptest.py
Ausführungsumgebung | Verarbeitungszeit[sec] | Geschwindigkeitsverbesserungsrate * 1 |
---|---|---|
Altes Modell(Raspberry Pi B+) | 48.7 | - |
Neues Modell(Raspberry Pi 2 B)1 Kern verwendet | 20.1 | 2.4 |
Neues Modell(Raspberry Pi 2 B)Verwenden Sie 4 Kerne | 5.7 | 8.5 |
Die Ausgabe des Skripts ist wie folgt
task0 args:(1,10000000,2) Eine Zahl, die ein Vielfaches von 2 von natürlichen Zahlen ist, die kleiner als 10000000 = 5000000 sind Job execution statistics: job count | % of all jobs | job time sum | time per job | job server 1 | 100.00 | 48.4202 | 48.420249 | 192.168.1.241:60000 Time elapsed since server creation 48.7006518841 0 active tasks, 0 cores
task0 args:(1,10000000,2) Eine Zahl, die ein Vielfaches von 2 von natürlichen Zahlen ist, die kleiner als 10000000 = 5000000 sind Job execution statistics: job count | % of all jobs | job time sum | time per job | job server 1 | 100.00 | 19.6110 | 19.610974 | 192.168.1.241:60000 Time elapsed since server creation 20.0955970287 0 active tasks, 0 cores
task0 args:(1,2500000,2) task1 args:(2500001,5000000,2) task2 args:(5000001,7500000,2) task3 args:(7500001,10000000,2) Eine Zahl, die ein Vielfaches von 2 von natürlichen Zahlen ist, die kleiner als 10000000 = 5000000 sind Job execution statistics: job count | % of all jobs | job time sum | time per job | job server 4 | 100.00 | 20.6152 | 5.153800 | 192.168.1.241:60000 Time elapsed since server creation 5.68198180199 0 active tasks, 0 cores
sudo apt-get install sysstat
Gehen Sie wie folgt vor, wenn Sie 10 Mal im Abstand von 1 Sekunde messen
mpstat -P ALL 1 10
Ich habe versucht, das obige Skript auszuführen, während mpstat in einem anderen Terminal ausgeführt wurde.
Da es nur einen Kern gibt, ist die CPU-Nummer nur 0. % usr ist 100.
22:30:56 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 22:30:57 all 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:30:57 0 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Da es 4 Kerne gibt, sind die CPU-Nummern 0 bis 3. Nur CPU3 ist 100% und die anderen sind 0%. Alles ist 1/4, was 25,0% entspricht.
22:35:54 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 22:35:55 all 25.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 75.00 22:35:55 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 22:35:55 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 22:35:55 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 22:35:55 3 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Alle 4 Kerne sind 100%. Zufrieden.
22:22:11 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 22:22:12 all 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:22:12 0 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:22:12 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:22:12 2 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:22:12 3 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00