Post on 22-Feb-2016
description
LECTURE 35:LOOP OPTIMIZATIONS
Computer Science 313 – Advanced Programming Topics
Loops Matter
Computers often used for repetitive analyses Machines speed & memory
advantageous for this Not hurt by its lack of common sense
“Repetitive analyses” means loops Loops occur everywhere in computer
science Performing statistical analyses on data Database processing for result analyses Evaluating results of large system
simulation Redrawing detailed pictures from WoW
Programs without Loops
What do we write that does NOT use loops?
Optimizing Loops Useful
Big differences from small change to loop Size unimportant; time spent in execution
important Repeated execute the code in the loop Even small changes become greatly
magnified Compiler limited in how it optimizes
loops Often lacks precise knowledge of how things
work Languages prevent optimizations across
iterations Non-inlined method calls cannot be optimize Cannot optimize uses of an object or field
Simple Example
Consider following loop Calls size() at start of each iteration Calls get() within body of the loop
int i;int retVal = 0;for (i = 0; i < list.size(); i++){
retVal += list.get(i);}
Minor Change
Make following changes which have little impact Calls size() at start of loop, but not within
iteration Calls get() within body of the loop
int i = list.size() - 1;int retVal = 0;for (; i >= 0; i--){
retVal += list.get(i);}
Another Small Change
Loop counts up, not down, in this version Calls size() at start of loop, but not within
iteration Calls get() within body of the loop
int end = list.size();int retVal = 0;for (int i = 0; i < end; i++){
retVal += list.get(i);}
Little Odder Change
Limit iterations needed to complete loop Calls size() at start of loop, but not within iteration Calls get() within body of the loop
int end = list.size();int retVal, tmp1 = 0, tmp2 = 0;for (int i = 0; i < end; i+=2){ tmp1 += list.get(i); tmp2 += list.get(i + 1);}retVal = tmp1 + tmp2;
Execution Time of Each Loop
Iterator Simple Loop
Countdown Local End Two Sums0.00
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
Exec
utio
n Ti
me
(sec
onds
)
Reason for the 2 Big Drops Biggest change when code moved out of
loop Called loop hoisting or loop invariant
code-motion Loop hoisting done automatically by
compiler But only when it can determine optimization is
safe Need to understand how this works
Try to write code to enable optimization Don’t write hard-to-read code duplicating
optimization
Another Use of SSA Form
Method must be converted into SSA form Find definition for each use of a variable
Instruction is loop-invariant when:t = xn yn
xn & yn are both constant –or– Definitions of xn & yn are outside the loop –
or– Loop-invariant instructions define xn & yn
Loop Hoisting Actions
Need location to place hoisted instructions Where instructions moved when they get
hoisted Could try and remember where loop
starts Prepend instructions just before where
loop start Need to make sure is not included in
loop Much easier to add pre-loop header
Blank header included with all loops Purpose is only to hold hoisted
instructions
Loop-Invariant Example
Create loop header for loop
Any instruction should be mark as loop-invariant if: Constant operands used Operands def’d outside
loop Operands from other
loop-invariant instructions
x1 = a1 + 22y1 = b1 + x1
z1 = foo()
if (z1 < 45)
a1 = …b1 = …
Loop-Invariant Example
Create loop header for loop
Any instruction should be mark as loop-invariant if: Constant operands used Operands def’d outside
loop Operands from other
loop-invariant instructions
a1 = …b1 = …
x1 = a1 + 22y1 = b1 + x1
z1 = foo()
if (z1 < 45)
Loop-Invariant Example
Create loop header for loop
Any instruction should be mark as loop-invariant if: Constant operands used Operands def’d outside
loop Operands from other
loop-invariant instructions
a1 = …b1 = …
y1 = b1 + x1
z1 = foo()
x1 = a1 + 22
if (z1 < 45)
Loop-Invariant Example
a1 = …b1 = …
z1 = foo()
x1 = a1 + 22y1 = b1 + x1
if (z1 < 45)
Create loop header for loop
Any instruction should be mark as loop-invariant if: Constant operands used Operands def’d outside
loop Operands from other
loop-invariant instructions
Loop-Invariant Example
a1 = …b1 = …
x1 = a1 + 22y1 = b1 + x1
if (z1 < 45)
Create pre-header for loop
Any instruction should be mark as loop-invariant if: Constant operands used Operands def’d outside
loop Operands from other
loop-invariant instructions
Watch for fields & methods Cannot be moved!
z1 = foo()c1 = field
Must Also Meet Conditions
Must meet conditions Pre-header dominates hoisted
instruction Loop contains exactly one variable
definition
do { i = i + 1 t = a * b M[i] = t} while (i < t); x = t
Must Also Meet Conditions
Must meet conditions Pre-header dominates hoisted
instruction Loop contains exactly one variable
definition
do { if (i >= 45)
t = a * b i = i + 1 M[i] = t} while (i < t);
x = t
Must Also Meet Conditions
Must meet conditions Pre-header dominates hoisted
instruction Loop contains exactly one variable
definition
do { if (i >= 45)
t = a * b else
t = a + b M[i] = t} while (i < t);
Great For Nested Loops
Fairly common to work with sets of loop Databases & scientific data especially so
Can hoist instructions: From outer loop to outside both loops From inner loop to outside both loops From inner loop to only in the outer loop
Normally nested loops use arrays or objects Use scalar replacement to solve this
Nested Loop Example
Exposes reuse of a value Array & object uses cannot be optimized Use of local variable can be optimized
For really impressive sounding name: Use dependence analysis to help rewrite
loops
Loop Unrolling
Unroll to reduce overhead of the loop
Advantages:+ Fewer instructions
executed+ More optimizations
possible+ Great for consecutive
accesses
Disadvantages:- Code gets bloated- Still using objects
For Next Class
Lab available on the web Lab will be due 1 week from Friday
Read pages 385 – 399 for this Friday Begin looking at the State pattern Closely related to what 2 patterns already
discussed? When and where would we want to use State
pattern?