Aller au contenu

PCI Mark


sky99

Messages recommandés

Bonjour. Je réouvre un topic sur le bench CPU Inpact, parcequ'on ne comprend rien au precedent, c'etait un dialoque entre Cmoi_voila et Néo_13 a propos des fichiers

qu'ils se sont échangés :D

Donc vous l'aurez compris, le but est de réaliser un Bench CPU.

Problematiques

Quel langage?

-Il est notoire que Java est extremement portable, puisque conçu pour ça.

Néanmoins, un langage interprété, ça ne me parait pas le top :chinois:

-L'assembleur c'est sympatique, mais personne ou presque ne comprendra

si on l'utilise les sources...

-Le C++ est sympatique, mais avons nous besoin de classes pour un bench?

de plus, vu que les normes ne sont pas respectées par les compilos, il serait

dur d'obtenir quelquechose d'homogene selon les platformes...

-Le C me semble donc tout naturelement s'imposer: tres bien connu du plus grand nombre, il possede un tres bon compilo disponible sur toutes les platformes (GCC);

n'est pas trop difficile a saisir, et a de tres bonnes perfs...

SI vous avez une autre idée, exposez la, le but de ce topic est de reflechir au sujet...

Quel algorithme peut on utiliser pour bencher un CPU?

etant donné la rapididité et la puissance des cpus actuels, je pense que la seule solution pour les occuper, c'est bel est bien une bonne grosse boucle, avec une

jolie fonction qui lait travailler le cpu en continu pendant un nombre d'iterations défini; apres, on revoie 1/T ou T est le temps mis pour faire la totalité des calculs;

ce qui donnerait un score d'autant plus grand que le temps est faible...

Optimisations ou pas?

Si on rajoute les optimisations CPU, on obtient un code qui n'est pas uniforme

selon la platforme. Donc des resultats pas forcement comparables.

D'un autre coté, un code optimisé, meme si le code n'est pas identique, permet

de voir ce que peut donner un CPU avec du code optimisé pour lui...

On peut donc envisager plusieur niveaux d'optimisation:

1-pas d'optimisations, test brut , c'est le cpu qui se debrouille pour travailler au plus vite.

2-Optimisations standard: test optimisé avec les optis les plus frequement utilisées, qui sont disponible et utilisées a peu pres partout; ce qui donnerait

un resultat indiquant ce que peut donner le cpu dans un environement "standard"

avec des programmes ordinaires;

3-Optimisations maximales: pour chaque platforme, on fait toutes les optmimisations possibles, et de cette maniere le test indiquerait ce qu'on peut esperer pour chaque platforme si on optimise le code...

On peut egalement envisager un test snon optimisé, et ensuite un test optimisé pour chaque jeu d'instruction (genre TEST X86 basique, TestMMX, Test SSE, SSE2, 3Dnow, etc ...)

Que tester?

En general, les benchs classiques testent la FPU et les ALU du cpu separément.

Donc il faudrait un algo pour les entiers, un autre pour les flottants, et parcequ'on a jamaisuniquement l'un ou l'autre, on peut envisager soit une fusion des eux algos soit un troiseme qui fasse appel aux ALUs et a la FPU en meme temps...

Quelle licence?

Il me semble que la licence GPL s'impose pour tout projet communautaire...

le code appartient a tout le monde, et toute modif de celui ci doit etre disponible pour tout le monde...

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 137
  • Créé
  • Dernière réponse

Ressources/ Downloads

la page sourceforge du projet

La page des téléchargements

PCI_Mark : page provisioire du projet

Executables:

PCI Bench module CPU sans Optimisations

PCI Bench module CPU avec Optimisations

Code source de la version actuelle (0.01) de Neo_13:

#include<math.h>
#include<stdio.h>
#include<time.h>
#define N 100000
#define M 50000000

void calculint()
{
register long int i;
register long int j;

for(i=0;i<N;i++)
for(j=0;j<N;j++);
}

void calculfloat()
{
  register long int i;
  register long int j;
  register long int k;
  double res;
  
      k=1;
      res=0;
  for(i=1;i<M;i++)
  {
      k++;/*printf("%d %d %f\n",k,i,res);*/
      res=res+pow(-1,k)*pow(i,-1);
      i++;
  }
}
      

void affiche(int noteint)
{
  puts("int puis float");
printf("Note obtenue en boucle : %d\n",noteint);
}

