Multitraitement.Piscine fait Numpy multiplication de matrice plus lent

Donc, je joue avec multiprocessing.Pool et Numpy, mais il semble que j'ai manqué quelque point. Pourquoi le pool version beaucoup plus lent? J'ai regardé htop et je peux voir à plusieurs procédés d'être créé, mais ils partagent tous un des Processeurs d'ajouter jusqu'à ~100%.

$ cat test_multi.py 
import numpy as np
from timeit import timeit
from multiprocessing import Pool


def mmul(matrix):
    for i in range(100):
        matrix = matrix * matrix
    return matrix

if __name__ == '__main__':
    matrices = []
    for i in range(4):
        matrices.append(np.random.random_integers(100, size=(1000, 1000)))

    pool = Pool(8)
    print timeit(lambda: map(mmul, matrices), number=20)
    print timeit(lambda: pool.map(mmul, matrices), number=20)

$ python test_multi.py 
16.0265390873
19.097837925

[mise à jour]

  • changé à timeit pour l'analyse comparative des processus de
  • init de la Piscine avec un certain nombre de mes cœurs
  • changé de calcul de sorte qu'il n'y a plus de calcul et de moins de transfert de mémoire (je l'espère)

Toujours pas de changement. pool version est encore plus lent et je peux voir dans htop qu'un seul core est utilisé également plusieurs processus sont générés.

[update2]

En ce moment je lis à propos de @Jan-Philip Gehrcke la suggestion d'utiliser multiprocessing.Process() et Queue. Mais en attendant, je voudrais savoir:

  1. Pourquoi mon exemple, le travail pour tiago? Ce qui pourrait être la raison pour laquelle il ne fonctionne pas sur ma machineUn?
  2. Est dans mon exemple de code toute copie entre les processus? J'ai prévu mon code afin de donner à chaque thread une matrice de la matrice, liste.
  3. Est mon code est un mauvais exemple, parce que je utiliser Numpy?

J'ai appris que, souvent, l'on obtient une meilleure réponse, quand les autres savent mon objectif final est donc: j'ai beaucoup de fichiers, qui sont atm chargés et traités dans une série de la mode. Le traitement du CPU est intense, donc je suppose que beaucoup pourrait être acquise par la parallélisation. Mon but est d'appeler la fonction python qui analyse un fichier en parallèle. De plus, cette fonction est juste une interface pour le code en C, je suppose, cela fait une différence.

Un Ubuntu 12.04, Python 2.7.3, i7 860 @ 2.80 - s'il vous Plaît laissez un commentaire si vous avez besoin de plus d'infos.

[update3]

Voici les résultats de Stefano exemple de code. Pour une raison quelconque il n'y a pas de vitesse. :/

testing with 16 matrices
base  4.27
   1  5.07
   2  4.76
   4  4.71
   8  4.78
  16  4.79
testing with 32 matrices
base  8.82
   1 10.39
   2 10.58
   4 10.73
   8  9.46
  16  9.54
testing with 64 matrices
base 17.38
   1 19.34
   2 19.62
   4 19.59
   8 19.39
  16 19.34

[jour 4] réponse à Jan-Philip Gehrcke commentaire

Désolé que je n'ai pas fait moi-même plus clair. Comme je l'ai écrit dans la mise à Jour 2 mon principal but est de paralléliser plusieurs série d'appels d'un 3ème partie Python fonction de la bibliothèque. Cette fonction est une interface pour du code C. J'ai été recommandé d'utiliser Pool, mais cela n'a pas fonctionné, j'ai donc essayé quelque chose de simple, le montre l'exemple ci-dessus avec numpy. Mais là aussi, je ne pouvais pas obtenir une amélioration de la performance, même s'il semble pour moi", emberassing parallélisables`. Donc je suppose que je dois avoir manqué quelque chose d'important. Cette information est ce que je suis à la recherche de cette question et la générosité.

[jour 5]

Merci à tous pour votre formidable d'entrée. Mais à lire vos réponses ne crée plus de questions pour moi. Pour cette raison, je vais la lire sur le notions de base et en créer de nouveaux AFIN de questions quand j'ai une compréhension plus claire de ce que je ne sais pas.

Je suppose que les frais généraux de la création de processus de vous tuer ici. Essayez d'utiliser le timeit module ou au moins déplacer le pool = Pool() fonction de la chronologie de la routine.
J'ai peut-être tort, mais je soupçonne la plupart du temps est consacré à l'envoi de la matrices d'avant en arrière entre vos processus.
Mais on ne devrait pas tous les processus/threads de travail sur leur propre de la matrice? Comme chaque processus en prenant une matrice à partir de la liste de travail et avec qui?
Mais vous devez passer entre les différents processus (c'est à dire la copie de la mémoire). La multiplication de matrice est plutôt rapide (il faut environ 6 ms selon vos timings) de telle sorte que cette surcharge est importante.
J'ai changé l'exemple, afin qu'il n'y a plus de calcul et de moins de transfert de mémoire.

OriginalL'auteur Framester | 2013-03-14