lecture 35: loop optimizations

Post on 22-Feb-2016

30 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

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?

top related