main()
{   
  time_t start,finish;
  double duree;
  int noteint=0;
  int notesom=0;
  int notefloat=0;
  
  start=time(0);
calculint();
finish=time(0);
duree=difftime(finish,start);
noteint=(int)duree*100;

start=time(0);
calculfloat();
finish=time(0);
duree=difftime(finish,start);
notefloat=(int)duree*100;

affiche(noteint);
affiche(notefloat);
}

Code source de la version actuelle de TuXXX (0.01)

#include <time.h>
#include <stdio.h>

int main(void)
{
time_t start;
unsigned int i;
unsigned int score;
unsigned int calcul;

start = time(0);
while( time(0)-start < 1 ); //on attend d'arriver à la fin d'une seconde

calcul=1;
for( i=1; time(0) - start < 10; i++ )
{
calcul += 2*((i*((i+i)/(i+i)))/i)-((i*((i+i)/(i+i)))/i)-i+i; //"calcul += 1;" mais avec des calculs
}
score=i;
if(calcul==score)
{printf("score:%i\n",score/10000);}
else
{printf("erreur de calcul!!!\n");}
return 0; 
}

Lien vers le commentaire
Partager sur d’autres sites

Ce ne serait pas une factorielle ? :/

J'ignore totalement comment sont faits les CPU benchmarks, mais je pense qu'effectivement on peut prendre quelqu'algo un tant soit peu gourmand en cycle CPU.

L'ideal serait de trouver des explications (Google powaaaa) sur le mode de fonctionnement des benchs existants.

Un autre probleme si on change de plateforme : le code genere ne sera pas le meme (a verifier si on utilise gcc pour Win ou pour Un*x), donc le test sera fausse. L'ideal serait donc de l'assembleur, afin de maitriser le code, au moins pour la partie algo-mangeage-de-CPU.

Encore une fois je n'y connais rien, mais le projet semble seduisant a realiser (ou a reproduire si un tel logiciel multiplateforme existe deja).

Lien vers le commentaire
Partager sur d’autres sites

Ben oui, mais c'etait un peu le bordel et on avait aucune source de dispo :D

Sinon Irgoff:

ben oui, c'est vair c'est bien factorielle n :fumer:

ça fait tellement que j'avais pas fait !n que j'en avais oublié l'existance....

bon pour ce qui est du compilo: il suffit d'utiliser GCC partout :)

Dev C++ utilise GCC pour compiler... ça tombe bien CGG est GNU,

donc on le trouve un peu partout :)

bon sinon, pour factorielle n, elle croit bien trop vite en fait...

au bout de quelques itérations on depasse le range d'un int...

donc en fait il faudrait trouver autre chose... de plus chaque iteration

est executée en trop peu de temps.... mon 2500+ est utilisé a 90%

donc cette operation de l'occupe meme pas :-D

il faudrait trouver un truc qui croisse assez lentement et en meme temps qui fasse plus de calculs et plus complexes...

Sinon, pour ce qui est des autres benchs,bah ils sont pas open source ...

donc difficile d'avoir la source... (alors qu'ici GPL bien sur :) )

Lien vers le commentaire
Partager sur d’autres sites

factorielle n, compiler avec GCC opti au taquet, ou ICC opti taquet, il fait tout, sauf x*(x+1)... Donc on peut pas savoir ce qu'il fait...

D'autant qu'avec des CPU meme 64bit, avec une factorielle, on arrive très vite au bout...

Perso, je faisais simplement i++ en boucle... etonnament, sur le test inpact, les résultats étaient très bons en temre de résultat... même avec le K6 de nil...

par contre, en FPU (boucle sur pi) les résultats me plaisaient pas du tout...

par contre, je réussissais pas à descendre sous la seconde en mesure de temps... donc insuffisant pour évaluer l'amélioration du à un OC (donc meme archi) ou autres... c'est la seule utilisation possible et plausible...

Comme je l'ai dit, c'est débile d'utiliser une compilation non opti, puisque les logiciels, eux, les utilise...

Lien vers le commentaire
Partager sur d’autres sites

Si vous voulez de l'aide... appelez moi : je m'y connais pas si mal en C...(je dirais bien que je gère mais bon je suis pas comme ça...)

Quelques remarques :

1) optimisation :

je pense que 1 test commun (pas optimisé pour un pro particulier) + 1 test par optimisation (MMX, SSE, 3N now, etc...) comme ça y'a 2 avantages :

-comparaison d'architecture != (oui, différentes, quoi)

-on voit les avantages des optimisations...

2) gestion du temps :

à mon avis le plus facile ce serait de dire de faire le test pendant x secondes et voir combien de fois le test à été fait... Car time.h est quand même basique et à mon avis y'a pas besoin de faire plus compliqué !

