C'est une question très intéressante, alors laissez-moi vous présenter le contexte. Je travaille au Musée national de l'informatique, et nous venons de réussir à faire fonctionner un super ordinateur Cray Y-MP EL datant de 1992, et nous voulons vraiment voir à quelle vitesse il peut aller !
Nous avons décidé que la meilleure façon de procéder était d'écrire un simple programme en C qui calculerait les nombres premiers et montrerait le temps nécessaire pour le faire, puis d'exécuter le programme sur un PC de bureau moderne et rapide et de comparer les résultats.
Nous avons rapidement trouvé ce code pour compter les nombres premiers :
#include <stdio.h>
#include <time.h>
void main() {
clock_t start, end;
double runTime;
start = clock();
int i, num = 1, primes = 0;
while (num <= 1000) {
i = 2;
while (i <= num) {
if(num % i == 0)
break;
i++;
}
if (i == num)
primes++;
system("clear");
printf("%d prime numbers calculated\n",primes);
num++;
}
end = clock();
runTime = (end - start) / (double) CLOCKS_PER_SEC;
printf("This machine calculated all %d prime numbers under 1000 in %g seconds\n", primes, runTime);
}
Ce qui, sur notre ordinateur portable double cœur fonctionnant sous Ubuntu (le Cray fonctionne sous UNICOS), a fonctionné parfaitement, avec une utilisation à 100 % de l'unité centrale et en une dizaine de minutes. En rentrant chez moi, j'ai décidé de l'essayer sur mon PC de jeu moderne à six cœurs, et c'est là que nous rencontrons nos premiers problèmes.
J'ai d'abord adapté le code pour qu'il fonctionne sous Windows, puisque c'est ce qu'utilisait le PC de jeu, mais j'ai été attristé de constater que le processus n'utilisait qu'environ 15 % de la puissance du CPU. Je me suis dit que Windows devait être Windows, alors j'ai démarré sur un Live CD d'Ubuntu en pensant qu'Ubuntu permettrait au processus de fonctionner avec tout son potentiel comme il l'avait fait plus tôt sur mon ordinateur portable.
Cependant, je n'ai obtenu que 5% d'utilisation ! Ma question est donc la suivante : comment puis-je adapter le programme pour qu'il fonctionne sur ma machine de jeu sous Windows 7 ou sous Linux en direct avec une utilisation de 100 % du processeur ? Une autre chose qui serait formidable, mais pas nécessaire, est que le produit final puisse être un .exe qui pourrait être facilement distribué et exécuté sur les machines Windows.
Merci beaucoup !
P.S. Bien sûr, ce programme ne fonctionnait pas vraiment avec les processeurs spécialisés Crays 8, et c'est un tout autre problème... Si vous savez comment optimiser un code pour qu'il fonctionne sur les super ordinateurs Cray des années 90, faites-nous signe !
1 votes
Avez-vous essayé le multithreading ?
0 votes
Votre PC de jeu était-il multi-core ?
8 votes
Je ne peux pas croire qu'il n'y a pas de unicos tag. ;)
32 votes
Il est étrange que ce programme à un seul fil prenne 100% de l'utilisation du CPU sur un processeur DUAL CORE ;))).
0 votes
Mon ordinateur portable est Dual Core, mon PC est Hex Core. @mikithskegg bien en haut ce processus était à 100%, je suppose que ce n'est pas correct alors ?
0 votes
Êtes-vous sûr que votre ordinateur portable est réellement à double cœur et n'utilise pas quelque chose comme la technologie hyperthread ?
0 votes
Dans Windows, ouvrez le gestionnaire des tâches, allez dans les processus, faites un clic droit sur le processus et définissez sa priorité sur le temps réel. Cela augmente-t-il l'utilisation du processeur ?
0 votes
Comment as-tu pu mesurer l'utilisation du CPU ? Ce truc ne fait qu'imprimer.
This machine calculated all 168 prime numbers under 1000 in 0.002 seconds
sur mon vieil ordinateur portable1 votes
void main()
devrait êtreint main(void)
. Le compilateur C de Cray ne supporte pas C99 ; je suis surpris qu'il accepte les déclarations et les instructions mixtes. Vous devez#include <stdlib.h>
de faire la déclaration desystem()
visible -- ou vous pouvez simplement supprimer lesystem("clear")
ce qui semble inutile. (Impression'\r'
doit aller au début de la ligne actuelle). Les crayons sont optimisés pour les performances en virgule flottante ; quelque chose qui fait des calculs en nombres entiers n'exerce pas vraiment ses forces.0 votes
Si vous voulez un benchmark monofilaire, considérez quelque chose comme (Whetstone)[ [fr.wikipedia.org/wiki/Whetstone_(repère)]](http://en.wikipedia.org/wiki/Whetstone_(benchmark)]) .
24 votes
Suis-je le seul à ne pas trouver cette question intéressante du tout ? Allez, faire tourner un programme à un seul thread sur une machine à n cœurs et demander pourquoi il utilise 1/n du cpu, c'est juste... laisse tomber, je viens de downvoter :-)
17 votes
@drhirsch Eh bien, la question montre un effort de recherche. J'ai ajouté un +1 pour cela - même si l'OP passe à côté de quelque chose de fondamental sur le calcul multi-core.
0 votes
Hors de portée : vous devriez vérifier seulement i <= sqrt(num)
10 votes
@drhirsch Il y a beaucoup de questions inintéressantes sur le site. Cependant, le fait d'être intéressant ou non est subjectif. Il se peut qu'il manque les fondamentaux et ça, ce n'est pas subjectif. Comme Mystique l'a dit, cela montre un effort de recherche et ce n'est pas aussi facile de répondre qu'il n'y paraît.
1 votes
L'évaluation d'une machine à plusieurs cœurs à l'aide d'un seul fil n'est pas la seule chose qui rend l'approche quelque peu absurde, mais aussi l'utilisation d'un problème qui est embarrassant et mal adapté à l'architecture. Les ordinateurs Cray ont tiré une grande partie de leur puissance de calcul de plusieurs (3 ou 4 si je me souviens bien) processeurs vectoriels profondément pipelinés par cœur de CPU. Le code d'évaluation est strictement scalaire. Sur un problème bien adapté (et bien parallélisé), les performances du Cray seraient probablement de 50 à 100 fois supérieures.
1 votes
Trouver tous les nombres premiers jusqu'à 1 000 ne devrait même pas prendre un temps mesurable. Ce qui affiche "x% CPU" ne le remarque probablement pas. Et puis il y a une différence entre la façon dont Windows et MacOS X affichent l'utilisation du CPU : Windows affiche 100% si todo Les processeurs sont entièrement utilisés. MacOS X affiche 100% si un Le processeur est pleinement utilisé, de sorte qu'un seul thread peut facilement afficher 100%, et sur un quadri-cœur avec multithreading, l'affichage sera proche de 800%. C'est juste un affichage différent.
0 votes
@Damon Bon point. Si je me souviens bien, le Cray s'appuyait davantage sur le pipelining, tandis que les machines Cyber concurrentes s'appuyaient davantage sur la parallélisation. Le fait d'avoir un test à chaque fois dans la boucle causera probablement des blocages de pipeline et fera fonctionner le Cray de manière sous-optimale, à moins que vous n'optimisiez spécifiquement pour la prédiction de branchement du Cray.