Induktionsvariabel

Inom datavetenskap är en induktionsvariabel en variabel som ökas eller minskas med ett fast belopp vid varje iteration av en loop eller är en linjär funktion av en annan induktionsvariabel.

Till exempel, i följande slinga är i och j induktionsvariabler:

   0     
        
 för  (  i  =  ;  i  <  10  ;  ++  i  )  {  j  =  17  *  i  ;  } 

Applikation för styrka reduktion

En vanlig kompilatoroptimering är att känna igen förekomsten av induktionsvariabler och ersätta dem med enklare beräkningar; till exempel skulle koden ovan kunna skrivas om av kompilatorn enligt följande, under antagandet att tillägget av en konstant blir billigare än en multiplikation.

  
   0     
        
 j  =  -17  ;  för  (  i  =  ;  i  <  10  ;  ++  i  )  {  j  =  j  +  17  ;  } 

Denna optimering är ett specialfall av hållfasthetsminskning .

Applikation för att minska registertrycket

I vissa fall är det möjligt att vända denna optimering för att helt ta bort en induktionsvariabel från koden. Till exempel:

  
   
      
      
       0     
          
          
    
     
 extern  int  summa  ;  int  foo  (  int  n  )  {  int  i  ,  j  ;  j  =  5  ;  för  (  i  =  ;  i  <  n  ;  ++  i  )  {  j  +=  2  ;  summa  +=  j  ;  }  returnera  summan  ;  } 

Denna funktions loop har två induktionsvariabler: i och j . Antingen kan den ena skrivas om som en linjär funktion av den andra; därför kan kompilatorn optimera denna kod som om den hade skrivits

  
   
     
       0     
                
    
     
 extern  int  summa  ;  int  foo  (  int  n  )  {  int  i  ;  för  (  i  =  ;  i  <  n  ;  ++  i  )  {  summa  +=  5  +  2  *  (  i  +  1  );  }  returnera  summan  ;  } 

Induktionsvariabel substitution

Induktionsvariabelsubstitution är en kompilatortransformation för att känna igen variabler som kan uttryckas som funktioner av indexen för omslutande loopar och ersätta dem med uttryck som involverar loopindex.

Denna transformation gör förhållandet mellan variablerna och loopindex explicit, vilket hjälper andra kompilatoranalyser, såsom beroendeanalys .

Exempel:

Inmatningskod:

  
  
   0     
         
 int  c  ,  i  ;  c  =  10  ;  för  (  i  =  ;  i  <  10  ;  i  ++  )  {  c  =  c  +  5  ;  // c ökas med 5 för varje loop-iteration  } 

Utdatakod

  
  
   0     
              
 int  c  ,  i  ;  c  =  10  ;  för  (  i  =  ;  i  <  10  ;  i  ++  )  {  c  =  10  +  5  *  (  i  +  1  );  // c uttrycks uttryckligen som en funktion av loopindex  } 

Icke-linjära induktionsvariabler

Samma optimeringar kan tillämpas på induktionsvariabler som inte nödvändigtvis är linjära funktioner hos loopräknaren; till exempel slingan

  
   0     
        
 j  =  1  ;  för  (  i  =  ;  i  <  10  ;  ++  i  )  {  j  =  j  <<  1  ;  } 

kan konverteras till

   0     
        
 för  (  i  =  ;  i  <  10  ;  ++  i  )  {  j  =  1  <<  (  i  +  1  );  } 

Se även

Vidare läsning