8 threads logiques à 4 cœurs à un maximum de 4 fois plus vite en parallèle?

Je suis un logiciel d'analyse comparative qui exécute 4x plus rapide sur Intel 2670QM alors ma version de série à l'aide de tous les 8 de ma "logique" threads. J'aimerais que certains commentaires de la communauté sur ma perception de l'analyse comparative résultats.

Quand je suis à l'aide de 4 Fils sur 4 cœurs-je obtenir une vitesse de 4x, l'ensemble de l'algorithme est exécuté en parallèle. Cela semble logique, pour moi, depuis 'Amdhals la loi", prédit-il. Gestionnaire des tâches de Windows me dit que je suis en utilisant 50% de la CPU.

Cependant, si j'exécute le même logiciel sur tous les 8 threads, je reçois, une fois de plus, une vitesse de 4x et pas une vitesse de 8x.

Si j'ai bien compris ce correctement: mon CPU a 4 cœurs avec une Fréquence de 2.2 GHZ individuellement, mais la Fréquence est divisée en 1.1 GHZ lorsqu'il est appliqué à 8 'logique' de threads et de la même façon suivante pour le reste des composants tels que la mémoire cache? Si cela est vrai, alors pourquoi ne le gestionnaire des tâches de prétendre qu'à 50% de mon CPU est utilisé?

#define NumberOfFiles 8
...
char startLetter ='a';
#pragma omp parallel for shared(startLetter)
for(int f=0; f<NumberOfFiles; f++){
    ...
}

Je ne suis pas y compris le temps à l'aide de disk I/O. je suis seulement intéressé dans le temps un STL appel prend STL(tri) de ne pas le disque I/O.

Dans mon expérience, les 4 cœurs signifie que vous pouvez faire 4 choses en même temps en toute impunité. 8 threads signifie simplement que les deux threads sont le partage d'une base (en supposant qu'ils sont uniformément distribués), donc à moins que votre code a un certain parallélisme construit en, vous ne pouvez pas voir toute amélioration de la vitesse au-dessus de threads == cores. Vos résultats dépendra également de la capacité de vos algorithmes de traitement lié ou I/O bound. En bref, il n'est pas aussi simple que vous le pensez.
Sur certains matériels, vous avez plusieurs instances de certaines unités de processeurs par thread, mais pas tous (par exemple, une seule FPU). En fonction du matériel, bien que le "fils" servira peu plus que de faire des changements de contexte entre un plus grand ensemble de processus exécutables beaucoup moins cher (vous n'avez pas à copier tout sur l'état de chaque interrupteur).

OriginalL'auteur Cisum inas | 2012-05-01