2015-07-23 1 views
0

J'exécute mon programme 5000000 fois en parallèle en utilisant "Parallel.For" de F #. La durée moyenne d'exécution par tâche est indiquée ci-dessous.comment le temps d'exécution chute brusquement (plus que prévu) que le nombre de processeurs augmente?

Nombre de conducteurs actifs: Temps d'exécution (microsecondes)

2: 866

4: 424

8: 210

12: 140

16: 106

24: 76

32: 60

Si le fait,

en doublant le nombre de cœurs, maximum que nous speedup pouvons obtenir, doit être inférieure à de 2 (idéalement, il peut être 2).

quelle peut être la raison de cette accélération rapide.

+0

Les ratios sont très proches du mieux possible, et je voudrais rejeter toute différence que l'erreur de mesure, –

+0

de 32 à 16 maximum possible peut être la moitié, mais il est inférieur à la moitié. J'ai fait la mesure à plusieurs reprises et les valeurs fournies sont la moyenne de toutes ces mesures. – anushri

+0

60 * 2> 106 ceci est sous-optimal. La meilleure valeur possible est 53 –

Répondre

0
  • 2 * 866 = 1732
  • 4 * 424 = 1696
  • 8 * 210 = 1680
  • 12 * 140 = 1680
  • 16 * 106 = 1696
  • 24 * 76 = 1824
  • 32 * 60 = 1920

Alors que vous augmentez le parallélisme, la performance relative s'améliore puis commence à chuter. L'amélioration est peut-être due à l'amortissement des frais généraux comme la compilation JIT ou dans l'algorithme qui gère la parallélisation. La dégradation à mesure que le degré de parallélisme augmente est souvent due à une sorte de contention de ressources, à une commutation de contexte excessive ou similaire.

+0

mon seul doute est ... quand j'ai doublé le nombre de cœurs, l'amélioration des performances devrait être inférieure à deux fois, car il y aura un peu de frais généraux. le comportement est justifié en cas de plus grand nombre de cœurs mais pour un plus petit nombre de cœurs, il vaut mieux que double, quelle peut en être la raison? – anushri

+0

@anushri La réponse détaillée dépend de la façon dont vous chronométrez la performance. Vous avez dit dans un commentaire que vous utilisiez un chronomètre, mais ce que je voulais dire, c'est de connaître les points précis auxquels vous commencez et d'arrêter le chronomètre. Si vous pouvez modifier la question pour inclure un exemple de code, il peut être possible de voir. Vous pouvez également utiliser un profileur, ce qui peut vous permettre de mesurer directement. – phoog