Bench

Résolu
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010 - 26 avril 2008 à 13:14
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010 - 28 avril 2008 à 22:55
Salut a tous,

Voila je suis entrain de faire un ptit bench pour me faire une idee de la puissance "brute" d'un pc et je suis un peu surpris par les resultats
Deja le tableau donné par wiki me semble assez bizarre non ?
http://en.wikipedia.org/wiki/Million_instructions_per_second#Million_instructions_per_second
un p4 peut il vraiment faire 9700 millions d'operations/secondes ? ou bien ai-je une autre definition du mot operation ?

en plus de ne pas dutout optenir des resultats de l'ordre du tableau, je trouve bizarre 2 ou 3 points comme le fait que les doubles soient plus rapide que les int64 ?
Voici les resultats que j'obtiens exprimé en millons d'operation/s sur un x86

Processeur, Intel(R) Pentium(R) 4 CPU 3.20GHz<t d=""></t>, ----
Opérations arithmétiques (entiers 32 bits), 181, ----
Opérations arithmétiques (réels 32 bits), 80, ----
Opérations logiques (entiers 32 bits), 714, ----
Opérations binaires (entiers 32 bits), 714, , ----
Opérations arithmétiques (entiers 64 bits), 66, ----
Opérations arithmétiques (réels 64 bits), 119, ----
Opérations logiques (entiers 64 bits), 400, ----
Opérations binaires (entiers 64 bits), 333

voici le code d'une des fonctions a titre d'exemple, les autre sont codees de la meme facon:

__int64

ArithmTestEnt32(){

LARGE_INTEGER start;

LARGE_INTEGER stop;
DWORD a32 5; DWORD b32 64; DWORD c32 = 0;

dwCurItt = 0;

QueryPerformanceCounter(&start);

DO:

c32 = dwCurItt++;

c32 /= a32; c32 -= b32; c32 *= a32; c32 += b32;

c32 /= a32; c32 -= b32; c32 *= a32; c32 += b32;

c32 /= a32;

if (dwCurItt != ITTER_ARRITHM_ENT)
goto DO;QueryPerformanceCounter(&stop);

return (
__int64)(stop.QuadPart - start.QuadPart);}

++

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...

8 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
26 avril 2008 à 13:32
Tout sera faux pour cause de langage évolué, tu n'as pas la maitruise du code généré par le compilo donc impossible de mesurer le vrai nombre d'opérations faites.
Les benchs de ce genre ne peuvent se faire qu'en ASM.

ciao...
BruNews, MVP VC++
3
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
26 avril 2008 à 20:15
Surement normal du fait que la multiplication sur double (ou float) est inline dans le code alors que le CRT pour multiplication et division sur __int64 fait un call vers __llmul ou __lldiv.

__llmul , c'est 3 multiplications et 2 additions en interne, sans compter l'empilage, les transferts (MOV), le dépilage et le retour chez l'appelant.

ciao...
BruNews, MVP VC++
3
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
26 avril 2008 à 13:51
Salut BruNews,

Ok pour la maitrise du nombre d'operations, mais qu'en est il du fait que j'obtiens de meilleurs perf en double qu'en __int64 ? est-ce logique ?

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
0
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
26 avril 2008 à 20:21
erf bin crotte! lol

ok je "comprends" mieux, bon bah j'ai plus qu'a aller me chercher une boite d'aspirine et de me casser la tete avec de l'asm!

Merci pour ces éclairesissements ;)

++

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
28 avril 2008 à 17:00
re,

bon j'ai tester en asm pour l'arithmetique 32 bits, je gagne 47 MIPS mais je suis encore loin du compte...

Mais eh quand tu dis asm, est-ce que cela fait une difference si c'est du inline genre:

__int64

ArithmTest()
{DWORD i = 0;
LARGE_INTEGER start;
LARGE_INTEGER stop;

QueryPerformanceCounter(&start);

_asm
{

mov eax, 1050d
mov ebx, 8888d
mov ecx, 100000d
mov edx, 20dDO:

mul ebx
add ecx, edx
div ebx
sub ecx, edx
mul ebx
add ecx, edx
div ebx
sub ecx, edx
add ecx, edx
sub ecx, edx
add i, 1

cmp i, 1000000d
jne

short DO

// mov b, ecx
}QueryPerformanceCounter(&stop);

return (
__int64)(stop.QuadPart - start.QuadPart);}

enfin meme si ca faisait une difference ca ne devrait pas expliquer la montagne entre le tableau de Wiki et mes resultats

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
28 avril 2008 à 17:46
Jamais d'ASM dans une fonction C, tu ne sauras toujours rien d'où le compilo sauvegarde les registres (avant ou après les perfCounters) ni rien d'autre. Une fonction doit être full ASM ou full C, jamais de mix.

__declspec(naked) ProtoFonctionIci();
pour full ASM.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
28 avril 2008 à 17:47
Autre chose, pour les cycles c'est RDTSC depuis l'user mode.

ciao...
BruNews, MVP VC++
0
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
28 avril 2008 à 22:55
Ok merci beaucoup pour ces precisions :)

Et surement a bientot sur asmfr.com!

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
0