begin process at 2012 05 27 17:37:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > OPTIMISATION DE CALCULS (WIN64)

OPTIMISATION DE CALCULS (WIN64)


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :OPTIMISATION, ASM, TENDANCE Niveau :Débutant Date de création :30/04/2010 Date de mise à jour :09/05/2010 11:39:53 Vu / téléchargé :3 108 / 108

Auteur : BruNews

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
BUT: Optimiser les perfs.
Renommer bnTndc.ex_ en bnTndc.exe pour tester.

On part de cette fonction. C'est une SIMPLE traduction en C d'une fonction faite en VB sur Excel (comme tout le projet) par un pro de la statistique. Donc matheux mais pas du tout informaticien.
C'est une déclinaison de la fonction TENDANCE.

float c1Tendce(float *pA, float *pTbl, int deb, int fin)
{
  float XRef, moy, CumY1, CumY2;
  int i;
  XRef = (float) ((fin + 1 - deb) / 2 + deb);
  CumY1 = 0.0f;
  CumY2 = 0.0f;
  moy = 0.0f;
  i = deb;
  while(i <= fin) moy += pTbl[i++];
  moy /= (float) (fin + 1 - deb);
  for(; deb <= fin; deb++) {
    CumY1 = CumY1 + (XRef - (float) deb) * (moy - pTbl[deb]);
    CumY2 = CumY2 + (XRef - (float) deb) * (XRef - (float) deb);
  }
  CumY1 /= CumY2;
  *pA = CumY1;
  return (moy - CumY1 * XRef);
}

Partant d'une série de valeurs (pTbl), le but est d'en calculer 2. Une est placée en pA et l'autre est retournée.
On la réécrit un plus proprement (vu du C) afin de l'étudier:
float c1Tendce(float *pA, float *pTbl, int deb, int fin)
{
  float XRef, moy, CumY1, CumY2, f;
  int i, n;
  n = fin + 1 - deb;
  XRef = (float) (n / 2 + deb);
  CumY1 = 0.0f;
  CumY2 = 0.0f;
  moy = 0.0f;
  i = deb;
  while(i <= fin) moy += pTbl[i++];
  moy /= (float) n;
  for(; deb <= fin; deb++) {
    f = XRef - (float) deb;
    CumY1 += f * (moy - pTbl[deb]);
    CumY2 += f * f;
  }
  CumY1 /= CumY2;
  *pA = CumY1;
  return (moy - CumY1 * XRef);
}

Cela fait, on inspecte le projet pour voir les appels de cette fonction.
float A, B, C, D;
B = c1Tendce(&A, tbl, 12, 23);
D = c1Tendce(&C, tbl, 24, 35);
Les bornes sont toujours les mêmes, 12-23 ou 24-35.
Ah que voilà une info très intéressante.

Voyons le tableau, toujours 36 valeurs (pour 36 mois), dont on calcule les 2 dernières années.
Seconde info très intérssante...
Je vous invite à regarder dans le cede du zip joint comment je suis arrivé à:
float c2TendceDOUZE(float *pA, float *pTbl, float ftaux);
Puis en ASM:
float a1TendceDOUZE(float *pA, float *pTbl, float ftaux);
et enfin:
float a2TendceDOUZE(float *pA, float *pTbl, float ftaux);

Les résultats de chaque fonction sont affichés pour bien vérifier qu'ils sont justes.
PERFS donne QueryPerformanceCounter (fin - deb) sur une boucle de 500 tours pour chaque.

Je précise que tout ceci n'est pas gratuit, cette fonction est appelée au bas mot 1 million de fois chque nuit quand le calculateur est lancé, et il en comprend un grand nombre de fonctions de ce genre.
Je suis preneur de toute version plus rapide.



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

09 mai 2010 11:39:54 :
VECCHIO56 met une évidence en lumière, de sa présence il nous éclaire.

 Sources du même auteur

Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64)
Source avec Zip Source avec une capture FIND TEXT (WIN64)
Source avec Zip DELETE DIRECTORY (WIN64)
Source avec Zip ENUM DIRECTORY (WIN64)
Source avec Zip TEMPLATES C/C++ POUR VS 2010

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture FIND TEXT (WIN64) par BruNews
Source avec Zip Source avec une capture CRIBLE D'ERATOSTHÈNE OPTIMISÉ par pgl10
Source avec Zip Source avec une capture CALENDRIER (WIN64) par BruNews
Source avec Zip COMMENTER CODE C <=> ASM (WIN64) par BruNews
Source avec Zip Source avec une capture TEST VITESSE SELON TYPE (WIN32, WIN64) par BruNews

Commentaires et avis

Commentaire de DeAtHCrAsH le 02/05/2010 04:48:12

Salut BruNews,

Superbe exemple d'application des maths dans un contexte de performance. Je ne pense pas qu'il existe de methode "plus rapide" dans ce cas précis.
Les statistiques sont tous sauf précis, surtout pour le calcul des tendances.
Ainsi ton exemple reste a premiere vu le plus "sophistiqué" dans le contexte auquel il se rapporte.

Sur d'autres applications comme le calcul de tendances sur des années ou des mois, il va y avoir du résidu et donc du garbage dans les résultats finaux. Voici un lien qui résume plutot bien le cas :
http://www.jybaudot.fr/Previsions/desaisannuel.html

Bref encore un très bon code source pour les matheux/programmeur :)

Commentaire de BruNews le 02/05/2010 10:40:44 administrateur CS

Super le lien, grand merci

