Slinga frånkopplas

Loop unswitching är en kompilatoroptimering . Den flyttar en villkorad inuti en slinga utanför den genom att duplicera slingans kropp och placera en version av den inuti var och en av om och annat-satserna i villkoret. Detta kan förbättra parallelliseringen av slingan. Eftersom moderna processorer kan arbeta snabbt på vektorer, ökar denna förbättring programmets hastighet.

Här är ett enkelt exempel. Anta att vi vill lägga till de två arrayerna x och y och även göra något beroende på variabeln w . Vi har följande C- kod:

      
     0     
      
     
        0
   int  i  ,  w  ,  x  [  1000  ],  y  [  1000  ];  för  (  i  =  ;  i  <  1000  ;  i  ++  )  {  x  [  i  ]  +=  y  [  i  ];  om  (  w  )  y  [  i  ]  =  ;  } 

Det villkorliga inuti denna loop gör det svårt att säkert parallellisera denna loop. När vi kopplar bort slingan blir detta:

      
    
       0     
        
        0
    
    
       0     
        
    
   int  i  ,  w  ,  x  [  1000  ],  y  [  1000  ];  if  (  w  )  {  för  (  i  =  ;  i  <  1000  ;  i  ++  )  {  x  [  i  ]  +=  y  [  i  ];  y  [  i  ]  =  ;  }  }  else  {  for  (  i  =  ;  i  <  1000  ;  i  ++  )  {  x  [  i  ]  +=  y  [  i  ];  }  } 

Även om slingavkoppling kan fördubbla mängden kod som skrivs, kan var och en av dessa nya slingor nu optimeras separat.

Loop unswitching introducerades i gcc i version 3.4.