Lecture 35: Loop Optimizations

24
LECTURE 35: LOOP OPTIMIZATIONS Computer Science 313 – Advanced Programming Topics

description

Computer Science 313 – Advanced Programming Topics. Lecture 35: Loop Optimizations. 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 - PowerPoint PPT Presentation

Transcript of Lecture 35: Loop Optimizations

Page 1: Lecture 35: Loop Optimizations

LECTURE 35:LOOP OPTIMIZATIONS

Computer Science 313 – Advanced Programming Topics

Page 2: Lecture 35: Loop Optimizations

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

Page 3: Lecture 35: Loop Optimizations

Programs without Loops

What do we write that does NOT use loops?

Page 4: Lecture 35: Loop Optimizations

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

Page 5: Lecture 35: Loop Optimizations

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);}

Page 6: Lecture 35: Loop Optimizations

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);}

Page 7: Lecture 35: Loop Optimizations

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);}

Page 8: Lecture 35: Loop Optimizations

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;

Page 9: Lecture 35: Loop Optimizations

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

)

Page 10: Lecture 35: Loop Optimizations

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

Page 11: Lecture 35: Loop Optimizations

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

Page 12: Lecture 35: Loop Optimizations

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

Page 13: Lecture 35: Loop Optimizations

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 = …

Page 14: Lecture 35: Loop Optimizations

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)

Page 15: Lecture 35: Loop Optimizations

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)

Page 16: Lecture 35: Loop Optimizations

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

Page 17: Lecture 35: Loop Optimizations

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

Page 18: Lecture 35: Loop Optimizations

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

Page 19: Lecture 35: Loop Optimizations

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

Page 20: Lecture 35: Loop Optimizations

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);

Page 21: Lecture 35: Loop Optimizations

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

Page 22: Lecture 35: Loop Optimizations

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

Page 23: Lecture 35: Loop Optimizations

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

Page 24: Lecture 35: Loop Optimizations

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?