Variable d'induction, réduction de force

Variable d'induction, réduction de force - C - Programmation

Marsh Posté le 03-04-2006 à 01:36:41    

Hello,
 
 
  Voila je suis entrain d'essayer de comprendre certaines optimisations possibles sur une boucle
 
- variable d'induction simple  : dont la valeur suit une progression arithmetique dans une boucle par exemple i = i + 10
- variable d'induction dépendante : dont le calcul dans la boucle est une fonction linéaire d'une variable d'induction simple  i : i * k1 + k2
- réduction de force : si j= c1 * i + c2 et que i est une variable
d'induction simple i = i + c3 alors j progresse de c1 * c3
 
Bon alors voila un code on s'en fout de ce qu'il fait :

Code :
  1. int p, q, r, t, a, i, b, c, min, max;
  2.     p=1;
  3.     q=2;
  4.     r=3;
  5.     t = 1;
  6.     a = 10;
  7.     i = 1;
  8.     b = 1;
  9.     c = 1;
  10.     min = 1;
  11.     max = 4;
  12.    
  13.     // VERSION SANS OPT
  14.     for(i = min ; i <= max; i=i+3){
  15.      t = a * i;
  16.      p = p+t;
  17.      q = q+b*t;
  18.      r = r+c*p;
  19.      printf("t = %d, p = %d, q = %d, r = %d\n", t, p, q, r);
  20.     }
  21.     // VERSION OPT
  22.     if( min <= max )  {
  23.         t = a*min;
  24.       p = p + t;
  25.        q = q + b * t;
  26.         r = r + c * p;
  27.         for(i = min+3 ; i <= max ; i += 3) {
  28.       t += 3*a;
  29.               p = p + t;
  30.               q = q + b * t;
  31.               r = r + c * p;
  32.         }
  33.     }
  34.          
  35.     printf("t = %d, p = %d, q = %d, r = %d\n", t, p, q, r);


 
A priori ca à l'air bon ...
 
Bon ca c'était pour éviter de faire la multiplication a * i .
 
Par contre pour eviter les autres multiplications je sais pas si c'est possible ...


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 03-04-2006 à 01:36:41   

Reply

Marsh Posté le 03-04-2006 à 08:53:16    

for(i = min ; i <= max; i=i+3)
 {
    t = a * i;  
 }
 
=>
 
int t=min*a, delta_t=a*3;
 
 for(i = min ; i <= max; i=i+3)
 {
    t += delta_t;  
    ...
 }
:??:
 

Reply

Marsh Posté le 03-04-2006 à 09:39:23    

bjone a écrit :

for(i = min ; i <= max; i=i+3)
 {
    t = a * i;  
 }
 
=>
 
int t=min*a, delta_t=a*3;
 
 for(i = min ; i <= max; i=i+3)
 {
    t += delta_t;  
    ...
 }
:??:


 
 
Oui pardon j'avais oublié de caler 3*a dans une variable.
 
Mais genre pour q = q + b * t; ? Je peux faire comment ?


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 03-04-2006 à 10:42:08    

alors attends je réfléchi si c'est possible de faire quelque chose:
 
int q=....., b=....
 
for(i = min ; i <= max; i=i+3)
 {
    t += delta_t;  
    q = q + b * t;  
    ...
 }  
 
q = q + b * t;  
 
q+=b*t;
 
=>
 
int t = min*a,  delta_t =a*3;
 
int bt = b*t;
 
int delta_bt =  delta_t * b;
 
for( i = min ; i <= max ; i=i+3 )
 {
    t += delta_t;  
    bt + = delta_bt;
    q += bt;  
    ...
 }  
 
je pense que ça doit être bon....

Reply

Marsh Posté le 03-04-2006 à 10:54:46    

pareil pour
r = r + c * p;
 
tu dois pouvoir déterminer une forme:
r+=delta_r;
ou
cp += delta_cp;
r += cp;

Reply

Marsh Posté le 04-04-2006 à 16:15:59    

glup
 
ça te va ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed