cs_Arnotic
Messages postés933Date d'inscriptiondimanche 1 avril 2001StatutMembreDernière intervention 9 janvier 2012
-
19 févr. 2007 à 12:40
gnairod
Messages postés37Date d'inscriptionsamedi 22 novembre 2008StatutMembreDernière intervention11 avril 2010
-
20 mai 2010 à 11:32
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
gnairod
Messages postés37Date d'inscriptionsamedi 22 novembre 2008StatutMembreDernière intervention11 avril 2010 20 mai 2010 à 11:32
Pardon je voulais dire sans coder en ASM ;)
gnairod
Messages postés37Date d'inscriptionsamedi 22 novembre 2008StatutMembreDernière intervention11 avril 2010 20 mai 2010 à 10:43
J'aime bien cette source j'y retourne souvent :)
Pour ceux qui veulent des perfs mais sans coder en C ou bien tout simplement savoir comment utiliser les fonctions intrinseques. Voici mon code.
#include
/* RETOURNE INT(SOMME DES SQRT de 6336 FLOAT D'UN VECTEUR)
SI FLOAT < 1.0 ALORS SERA 1.0 */
int __fastcall cumSqrt_C(float *pflt)
{
const __declspec(align(16)) float MIN[] = { 1.0f, 1.0f, 1.0f, 1.0f };
__m128 mem;
__m128 min;
__m128 sum;
unsigned int i;
sum = _mm_setzero_ps();
min = _mm_load_ps(MIN);
for (i = 0; i < 6336; i += sizeof(__m128) / sizeof(int))
{
mem = _mm_load_ps(pflt + i);
mem = _mm_max_ps(mem, min);
mem = _mm_sqrt_ps(mem);
sum = _mm_add_ps(sum, mem);
}
sum = _mm_hadd_ps(sum, sum);
sum = _mm_hadd_ps(sum, sum);
return _mm_cvttss_si32(sum);
}
Code SSE3 car instruction haddps donc attention crash si proco ne supporte pas l'instruction.
gnairod
Messages postés37Date d'inscriptionsamedi 22 novembre 2008StatutMembreDernière intervention11 avril 2010 22 déc. 2008 à 18:33
Brunews tu dis : "Si qlq'un veut améliorer les perfs en C (fichier cumC.c ONLY) de qlq manière que ce soit, qu'il amène et on testera, je suis preneur."
int __fastcall cumSqrt_C(float *pflt)
{
float f, r = 0.0f;
unsigned int i = 6335;
do {
f = pflt[i];
r += ((f > 1.0f) ? (float)sqrt(f): 1.0f);
} while(i--);
return (int) (r);
}
Est optimal, ce qui va entre en jeu cest le compilateur. Sera t-il capable de generer un code qui puisse rivalise avec le tiens ? La reponse est oui avec le compilo Intel (Verifie). Je t'accordes tout de meme que le prix est eleve et que l'inge fera tjr mieux que le compilateur, il est donc plus "interessant" d'embauche un/des gars pour faire ce boulot que d'achete un compilo hors de prix. Cependant y a pas bcp de monde qui a les competences pour faire du bon code ASM :)
PS :
Dans ton code ASM evite de lire par coupure dans la memoire. Tu perds qq cycles.
cs_max12
Messages postés1491Date d'inscriptiondimanche 19 novembre 2000StatutModérateurDernière intervention 7 juillet 2014 7 août 2008 à 05:03
Je retombait sur cette source par hasard et j'ai refais le test avec un autre matériel.
SSE2 663
C 5303
Intel Core Duo 2 T5600 1.83 GHZ
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 12 août 2007 à 14:34
SUPER EXACT !!!
Je passe de 280 à 226, c'est toujours très loin des 74 en asm manuel mais c'est mieux.
Purée ce qu'on peut oublier par moments, peut-être début de sénilité...
Je m'étais pourtant demandé pourquoi le compilo générait 'addsd' au lieu de 'addss', ça crevait pourtant les yeux.
Merci.
NairodDorian
Messages postés130Date d'inscriptionlundi 26 juin 2006StatutMembreDernière intervention18 août 2008 12 août 2007 à 14:23
t'as surement oublie a la ligne : r += ((f > 1.0f) ? sqrt(f): 1.0f);
le float devant sqrt(f);
r += ((f > 1.0f) ? (float)sqrt(f): 1.0f); // la y a un gain
Chez moi j'ai un gain de perf.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 12 août 2007 à 14:20
"...ecrivons correctement..." he he faut tester et surtout bien regarder le listing asm produit par le compilo pour savoir si c'est plus "correct".
J'ai ajouté les 'f' au cul des constantes float et recompilé, j'aobtiens absolument la même chose.
Je passe le flag de fp de precise à fast, toujours le même asm généré et mêmes perfs bien entendu (normal vu que je n'utilise pas le fpu).
NairodDorian
Messages postés130Date d'inscriptionlundi 26 juin 2006StatutMembreDernière intervention18 août 2008 12 août 2007 à 10:44
Bon, je me suis permis de faire qq essais.
Microsoft a ajoute un nouveau switch a son compilateur /fp dont /fp:fast. cf : http://msdn2.microsoft.com/fr-fr/library/e7s85ffb(VS.80).aspx En ajoutant ce switch recompiler et execute a nouveau la source.
Vous obtenez la meme note et le meme resultat.
Maintenant ecrivons correctement le code C comme ceci :
int __fastcall cumSqrt_C(float *pflt)
{
float f, r = 0.0f;
//int i;
//for(i = 0; i < 6336; i++) {
// f = pflt[i];
// r += ((f > 1.0) ? sqrt(f): 1.0);
//}
unsigned int i = 6335;
do {
f = pflt[i];
r += ((f > 1.0f) ? (float)sqrt(f): 1.0f);
} while(i--);
return (int) (r); /* NE PAS TOUCHER CAR COMPIL EN SSE2 FAIT BIEN UN CVTTSS2SI */
}
Je passe de 337 a 207.
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 7 juin 2007 à 18:27
Pentium 4 2,8 GHz :
SSE2: 65024
C: 242044
Donc même problème que vecchio...
cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 201822 10 avril 2007 à 09:55
Sur un portable avec un Core 2 Duo T5600 (1.83GHz):
-SSE2:94
-C:727
Merci qui? merci Brunews pour ce cour.
Cphil51
Messages postés87Date d'inscriptionjeudi 22 juin 2006StatutMembreDernière intervention24 septembre 2007 12 mars 2007 à 23:15
J'ai un Athlon 64 3500+ sur sock AM2 :
SSE3 : 98
C : 273
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 27 févr. 2007 à 09:08
Ouf ça fait plaisir je suis pas le seul a avoir des résultats pourris ^^
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 27 févr. 2007 à 08:59
J'ai aussi noté des résultats de ce genre sur un portable en P4 3.4, il semblerait que le système doive recharger la zone mémoire entre RemplirLin() et le calcul.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 27 févr. 2007 à 01:19
Pentium D 3GHz
SSE2: 67080
C: 261165
Euh... la je comprends pas ce qui se passe
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 26 févr. 2007 à 20:38
eh non, pas d'autre sqrt() que instruction SSE ou alors FPU, donc toujours toujours du flottant en sortie comme en entrée.
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 26 févr. 2007 à 20:28
Je sais ce qu'est sqrt, merci ;) Je me demandais simplement s'il n'y avait pas d'alternative possible ( et plus rapide ) qui soit de cette forme : int sqrt ( float ), ya sûrement moyen de mettre une optimsation de ce côté là ...
Nota pour le testeur -> voui ^^ mais c'est juste que ça m'a vite gavé quand j'ai voulu modifier la version C.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 26 févr. 2007 à 19:28
Le cast (int) d'un float retourne la troncature vers zéro si est compilé SSE (compilo met un CVTTSS2SI pour une conversion directe sans aucun arrondi), j'opte pour la même méthode depuis asm pour ne pas fausser les mesures et donc je l'ai noté en commentaire.
sqrt() est le calcul de la racine carrée, aucun rapport direct avec 'int'.
Calcul dans InitDialog surune boucle 10 fois en mémorisant le meilleur compte, bien sur possible, mais il faut bien occuper le testeur, he he.
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 26 févr. 2007 à 18:41
Yop
déjà, +1 pour les petites précisions dans la desc du code, ça évite beaucoup de trolls.
sur un AMD Athlon 64 3200+, 2.01Ghz ( vache z'ont des bon PC dans mon école ),
109
302
pour SSE2
2 min je lance VC2005...
Bon aucun changement pour SSE3, exactement mêmes perfs, en moyenne sur une 20aine d'essais.
Et je ne comprends pas cette ligne:
return (int) (r); /* NE PAS TOUCHER CAR COMPIL EN SSE2 FAIT BIEN UN CVTTSS2SI */
commentaire inutile :p : pk ne pas avoir mis TestC();TestSSE(); dans InitDialog ...
Etrange ........
Bon, chapeau pour VC,
do {
f = *pflt;pflt++;
r += ((f > 1.0) ? sqrt(f): 1.0);
} while(i--);
ne change strictement rien aux perfs.
Ya pas plus rapide que sqrt pour rendre un truc int ?
Merci pour le bench anyway.
++
RaphAstronome
Messages postés104Date d'inscriptionsamedi 7 décembre 2002StatutMembreDernière intervention17 août 2009 26 févr. 2007 à 11:52
Dommage qu'il ne fonctionne pas avec GCC.
Sinon il y a des options dans GCC pour le faire compiler en utilisant SSE2 et SSE3
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 21 févr. 2007 à 18:05
MAJ faite.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 21 févr. 2007 à 17:01
Oui. Ça affiche bien ERR cette fois.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 21 févr. 2007 à 09:31
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 21 févr. 2007 à 00:06
ben si, mystique ça.
Je jetterai un oeil demain.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 20 févr. 2007 à 23:55
CumSqrt.exe ne plante pas au démarrage mais plante lors des tests. Mais Excpt n'est pas censé renvoyer ERR?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 20 févr. 2007 à 23:43
SAKingdom > et en lançant l'exe de test, ne se plante pas ???
bAzilew
Messages postés23Date d'inscriptionjeudi 16 mars 2006StatutMembreDernière intervention23 mars 2007 20 févr. 2007 à 23:33
Pentium M 1.73Ghz
- C 768
- SSE2 193
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 20 févr. 2007 à 22:49
C'est drôle.
Mon AMD 2000+ ne supporte pas les instructions SSE2 mais Excpt.exe affiche quand même 2.
Normal?
cs_eRoZion
Messages postés241Date d'inscriptionvendredi 23 mai 2003StatutMembreDernière intervention 8 octobre 20071 20 févr. 2007 à 20:55
Salut :)
Bonne initiative.
Pentium 4 2,6Ghz overclocké à 3,0Ghz
- SSE2 : 62
- C : 242
++
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 20 févr. 2007 à 20:52
Bidou > Va falloir porter ton PC dans DotNettorium.
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 20 févr. 2007 à 20:48
Mx> Evidemment, il faut tout optimiser au maximum! ;-)
Sinon rien à faire, j'obtiens les mêmes temps qu'en début d'après midi... :-/
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 20 févr. 2007 à 20:42
Bruno est tellement à cheval sur les performances qu'il en omet des mots pour que ca aille plus vite ;)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 20 févr. 2007 à 20:38
Voila fait.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 20 févr. 2007 à 20:38
ok j'avais pas fait gaffe
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 20 févr. 2007 à 20:28
OK je vais le rajouter mais j'ai bien précisé plus haut qu'on ne verra pas la différence ici, il faudrait le calculateur complet pour cela (et surtout les Mo de données à traiter).
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 20 févr. 2007 à 20:15
Alors, pas possible d'avoir un exe de la version SSE3? J'ai vraiment pas envie d'installer VS2005 pour ca
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 20 févr. 2007 à 20:04
Parce qu'il a été introduit dans le jeu d'instructions pardi.
A partir de quel modèle, aucune idée mais suffirait de regarder dans les pdf AMD.
cs_badrbadr
Messages postés475Date d'inscriptionjeudi 19 juin 2003StatutMembreDernière intervention 3 novembre 20081 20 févr. 2007 à 19:51
Comment se fait-il que le jeu d'instruction SSE s'executent sur un AMD?
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 20 févr. 2007 à 16:31
Je crois que t'as pas besoin de le rappeler, Bruno est souvent là pour ca :D
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 20 févr. 2007 à 15:38
Rappelons que l'effet .net s'observe par un ralentissement des performances, tu n'es donc pas vraiment atteint
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 20 févr. 2007 à 15:28
Athlon x2 4200
- SSE 2 : 99
- C : 273
J'ai un meilleur effet .Net que Bidou ^^
NairodDorian
Messages postés130Date d'inscriptionlundi 26 juin 2006StatutMembreDernière intervention18 août 2008 20 févr. 2007 à 15:18
Pentium 4 2,6 GHz
Compiler avec vc++ :
SS2 : 91
Version C: 337
Compiler avec intel c++ :
SS2 : 90
Version C: 337
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 20 févr. 2007 à 14:26
Héhé Brunews, j'étais sûr que tu allais la faire celle-là, elle était facile ^^
Je referai le teste une fois ce soir, je viendrai poster si j'ai des résultats différents (les résultats obtenus ne sont pas dépendant de l'occupation en RAM ou bien? Car j'ai vu au moment des testes que j'avais qqe process assez lourd)
SpEeDy_Fire
Messages postés25Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention16 avril 2008 20 févr. 2007 à 14:04
SSE2:84
C: 314
Sur un pentium 4 2.6ghz
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 20 févr. 2007 à 13:49
C'est l'effet .net :)
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 20 févr. 2007 à 13:21
Assez étonnants tes résultats bidou avec un T7200
T'a pas un autre truc qui tourne en même temps?
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 20 févr. 2007 à 13:12
Processeur Core2Duo T7200 à 2.00 Ghz
Version SS3 : 169
Version C : 1322
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 20 févr. 2007 à 13:09
Pentium 4M, 2.20GHz
SSE2: 107
C: 399
Core 2 Duo T5500 (1.66GHz)
SSE2: 104
C: 795
Je ne peux pas non plus compiler la version SSE3 car seulement VS2003 d'installé (si tu pouvais mettre un exe SSE3...)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 20 févr. 2007 à 12:47
VS 2003 ne connaissait surement pas SSE3, il faudra compiler avec VC++ 2005 sinon écrire les opcodes à la main (truc de fou furieux).
Regarde ici: http://www.cppfrance.com/code.aspx?ID=38359
Shromilder
Messages postés32Date d'inscriptionsamedi 16 avril 2005StatutMembreDernière intervention13 février 2010 20 févr. 2007 à 12:34
j'ai eut 3 comme message.
Et si j'essaie de compiler CumSqrt après avoir commenté la ligne "#define BNSSE3NOT", bah j'ai les messages d'erreur suivant (VS 2003):
e:\Downloads\cppfrance_source_41536\cumSSE.c(62): warning C4405: 'xmm0' : cet identificateur est un mot réservé
e:\Downloads\cppfrance_source_41536\cumSSE.c(62): error C2400: erreur de syntaxe d'assembleur inline dans 'opcode' ; trouvé 'xmm0'
e:\Downloads\cppfrance_source_41536\cumSSE.c(63): warning C4405: 'xmm0' : cet identificateur est un mot réservé
e:\Downloads\cppfrance_source_41536\cumSSE.c(63): error C2400: erreur de syntaxe d'assembleur inline dans 'opcode' ; trouvé 'xmm0'
ca correspond aux 2 lignes qui sont après la ligne ";// VERSION SSE3" dans le meme fichier.
bon sinon sans recompiler, j'obtiens:
SSE2: 212
C: 572
avec un athlon64 X2 4200
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 20 févr. 2007 à 12:05
SSE3 n'est pas "plus lent", simplement qu'ici ce n'est utilisé juste que sur 2 instructions hors boucle donc normal que n'influe pas sur les perfs.
Le CPU émet "Invalid instruction" au système qui virera le processus coupable s'il n'a pas prévu la gestion de l'erreur.
Pour la prog system en ASM il vaudra mieux aller sur asmfr, le but de l'exemple est simplement de montrer qu'un code dédié fait main sera imbattable par un générique C et qu'il ne faut pas craindre d'aller dans cette voie.
On peut constater au vu des premiers résultats que la progression des CPUs est indéniable, grace notamment à l'amélioration du FSB.
Il me vient l'idée de faire un exe de ce genre que je mettrai sur clé USB pour tester le prochain PC à acheter.
Merci pour les résultats et j'espère qu'on en aura d'autres.
MuPuF
Messages postés536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 août 2008 20 févr. 2007 à 11:13
woups, désolé, c'est sse 2 pour moi, il me faut installer visual c++ 2005 pour tester avec sse3 (j'aime bien le 2003 moi :-( )
Mais le 3500+ x86_64 en 939 supporte bien le SSE 3 pour ceux qui voudraient essayer.
MuPuF
Messages postés536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 août 2008 20 févr. 2007 à 11:10
Athlon xp 3500+ (socket 939):
- SSE3 : 98
- C : 273
spiky31
Messages postés106Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention11 février 2008 20 févr. 2007 à 09:53
j'oubliais : pourrais tu faire un "#define TAILLE_TABLEAU 6336" et modifier le code en conséquence pour que ce soit plus pratique ?
merci
spiky31
Messages postés106Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention11 février 2008 20 févr. 2007 à 09:50
sur athlon 64 3700 overclocker a 2540 MHz (2200 de base) :
SSE2 : 86
C : 238
idem avec SSE3 mais je pense que c'est normal car j'ai lu quelque part (wikipedia je crois) que les instructions SSE3 s'executaient plus lentement chez AMD que chez INTEL (a verifier)
sinon brunews peux tu nous expliquer brievement comment tu fait pour tester la presence des instructions SSE2 et SSE3 sur un proc car j'ai pas bien compris (et je ne pense pas etre le seul)
et aussi : que se passe t'il si on execute une instruction SSE3 (ou SSE2) sur un proc qui ne le prend pas en charge
merci
cs_max12
Messages postés1491Date d'inscriptiondimanche 19 novembre 2000StatutModérateurDernière intervention 7 juillet 2014 20 févr. 2007 à 00:39
Dans ce cas je vais tâcher de me rappeler de regarder sur quel matériel je l'ai testé (d'école). Dommage que mon PC perso ne prenne pas en charge SSE2&3 (Athlon XP 3200).
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 19 févr. 2007 à 18:34
Dommage, un petit graphe sur les perfs des différents CPU serait intéressant.
cs_max12
Messages postés1491Date d'inscriptiondimanche 19 novembre 2000StatutModérateurDernière intervention 7 juillet 2014 19 févr. 2007 à 18:28
SSE2 : 67
C : 261
(pas de détail sur matériel)
cs_Arnotic
Messages postés933Date d'inscriptiondimanche 1 avril 2001StatutMembreDernière intervention 9 janvier 2012 19 févr. 2007 à 12:40
Voici les perfs que j'obtiens avec un processeur Core Duo T2300 à 1.66 Ghz :
Version SS2 : 200
Version C : 787
20 mai 2010 à 11:32
20 mai 2010 à 10:43
Pour ceux qui veulent des perfs mais sans coder en C ou bien tout simplement savoir comment utiliser les fonctions intrinseques. Voici mon code.
#include
/* RETOURNE INT(SOMME DES SQRT de 6336 FLOAT D'UN VECTEUR)
SI FLOAT < 1.0 ALORS SERA 1.0 */
int __fastcall cumSqrt_C(float *pflt)
{
const __declspec(align(16)) float MIN[] = { 1.0f, 1.0f, 1.0f, 1.0f };
__m128 mem;
__m128 min;
__m128 sum;
unsigned int i;
sum = _mm_setzero_ps();
min = _mm_load_ps(MIN);
for (i = 0; i < 6336; i += sizeof(__m128) / sizeof(int))
{
mem = _mm_load_ps(pflt + i);
mem = _mm_max_ps(mem, min);
mem = _mm_sqrt_ps(mem);
sum = _mm_add_ps(sum, mem);
}
sum = _mm_hadd_ps(sum, sum);
sum = _mm_hadd_ps(sum, sum);
return _mm_cvttss_si32(sum);
}
Code SSE3 car instruction haddps donc attention crash si proco ne supporte pas l'instruction.
22 déc. 2008 à 18:33
int __fastcall cumSqrt_C(float *pflt)
{
float f, r = 0.0f;
unsigned int i = 6335;
do {
f = pflt[i];
r += ((f > 1.0f) ? (float)sqrt(f): 1.0f);
} while(i--);
return (int) (r);
}
Est optimal, ce qui va entre en jeu cest le compilateur. Sera t-il capable de generer un code qui puisse rivalise avec le tiens ? La reponse est oui avec le compilo Intel (Verifie). Je t'accordes tout de meme que le prix est eleve et que l'inge fera tjr mieux que le compilateur, il est donc plus "interessant" d'embauche un/des gars pour faire ce boulot que d'achete un compilo hors de prix. Cependant y a pas bcp de monde qui a les competences pour faire du bon code ASM :)
PS :
Dans ton code ASM evite de lire par coupure dans la memoire. Tu perds qq cycles.
7 août 2008 à 05:03
SSE2 663
C 5303
Intel Core Duo 2 T5600 1.83 GHZ
12 août 2007 à 14:34
Je passe de 280 à 226, c'est toujours très loin des 74 en asm manuel mais c'est mieux.
Purée ce qu'on peut oublier par moments, peut-être début de sénilité...
Je m'étais pourtant demandé pourquoi le compilo générait 'addsd' au lieu de 'addss', ça crevait pourtant les yeux.
Merci.
12 août 2007 à 14:23
le float devant sqrt(f);
r += ((f > 1.0f) ? (float)sqrt(f): 1.0f); // la y a un gain
Chez moi j'ai un gain de perf.
12 août 2007 à 14:20
J'ai ajouté les 'f' au cul des constantes float et recompilé, j'aobtiens absolument la même chose.
Je passe le flag de fp de precise à fast, toujours le même asm généré et mêmes perfs bien entendu (normal vu que je n'utilise pas le fpu).
12 août 2007 à 10:44
Microsoft a ajoute un nouveau switch a son compilateur /fp dont /fp:fast. cf : http://msdn2.microsoft.com/fr-fr/library/e7s85ffb(VS.80).aspx
En ajoutant ce switch recompiler et execute a nouveau la source.
Vous obtenez la meme note et le meme resultat.
Maintenant ecrivons correctement le code C comme ceci :
int __fastcall cumSqrt_C(float *pflt)
{
float f, r = 0.0f;
//int i;
//for(i = 0; i < 6336; i++) {
// f = pflt[i];
// r += ((f > 1.0) ? sqrt(f): 1.0);
//}
unsigned int i = 6335;
do {
f = pflt[i];
r += ((f > 1.0f) ? (float)sqrt(f): 1.0f);
} while(i--);
return (int) (r); /* NE PAS TOUCHER CAR COMPIL EN SSE2 FAIT BIEN UN CVTTSS2SI */
}
Je passe de 337 a 207.
7 juin 2007 à 18:27
SSE2: 65024
C: 242044
Donc même problème que vecchio...
10 avril 2007 à 09:55
-SSE2:94
-C:727
Merci qui? merci Brunews pour ce cour.
12 mars 2007 à 23:15
SSE3 : 98
C : 273
27 févr. 2007 à 09:08
27 févr. 2007 à 08:59
27 févr. 2007 à 01:19
SSE2: 67080
C: 261165
Euh... la je comprends pas ce qui se passe
26 févr. 2007 à 20:38
26 févr. 2007 à 20:28
Nota pour le testeur -> voui ^^ mais c'est juste que ça m'a vite gavé quand j'ai voulu modifier la version C.
26 févr. 2007 à 19:28
sqrt() est le calcul de la racine carrée, aucun rapport direct avec 'int'.
Calcul dans InitDialog surune boucle 10 fois en mémorisant le meilleur compte, bien sur possible, mais il faut bien occuper le testeur, he he.
26 févr. 2007 à 18:41
déjà, +1 pour les petites précisions dans la desc du code, ça évite beaucoup de trolls.
sur un AMD Athlon 64 3200+, 2.01Ghz ( vache z'ont des bon PC dans mon école ),
109
302
pour SSE2
2 min je lance VC2005...
Bon aucun changement pour SSE3, exactement mêmes perfs, en moyenne sur une 20aine d'essais.
Et je ne comprends pas cette ligne:
return (int) (r); /* NE PAS TOUCHER CAR COMPIL EN SSE2 FAIT BIEN UN CVTTSS2SI */
commentaire inutile :p : pk ne pas avoir mis TestC();TestSSE(); dans InitDialog ...
Etrange ........
Bon, chapeau pour VC,
do {
f = *pflt;pflt++;
r += ((f > 1.0) ? sqrt(f): 1.0);
} while(i--);
ne change strictement rien aux perfs.
Ya pas plus rapide que sqrt pour rendre un truc int ?
Merci pour le bench anyway.
++
26 févr. 2007 à 11:52
Sinon il y a des options dans GCC pour le faire compiler en utilisant SSE2 et SSE3
21 févr. 2007 à 18:05
21 févr. 2007 à 17:01
21 févr. 2007 à 09:31
max12 et SAKingdom > va mieux le test ???
21 févr. 2007 à 03:53
Sinon pour la machine (J'avais dit que je vérifierais)
SSE2 : 67
C : 261
Pentium 4 Prescott 3.2 GHZ HT Active
21 févr. 2007 à 03:14
DURON 1.1Ghz : ERR
AMD TURION 64X2 1.8Ghz : SS3=124 C=335
++
21 févr. 2007 à 00:06
Je jetterai un oeil demain.
20 févr. 2007 à 23:55
20 févr. 2007 à 23:43
20 févr. 2007 à 23:33
- C 768
- SSE2 193
20 févr. 2007 à 22:49
Mon AMD 2000+ ne supporte pas les instructions SSE2 mais Excpt.exe affiche quand même 2.
Normal?
20 févr. 2007 à 20:55
Bonne initiative.
Pentium 4 2,6Ghz overclocké à 3,0Ghz
- SSE2 : 62
- C : 242
++
20 févr. 2007 à 20:52
20 févr. 2007 à 20:48
Sinon rien à faire, j'obtiens les mêmes temps qu'en début d'après midi... :-/
20 févr. 2007 à 20:42
20 févr. 2007 à 20:38
20 févr. 2007 à 20:38
20 févr. 2007 à 20:28
20 févr. 2007 à 20:15
20 févr. 2007 à 20:04
A partir de quel modèle, aucune idée mais suffirait de regarder dans les pdf AMD.
20 févr. 2007 à 19:51
20 févr. 2007 à 16:31
20 févr. 2007 à 15:38
20 févr. 2007 à 15:28
- SSE 2 : 99
- C : 273
J'ai un meilleur effet .Net que Bidou ^^
20 févr. 2007 à 15:18
Compiler avec vc++ :
SS2 : 91
Version C: 337
Compiler avec intel c++ :
SS2 : 90
Version C: 337
20 févr. 2007 à 14:26
Je referai le teste une fois ce soir, je viendrai poster si j'ai des résultats différents (les résultats obtenus ne sont pas dépendant de l'occupation en RAM ou bien? Car j'ai vu au moment des testes que j'avais qqe process assez lourd)
20 févr. 2007 à 14:04
C: 314
Sur un pentium 4 2.6ghz
20 févr. 2007 à 13:49
20 févr. 2007 à 13:21
T'a pas un autre truc qui tourne en même temps?
20 févr. 2007 à 13:12
Version SS3 : 169
Version C : 1322
20 févr. 2007 à 13:09
SSE2: 107
C: 399
Core 2 Duo T5500 (1.66GHz)
SSE2: 104
C: 795
Je ne peux pas non plus compiler la version SSE3 car seulement VS2003 d'installé (si tu pouvais mettre un exe SSE3...)
20 févr. 2007 à 12:47
Regarde ici: http://www.cppfrance.com/code.aspx?ID=38359
20 févr. 2007 à 12:34
Et si j'essaie de compiler CumSqrt après avoir commenté la ligne "#define BNSSE3NOT", bah j'ai les messages d'erreur suivant (VS 2003):
e:\Downloads\cppfrance_source_41536\cumSSE.c(62): warning C4405: 'xmm0' : cet identificateur est un mot réservé
e:\Downloads\cppfrance_source_41536\cumSSE.c(62): error C2400: erreur de syntaxe d'assembleur inline dans 'opcode' ; trouvé 'xmm0'
e:\Downloads\cppfrance_source_41536\cumSSE.c(63): warning C4405: 'xmm0' : cet identificateur est un mot réservé
e:\Downloads\cppfrance_source_41536\cumSSE.c(63): error C2400: erreur de syntaxe d'assembleur inline dans 'opcode' ; trouvé 'xmm0'
ca correspond aux 2 lignes qui sont après la ligne ";// VERSION SSE3" dans le meme fichier.
bon sinon sans recompiler, j'obtiens:
SSE2: 212
C: 572
avec un athlon64 X2 4200
20 févr. 2007 à 12:05
Le CPU émet "Invalid instruction" au système qui virera le processus coupable s'il n'a pas prévu la gestion de l'erreur.
Pour la prog system en ASM il vaudra mieux aller sur asmfr, le but de l'exemple est simplement de montrer qu'un code dédié fait main sera imbattable par un générique C et qu'il ne faut pas craindre d'aller dans cette voie.
On peut constater au vu des premiers résultats que la progression des CPUs est indéniable, grace notamment à l'amélioration du FSB.
Il me vient l'idée de faire un exe de ce genre que je mettrai sur clé USB pour tester le prochain PC à acheter.
Merci pour les résultats et j'espère qu'on en aura d'autres.
20 févr. 2007 à 11:13
Mais le 3500+ x86_64 en 939 supporte bien le SSE 3 pour ceux qui voudraient essayer.
20 févr. 2007 à 11:10
- SSE3 : 98
- C : 273
20 févr. 2007 à 09:53
merci
20 févr. 2007 à 09:50
SSE2 : 86
C : 238
idem avec SSE3 mais je pense que c'est normal car j'ai lu quelque part (wikipedia je crois) que les instructions SSE3 s'executaient plus lentement chez AMD que chez INTEL (a verifier)
sinon brunews peux tu nous expliquer brievement comment tu fait pour tester la presence des instructions SSE2 et SSE3 sur un proc car j'ai pas bien compris (et je ne pense pas etre le seul)
et aussi : que se passe t'il si on execute une instruction SSE3 (ou SSE2) sur un proc qui ne le prend pas en charge
merci
20 févr. 2007 à 00:39
19 févr. 2007 à 18:34
19 févr. 2007 à 18:28
C : 261
(pas de détail sur matériel)
19 févr. 2007 à 12:40
Version SS2 : 200
Version C : 787