3) ASM :

euh la prog en asm, c'est pas trop ça, même pour les optimisations, y'a pas beaucoup d'intérêt je crois (combien de programmeurs le font?) et puis ça éliminerait plein d'optimisations possibles qui sont faites automatiquement autrement...et puis qui est près à faire 1 bout d'ASM pour chaque optimisation ?

4) algo :

euh x! (factorielle x), ça utilise que des mutliplications et des additions...ce serait bien aussi d'utiliser des / (divisions euclidiennes avec les entiers) et des soustractions...

Il faudrais aussi utiliser des opérateurs "bit à bit" (&, |, ~, ...)

mais bon en tout cas il faudrais trouver un truc bien...

Je pense que un bête "for(i=0;[gestion de l'arrêt]; i++);" est très mauvais...il faudrais trouver un test qui ne dépende pas que de la vitesse du pro

(ptet que ça utilise le cache, avec plein de valeurs gardées en mémoire ... en option)

5) projet :

Je sais pas, c'est pas possible de créer un projet sur sourceforge, ou juste un CVS pour s'échanger des infos ? En fait je m'y connais pas très bien là dedans...à la limite une sorte de forum... (y'a pas déjà un truc comme ça pour les configs hardware?)

Je vais tester quelques trucs... et je poste si j'ai des nouvelles...

Lien vers le commentaire
Partager sur d’autres sites

OPTION :

J'y pense aussi, faudrais s'intéresser à l'hyper threading, pour les P4, mais surtout pour les multi-pro... (ben oui, je compte m'acheter un bi athlonXP... :mdr: )

enfin ça c'est très loin dans la liste des choses à faire...

Ah oui, c'est une idée, ça , faire la liste des choses à faire, et celles déjà faites !!!

Lien vers le commentaire
Partager sur d’autres sites

j'abonde tout a fait dans ton sens pour ce qui est des optimisations...

sinon pour la liste des choses a faire, c'est un peu le sujet du premier post :)

donc la priorité avant de s'occuper des optimisations, c'est d'abord de trouver un algorithme intéréssant pour les nombres entiers et ensuite d'en trouver un autre pour les flottants... et a la limite peut etre un par type d'operation...

Pour ce qui est du projet sourfeorge, j'y ai pensé, et je créerai une page , mais faut d'abord qu'on ait quelquechose a mettre dessus :)

sinon pour les sources, le forum me parait tres bien, grace aux balises code...

Lien vers le commentaire
Partager sur d’autres sites

Bon, c'est à peine une ébauche...

Même ceux qui font pas de C vont comprendre...

#include<math.h>
#include<stdio.h>
#include<time.h>
#define N 100000
#define M 50000000

void calculint()
{
register long int i;
register long int j;

for(i=0;i<N;i++)
for(j=0;j<N;j++);
}

void calculfloat()
{
   register long int i;
   register long int j;
   register long int k;
   double res;
   
       k=1;
       res=0;
   for(i=1;i<M;i++)
   {
       k++;/*printf("%d %d %f\n",k,i,res);*/
       res=res+pow(-1,k)*pow(i,-1);
       i++;
   }
}
       

void affiche(int noteint)
{
   puts("int puis float");
printf("Note obtenue en boucle : %d\n",noteint);
}

main()
{   
   time_t start,finish;
   double duree;
   int noteint=0;
   int notesom=0;
   int notefloat=0;
   
   start=time(0);
calculint();
finish=time(0);
duree=difftime(finish,start);
noteint=(int)duree*100;

start=time(0);
calculfloat();
finish=time(0);
duree=difftime(finish,start);
notefloat=(int)duree*100;

affiche(noteint);
affiche(notefloat);
}

Lien vers le commentaire
Partager sur d’autres sites

Et étonnament, les résultats en int sont bon...

Pour l'ASM, sur certains calculs, en opti à la main certains certaines boucles pour SSE2, on divise le temps d'exec par 70, voire +

Déjà avec la boucle int, en opti P4, je divise par 4 il me semble le temps d'exec... Et c'est juste le compilateur qui opti...

Lien vers le commentaire
Partager sur d’autres sites

bon, j'ai crée le projet sourceforge, il faut ettendre la validation...

en attendant je mettrai les fichiers sur mon serveur.

en compilant comme ça je fais 2300-2400 et 600-700 sur un 2500+

et avec les toutes les optis(case "toutes les optimisations" de mon compilo cohée)

je fais 1100-1200 et 600-700...

sur un 2500+@3200+(pas le mien) un copain obtient 2000 et 600-700 sans optis;

