2013-09-16 1 views
4

Existe-t-il un exemple de code illustrant les performances Hyperthreading d'Intel? Est-il accessible du tout à partir de l'espace utilisateur, ou ce processeur fait-il tout le travail transparent pour le programmeur? C'est pour C, Linux.Exemple de code hyperthreading

Répondre

4

La performance de l'hyperthreading dépend de nombreux facteurs et est difficile à estimer.

Juste pour expliquer brièvement Hyperthreading:

  • Chaque noyau a plus d'un jeu de registres, mais pas d'unités d'exécution supplémentaires
  • Les hyperthreads sont programmés plus ou moins uniformément

Donc, vous ne Vraiment obtenir des performances supplémentaires de hyperthreads si les deux threads s'exécutant sur le même noyau utilisent des unités d'exécution différentes et chaque thread sur son propre aurait trop de dépendances adata. Par exemple, un thread ne fait que des opérations entières, l'autre un seul virgule flottante. Vous pouvez ensuite voir des performances supplémentaires car vous utilisez plus d'unités d'exécution par cycle. Mais cela dépend à son tour de la façon dont votre système d'exploitation planifie les threads sur les hyperthreads. Du point de vue de l'OS, chaque hyperthread est un CPU logique. Donc, c'est entièrement à l'ordonnanceur que mettre là et quand. En pratique, les hyperthreads vous procurent au maximum 10-20% de performance en plus. Sur notre HPC, nous les avons désactivés (principalement pour des raisons de licence).

Pour répondre à votre question actuelle: vous ne pouvez pas déployer de code directement sur des hyperthreads. L'OS fera cela pour vous. Vous pouvez définir des affinités de planification pour vos threads d'utilisateur, mais il appartient toujours au planificateur de déployer réellement vos threads. Ceci est fait de manière transparente pour le programmeur. Un bon ordonnanceur déploiera votre code uniformément d'abord sur les cœurs et ne recourra aux hyperthreads que si tous les cœurs sont occupés.

Le coltrol utilisateur syscalls que vous recherchez est sched_setaffinity et pthread_setaffinity_np.

L'exemple de code suivant va déployer deux threads sur les CPU logiques 0 et 1 qui correspondront aux deux hyperthreads sur le premier noyau logique de la première socket si hyperthreads sont activés. Pourtant, il appartient au planificateur de les mettre réellement là. Si ces hyperthreads sont occupés alors votre code va dormir:

#define _GNU_SOURCE 
#include <pthread.h> 
#include <sched.h> 
#include <stdlib.h> 

void * my_thread(intptr_t cput_o_run_on) { 
    cpuset_t cpuset; 
    CPU_ZERO(&cpuset); 
    CPU_SET(cput_o_run_on, &cpuset); 

    pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset); 

    // force a rescheduling 
    sched_yield(); 

    // do something useful 

    return NULL; 
} 

int main() { 
    pthread_t thread; 

    pthread_create(&thread, NULL, my_thread, 0); 
    pthread_create(&thread, NULL, my_thread, 1); 

    for (;;); 

    return 0; 
}