2010-06-16 6 views
5

Je ne sais pas si cela appartient à Stackoverflow ou Superuser mais j'ai pensé que je demanderais ici.Comment utiliser tous les cœurs dans Windows 7?

J'ai une application basée sur la console écrite en C qui prend actuellement environ une heure pour se terminer dans Windows 7 64-bit OS. Le gestionnaire de tâches signale que l'application utilise seulement 25% du processeur disponible. Je voudrais réduire le temps d'exécution en augmentant l'utilisation du processeur.

Est-il possible de laisser l'application utiliser les quatre cœurs (l'ordinateur portable a Core i5) au lieu d'un seul? Je suppose que le gestionnaire de tâches rapporte 25% parce qu'un seul noyau est alloué au programme.

Répondre

15

Sans réécrire l'application à multi = thread non, vous ne pouvez pas modifier le comportement de l'application. La seule chose que vous pouvez faire, c'est si l'application peut traiter des plages de données d'entrée, alors vous pouvez lancer 4 instances de l'application avec différentes plages de données d'entrée à traiter et combiner les résultats après qu'ils sont tous faits.

Imaginez le rendu d'une animation 3D et le moteur de rendu est un seul thread, mais vous pouvez spécifier démarrer et cadres d'extrémité. Vous avez 100 images pour vous rendre commencer 4 instances, et spécifier début et la fin des gammes de cadres 0 - 25, 26 - 50, 51 - 75, 76 - 100. Ensuite, vous devez combiner toutes les sorties à votre final fichier vidéo. D'un point de vue pédagogique, votre application utilise déjà tous les cœurs.

+3

+1 parce que cela va certainement fonctionner dans certains cas. Un cas classique fonctionne sur des données séquentielles dans un gros fichier de données. Diviser le fichier en 4 fichiers plus petits, exécutez le programme 4 fois, et vous avez terminé en 15 minutes au lieu d'une heure. –

+0

Oui! Intelligent! J'oublie toujours ça. –

4

Vous pouvez utiliser OpenMP ou POSIX thread, je recommande OpenMP car il a une structure assez basique qui selon votre programme pourrait rendre l'implémentation rapide et facile.

+0

Cela nécessite cependant une réécriture. :) – BobbyShaftoe

7

Les applications doivent être écrites de manière multithread afin d'utiliser plusieurs cœurs. Il est impossible de faire en sorte qu'une application à un seul thread utilise plusieurs cœurs.

+1

ne jamais dire jamais, fractionnement de l'entrée est presque toujours une possibilité –

3

À ce stade, il n'existe aucun outil standard pour convertir un programme C arbitraire en programme multithread. Par conséquent, si en tant que développeur, vous n'écrivez pas explicitement du code multithread, ne vous attendez pas à ce que votre programme utilise plus d'un noyau à la fois, sauf si vous appelez une fonction de bibliothèque tierce écrite à l'aide de threads. Le plus que vous pourriez faire (si c'est pertinent dans votre cas) pour mieux utiliser votre CPU est de découper votre entrée en N morceaux, et d'exécuter le programme plusieurs fois sur chaque morceau, puis faire quelque chose pour combiner les entrées une fois qu'elles sont terminé.

2

Comme vous l'avez dit plus haut, il n'y a pas de noyau spécifique affecté au processus (sauf si vous faites un effort explicite pour lier votre processus à un noyau spécifique).

Le processus utilise tous les cœurs, mais il les utilise séquentiellement: il fonctionne un peu sur un noyau, puis il fonctionne un peu plus sur un autre noyau et ainsi de suite. C'est à dire. En moyenne, le temps CPU consommé par votre application est réparti uniformément entre tous les cœurs du système. Comme un seul cœur est utilisé à un moment donné, la charge du processeur ne franchira jamais la limite de 25% (votre système, apparemment, a 4 cœurs).

Si vous voulez franchir la limite de 25%, vous devez être en mesure d'utiliser deux ou plusieurs noyaux simultanément, ce qui signifie qu'au moins une partie du code doit exécuter en parallèle. Pour ce faire, l'application doit être écrite spécifiquement pour fonctionner en parallèle.Une application ordinaire à un seul thread ne le fera jamais tout seul.

+1

Ce n'est pas complètement vrai. Ce compilateur/machine virtuelle (http://sourceforge.net/apps/mediawiki/ildjit/index.php?title=Main_Page) est capable de paralléliser le code CLI (single threaded) (mais aussi d'autres langages). Et le système d'exploitation essaie de conserver la même application sur le même noyau pour éviter le vidage de la mémoire cache. – Luca

+2

Windows 7 essaie vraiment de garder un processus affine à la CPU, il fonctionne aussi longtemps que possible, le planificateur est complètement différent du comportement dégénéré qui était affiché dans XP et avant que NT –

+0

Ouais, mais honnêtement c'est un beaucoup de mots et n'ajoute pas beaucoup pour répondre à la question. :) – BobbyShaftoe

Questions connexes