Le Raspberry Pi 2 nouvellement publié dispose d'un processeur à 4 cœurs. C'est une bonne idée, donc j'aimerais faire un traitement distribué et utiliser jusqu'à 4 cœurs au maximum.
J'ai exécuté un programme de traitement distribué simple en utilisant le cadre de traitement distribué Parallel Python et j'ai comparé les vitesses de traitement de l'ancien modèle et du nouveau modèle. Nous avons également vérifié le taux d'utilisation de chaque cœur avec mpstat.
Par rapport à l'ancien modèle, lorsque 4 cœurs sont épuisés, il est ** environ 8,5 fois **, et même avec 1 seul cœur, il est ** environ 2,4 fois ** plus rapide. Lorsque 4 cœurs étaient épuisés, le résultat de mpstat était de 100% de tous les cœurs.
Je suis satisfait car j'ai épuisé 4 cœurs. En outre, il s'est avéré que même un noyau est assez rapide. [Selon un rapport, l'écran du bureau et le navigateur Chrome démarrent 2,2 à 2,6 fois plus rapidement](http://itpro.nikkeibp.co.jp/atcl/column/14/565123/020600005/?ST= oss & P = 2) Puisque le taux d'amélioration de la vitesse est proche, l'amélioration des performances d'un cœur peut avoir contribué de manière significative.
Comptez un nombre pair d'entiers naturels de 1 à N. La méthode de comptage est déterminée en trouvant le reste divisé par 2 un par un. Un nombre naturel de 1 à N est divisé en k, et k cœurs sont attribués à chacun pour effectuer un traitement distribué. C'est un problème qui peut être trouvé en une seule fois si vous faites N / 2, mais je m'excuse d'abord auprès de Razpai de m'avoir laissé faire un travail ennuyeux.
Cette fois, N = 10 millions.
pptest.py
# coding: UTF-8
import pp
#Déterminer si n est un multiple de m
def ismultiples(n,m):
return n % m == 0
#de n1 à n2(Y compris n2)Découvrez combien de multiples de m se trouvent parmi les nombres naturels de
def sum_multiples(n1,n2,m):
cnt = 0
for x in range(n1,n2+1):
if ismultiples(x,m):
cnt += 1
return cnt
#Adresse IP de la tarte à la râpe à traiter
ppservers = ("192.168.1.241","192.168.1.241","192.168.1.241","192.168.1.241",) #Utilisez 4 cœurs
# ppservers = ("192.168.1.241",) #1 noyau utilisé
#Valeur maximale du nombre naturel
N = 10000000
#Le multiple que vous voulez compter
M = 2
#Nombre de nœuds
num_node = len(ppservers)
#Enregistrer le nœud de destination de la connexion et générer un objet serveur
job_server = pp.Server(0, ppservers)
#Génération de tâches
jobs = []
for i in range(num_node):
#Trouver la plage de nombres naturels manipulés par le i-ème nœud
indSt = N/num_node*i+1
if (i==num_node-1):
indEnd = N
else:
indEnd = indSt+N/num_node-1
#Lancer une tâche sur un nœud
jobs.append(job_server.submit(sum_multiples, (indSt, indEnd, M), (ismultiples,), ("math",)))
print("task%d args:(%d,%d,%d)" % (i,indSt,indEnd,M))
#Recueillir les résultats de l'exécution. sum_mutiples()Image pour obtenir la valeur de retour de.
#Si le traitement sur le nœud n'est pas encore terminé, le traitement ici sera bloqué jusqu'à ce qu'il soit terminé..
result = 0;
for i in range(num_node):
result += jobs[i]()
#Voir les résultats
print "%D'entiers naturels inférieurs ou égaux à d%Nombre de multiples de d= %d" % (N, M, result)
job_server.print_stats()
Quatre mêmes adresses IP sont décrites dans ppservers. En faisant cela, la tâche divisée en 4 sera jetée à la même tarte à la râpe, et 4 noyaux pourront être pleinement utilisés. Si un seul noyau est utilisé, décrivez-en un seul. Si vous souhaitez distribuer le traitement avec plusieurs Rasppies, vous pouvez définir l'adresse IP de chaque Raspeye ici.
> python setup.py
> ppserver.py &
> python pptest.py
Environnement d'exécution | temps de traitement[sec] | Taux d'amélioration de la vitesse * 1 |
---|---|---|
Ancien modèle(Raspberry Pi B+) | 48.7 | - |
Nouveau modèle(Raspberry Pi 2 B)1 noyau utilisé | 20.1 | 2.4 |
Nouveau modèle(Raspberry Pi 2 B)Utilisez 4 cœurs | 5.7 | 8.5 |
La sortie du script est la suivante
task0 args:(1,10000000,2) Un nombre qui est un multiple de 2 parmi les nombres naturels inférieurs à 10000000 = 5000000 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) Un nombre qui est un multiple de 2 parmi les nombres naturels inférieurs à 10000000 = 5000000 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) Un nombre qui est un multiple de 2 parmi les nombres naturels inférieurs à 10000000 = 5000000 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
Lorsque vous mesurez 10 fois à intervalles de 1 seconde, procédez comme suit
mpstat -P ALL 1 10
J'ai essayé d'exécuter le script ci-dessus tout en exécutant mpstat dans un autre terminal.
Puisqu'il n'y a qu'un seul cœur, le numéro de CPU n'est que de 0. % usr vaut 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
Puisqu'il y a 4 cœurs, les numéros de CPU vont de 0 à 3. Seul CPU3 est à 100% et les autres à 0%. Tout est 1/4, soit 25,0%.
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
Les 4 cœurs sont à 100%. Satisfait.
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