2015-12-01 5 views
0

J'ai un programme C (graphiques benchamrk) qui fonctionne sur un simulateur de processeur MIPS (je cherche à représenter graphiquement certaines caractéristiques de performance). Le processeur a 8 cœurs mais il semble que le noyau 0 exécute plus que sa juste part d'instructions. Le benchmark est multithread avec le travail distribué exactement entre les threads. Pourquoi est-il possible que le noyau 0 se déroule entre 1/4 et la moitié des instructions, même s'il est multithread sur un processeur 8 core?Pourquoi un core exécute-t-il plus que sa part d'instructions?

Pour quelles raisons cela pourrait-il se produire?

+0

Les priorités de thread sont-elles les mêmes? Les tranches de temps du fil sont-elles les mêmes? Les threads bloquent/dorment-ils? –

+3

Une raison possible est que l'instruction "work [is] exactement répartie entre les threads" est fausse. Sérieusement, il n'y a aucun détail dans cette question. –

+0

Etes-vous sûr de prendre en compte la partie série du programme, avant la création des unités d'exécution? – yaman

Répondre

2

La plupart des charges de travail d'application impliquent un certain nombre d'appels système, qui peuvent bloquer (par exemple pour les E/S). Il est probable que vos threads passent un certain temps bloqués, et le planificateur les exécute simplement sur le premier noyau disponible. Dans un cas extrême, si vous avez N threads mais que chacun est capable de travailler seulement 1/N du temps, un seul core est suffisant pour gérer toute la charge de travail.

Vous pouvez utiliser pthread_setaffinity_np pour affecter chaque thread à un cœur spécifique, puis voir ce qui se passe.

+0

Je pense que vous voulez dire bloqué (N-1)/N de l'époque :) –

+0

@JordanMelo: reformulé, merci. –

0

Vous n'avez pas mentionné le système d'exploitation que vous utilisez. Toutefois, la plupart du code de la plupart des systèmes d'exploitation est toujours écrit pour un seul processeur central. Par conséquent, le système d'exploitation n'essaiera pas de répartir équitablement les processus sur la matrice de c? Urs.

Lorsqu'il y a plusieurs noyaux disponibles, la plupart des systèmes d'exploitation lancer un processus sur le premier noyau qui est disponible (et un processus bloqué quitte le noyau connexe disponible.)

A titre d'exemple, sur mon système (4 core amd-64) en cours d'exécution ubuntu linux 14.04, les processeurs sont généralement moins de 1 pour cent occupé, donc tout pourrait fonctionner sur un seul noyau.

Il doit y avoir beaucoup d'applications fonctionnant comme des vidéos et des applications de fond en cours d'exécution, avec plusieurs fenêtres ouvertes pour montrer beaucoup d'activité réelle sur autre que le premier noyau.