2010-08-09 21 views
3

J'ai une application série (non parallèle) écrite en C. Je l'ai modifiée et réécrite à l'aide d'Intel Threading Building Blocks. Quand j'exécute cette version parallèle sur une machine AMD Phenom II qui est une machine à quatre cœurs, j'obtiens un gain de performance de plus de 4X qui est en conflit avec la loi d'Amdahl. Quelqu'un peut-il me donner une raison pour laquelle cela se passe?Problème de gain de performance dans une application multicœur

Merci, Rakesh.

+1

Votre application est-elle normalement liée à l'UC ou liée à l'E/S? S'il est lié à l'E/S, il peut être capable d'échanger des processus en attente d'E/S pour d'autres, ce qui permet d'économiser plus de temps que la normale. – Amber

Répondre

4

Si vous réécrivez le programme, vous pouvez le rendre plus efficace. La loi d'Amdahl ne limite que la quantité d'accélération due au parallélisme, et non pas à quel point vous pouvez accélérer votre code en l'améliorant.

Vous pourriez réaliser les effets d'avoir 4x le cache, puisque maintenant vous pouvez utiliser les quatre procs. Ou peut-être avoir moins de conflits avec d'autres processus en cours d'exécution sur votre machine. Ou vous avez accidentellement corrigé une branche mal préparée.

TL/DR: ça arrive.

1

Quelqu'un peut-il me donner une raison pour laquelle cela se produit?

En un mot, met en cache. Chaque cœur a son propre cache L1 et, par conséquent, en utilisant simplement plus de cœurs, vous avez augmenté la quantité de cache en jeu, ce qui a ramené plus de vos données à l'endroit où elles seront traitées. Cela seul peut améliorer les performances de manière significative (comme si vous aviez un plus grand cache sur un seul noyau). Lorsqu'elle est associée à une accélération quasi linéaire de la parallélisation effective, vous pouvez voir des améliorations de performance superlinéaires dans l'ensemble.

2

Cette opération est connue sous le nom de «super-accélération linéaire» et peut se produire pour diverses raisons, bien que la cause la plus fréquente soit probablement le comportement du cache. Habituellement, lorsque l'accélération superlinear se produit, c'est un indice que vous pourriez rendre la version séquentielle plus efficace. Par exemple, supposons que vous ayez un processeur où certains cœurs partagent un cache L2 (une architecture courante de nos jours), et supposons que votre algorithme effectue plusieurs parcours d'une grande structure de données. Si vous effectuez les traversées en séquence, alors chaque traversée devra remettre les données dans le cache L2, alors que si vous effectuez les traversées en parallèle, vous pouvez éviter un grand nombre de traversées, tant que les traversées se déroulent dans étape (se désynchroniser est une bonne source de performance imprévisible ici). Pour rendre la vérification séquentielle plus efficace, vous pouvez entrelacer les traversées, améliorant ainsi la localité.