Commentaire de BruNews le 02/05/2010 15:15:55 administrateur CS

QUESTION (à 2 sous):
Comme visible sur la capture d'écran, la plus rapide affiche 31 en perfCounter.
On peut aisément atteindre 28 avec qlqs modifs, LESQUELLES ?

PS: celui à qui je l'ai dit par phone et qui se reconnaitra est prié de s'abstenir.

Commentaire de vecchio56 le 08/05/2010 22:20:17 administrateur CS

au lieu de faire la somme des TNDCFLT[i] * (moy - pTbl[i]), si on développe ca, ca nous donne
6 * moy - (somme des TNDCFLT[i] * pTbl[i])

On s'épargne ainsi de 3 subps

Chez mois je gagne environ 33% de temps (80 au lieu de 120), mais je suis sur une VM, donc je ne sais pas si la mesure est très fiable...

Commentaire de BruNews le 08/05/2010 22:56:03 administrateur CS

Je regarde ça, merci vecchio.

Commentaire de vecchio56 le 09/05/2010 18:35:48 administrateur CS

J'arrive à faire un peu plus rapide (je pense que c'est parce que je fais 2 mulss là ou tu en fais 3).

Tu fais moy / 12, puis 6 * moy, ensuite une division par 146
Je pense qu'une de ces instructions est en trop
(Pour y arriver, j'ai divisé en dur les valeurs de TNDCFLT par 146.0f).

Sinon, petite question : quelle différence entre movdqa et movapd?
Si je ne me trompe pas tu as changé d'instruction entre les deux versions.

Commentaire de vecchio56 le 09/05/2010 19:00:17 administrateur CS

Tiens je me suis aperçu qu'en essayant d'améliorer mon code, je l'ai en fait ralenti. J'ai bien vérifié, ca me semble bizarre. Il y a des règles pour le choix de l'ordre des instructions?

1ere version me donne perf=585:

  movapd    xmm0, [rdx]
  addps     xmm0, [rdx + 16]
  addps     xmm0, [rdx + 32]
  haddps    xmm0, xmm0
  haddps    xmm0, xmm0                  ; XMM0 = 12 * moy

  movapd    xmm4, [rdx]
  movapd    xmm1, [rdx + 16]
  movapd    xmm3, [rdx + 32]



2eme version me donne perf=607:

  movapd    xmm4, [rdx]
  movapd    xmm1, [rdx + 16]
  movapd    xmm3, [rdx + 32]

  movapd    xmm0, xmm4
  addps     xmm0, xmm1
  addps     xmm0, xmm3
  haddps    xmm0, xmm0
  haddps    xmm0, xmm0                  ; XMM0 = 12 * moy

Commentaire de BruNews le 09/05/2010 19:08:26 administrateur CS

entre movdqa et movapd, il ne DEVRAIT y avoir aucune difference.
Mais pourtant j'obtiens quasi toujours plus rapide avec movdqa, bizarre mais je m'adapte.
L'ordre des instructions, quand c'est SSE alors il n'y a que les tests pour dire ce qui va mieux.

Commentaire de kml404 le 01/06/2010 16:09:11

bonjour BruNews

j'ai accepte sur bouton de telechargement j'ai fait d'ouvre mais ya de icon Agendat.ex_ ce qui ne peut pas ouvrer. c'est non exe...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

optimisation d un code asm [ par sajid_morad ] salut tout le monde j aimerai bien savoir comment optimiser un code en assembleur ( le temps d execution des instruction le plus optimal ), et esqu il l asm et la config release [ par sajid_morad ] salut tout le monde, j ai un probleme avec la configuration release de visaul c++, le probleme c est que j ai due inserer un bout de code en asm dans release vs debug en asm !!!! [ par sajid_morad ] salut tout le monde, voulant optimisé une boucle qui prend un peu de temps je l ai réécri en asm, en effet j ai pu optimisé le temps en optimisant le Faire un OS en partie en C/C++, c'est possible? [ par CChargy ] Bonjour, J'essaye d'écrire un OS(j'ai pas commencer) qui fonctionnerais comma ça:- Démarage de la disquette de Boot en asm ( c'est bon)- démérage d'un routine en asm [ par tex2023 ] Je voudrai savoir comment appeler des routines ecrites en asm depuis un programme Cc'est a dire en incluant le .o du proh asm dans le projet C.Merci. asm en c++ [ par Adeon ] Salut a tous!j'ai besoin de faire une partie de mon programme c++ en assembleur et il y a une instruction toute simple ke je n'arrive pas a faire : me systeme non lineaire+optimisation d'une fonction non lineaire [ par correcte ] Bonjour,Je cherche un programme ecrit en c++ qui permet de resoudre un systeme d'equations non lineaire.Je cherche egalement un programme qui fait le optimisation [ par arf63 ] Salut j aimerai savoir s il y a moyen d optimiser ca avec un switch case je le maitrise moyenement si quelqu un pourait m aider if (iMat[iPosy][iPosx] Utiliser une fonction ASM compilée (sous MASM) sous Dev-C++ ? [ par skirby ] Bonjour, j'essaye d&#233;sesp&#233;r&#233;ment d'int&#233;grer une fonction assembleur (compil&#233;e sous MASM) dans Dev-C++ (v4.9.9.2) Voici mon c tasm32 [ par jeannot_ ] Salut!J'aimerais executer un prog en asm. Qd je le compile sous dos (le fichier&nbsp; .asm),&nbsp; tout est nickel et j'obtiens un fichier&nbsp; ".obj


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,014 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales