Bench

Résolu
Signaler
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010
-
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010
-
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

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

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...
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

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...
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

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...
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Autre chose, pour les cycles c'est RDTSC depuis l'user mode.

ciao...
BruNews, MVP VC++
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

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...