et 900 et 600 avec optis.

soit pour une augnementation de 20% de frequence(1833Mhz a 2200 Mhz)

un gain de 13 a 16% pour le premier test sans optimisations,

et un gain de 18% pour le premier test avec les optimisations.

Lien vers le commentaire
Partager sur d’autres sites

Ce qui confirme assez facilement que dans certains cas, le PR rating ne veut rien dire : avec un P4 2.53... je fais 1600, donc 20% de mieux qu'un Barton 3200+

Mais c'est assez logique vu les architecture... et 400 pour les opti si je me souviens bien...

Voila, pour la valeur d'un bench... et des opti...

On continue?

Lien vers le commentaire
Partager sur d’autres sites

et comment qu'on continue :)

par contre la difference me semble exessive avec le pIV!

parceque certes un pIV est generalement plus rapide a meme pr rating, mais pas a ce point!!

la le bench semble extremement influencé par la frequence bien plus qu'atre chose!

nouveaux resultats:

Xp 1800+

sans optis 2900-3000 et 900

avec optis 1500 et 900

par contre pour je ne sais quelle raison, impossible de le compiler sous linux...

il ne reconnait pas "pow"...

# gcc -o cpub cpubench001.c
/tmp/cc8rfglD.o: in function 'calculfloat' :
/tmp/cc8rfglD.o(.text+0x95): undefined reference to 'pow'
/tmp/cc8rfglD.o(.text+0xb1): undefined reference to 'pow'
collect2: ld returned 1 exit status

edit: encore d'autres resultats:

XP 1700+ @2314 FSB 202:

1700 et 600 sans optis

900 et 500 avec optis

sur ma machine avec le CPU a 2Ghz:

2100 et 600

1100 et 600

De plus les timings memoire n'ont absolument aucune influence sur les resultats.

Lien vers le commentaire
Partager sur d’autres sites

Je répète qu'il faudrais faire plus que de simples boucles avec des additions...

Je m'y met et je reposte ce soir...

Je suis d'accord...

Mais je fais ce que je peux avec le temps que j'ai... Je ne suis pas contre les aides... et le problème, c'est que le code utilisé influe directement sur le résultat... Si on choisi bien... on fait défoncer le barton par le P4... ou juste maitriser...

Lien vers le commentaire
Partager sur d’autres sites

voilà ce que j'ai pour l'instant :

#include <time.h>
#include <stdio.h>

int main(void)
{
time_t start;
unsigned int i;
unsigned int score;
unsigned int calcul;

start = time(0);
while( time(0)-start < 1 ); //on attend d'arriver à la fin d'une seconde

calcul=1;
for( i=1; time(0) - start < 10; i++ )
{
 calcul += 2*((i*((i+i)/(i+i)))/i)-((i*((i+i)/(i+i)))/i)-i+i;	//"calcul += 1;" mais avec des calculs
}
score=i;
if(calcul==score)
{printf("score:%i\n",score/10000);}
else
{printf("erreur de calcul!!!\n");}
return 0;	
}

Il faudrais tester sur plusieurs machines pour voir ce que ça donne...

perso j'ai 740 avec mon duron 1.2GHz

Aussi il y a le problème du compilateur...si on ne distribue que les sources (pour l'instant)

J'utilise personnellement Le compilateur de borland...

Lien vers le commentaire
Partager sur d’autres sites

voilà ce que j'ai pour l'instant :

#include <time.h>
#include <stdio.h>

int main(void)
{
time_t start;
unsigned int i;
unsigned int score;
unsigned int calcul;

start = time(0);
while( time(0)-start < 1 ); //on attend d'arriver à la fin d'une seconde

calcul=1;
for( i=1; time(0) - start < 10; i++ )
{
 calcul += 2*((i*((i+i)/(i+i)))/i)-((i*((i+i)/(i+i)))/i)-i+i;	//"calcul += 1;" mais avec des calculs
}
score=i;
if(calcul==score)
{printf("score:%i\n",score/10000);}
else
{printf("erreur de calcul!!!\n");}
return 0;	
}

Il faudrais tester sur plusieurs machines pour voir ce que ça donne...

perso j'ai 740 avec mon duron 1.2GHz

Aussi il y a le problème du compilateur...si on ne distribue que les sources (pour l'instant)

J'utilise personnellement Le compilateur de borland...

Je penche que si je passe ça dans ICC avec une opti au taquet... j'aurais un code simd qui va etre le meme que celui opti de i++... faudrait que j'essaye... J'ai pas le temps pour l'instant

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.


×
×
  • Créer...