A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d...

14
. A little bit about optimization, 2d array, 1d array used as 2d, register volatile union

Transcript of A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d...

Page 1: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

.

A little bit about optimization,

2d array,

1d array used as 2d,

register

volatile

union

Page 2: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

Premature optimization is the root of all

evil (or at least most of it) in programming

– Donald Knuth

What smart people say about

Premature optimization…

Page 3: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

So, what to do?

Check if you need to optimize

Remember to “turn off” debugging (#define

NDEBUG)

Check what your compiler can do for you on

your specific hardware (-O3 -march=pentium4

-mfpmath=sse, inlining of functions, ...)

Profile: check where to optimize

Use common techniques such as cache,...

Page 4: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

1d Array as 2d array

int* getElementAddr(int* arr, int r, int c) {

return (arr+ r*COLS_NUM + c);

}

void foo(int* arr) {

... *(getElementAddr(arr,r,c))

}

1,2 1,1 1,0 0,2 0,1 0,0

Page 5: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

1d Array as 2d array

int* getElementAddr(int* arr, int r, int c) {

return (arr+ r*COLS_NUM + c);

}

void foo(int* arr) {

... *(getElementAddr(arr,r,c))

}

What can we do if we use a specific r

and c many times and this is the

bottleneck section?

Page 6: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

1d Array as 2d array

void foo(int* arr) {

... size_t cache_index= r*COLS_NUM + c;

...

... *(arr + cache_index)

}

Use cache !

Page 7: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

register

Register - a small amount of very fast memory.

Provides quick access to commonly used values.

The register keyword specifies that the variable is to

be stored in a machine register, if possible.

Experience has shown that the compiler usually

knows much better than humans what should go into

registers and when.

There is actually an hierarchy of caches (L1, L2,…).

We are not going to learn this in this course.

Page 8: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

Volatile

variables that may be modified externally from the

declaring object.

Variables declared to be volatile will not be

optimized by the compiler because their value can

change at any time.

Page 9: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

Volatile example

void foo(void)

{

int* addr;

addr= INPUT_ADDRESS;

*addr = 0;

while (*addr != 255)

;

}

Before optimization

Page 10: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

Volatile example

void foo(void)

{

int* addr;

addr= INPUT_ADDRESS;

*addr = 0;

while (1)

;

}

After optimization

Page 11: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

Volatile example

void foo(void)

{

volatile int* addr;

addr= INPUT_ADDRESS;

*addr = 0;

while (*addr != 255)

;

}

After optimization

using volatile

Page 12: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

union

Page 13: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

union – a new type

A type that keeps (in different times) different types

typedef union MyUnion

{

int i_val;

double d_val;

} MyUnion;

Page 14: A little bit about optimization, 2d array, 1d array used ... · A little bit about optimization, 2d array, 1d array used as 2d, register volatile union . Premature optimization is

typedef union MyUnion { int i_val; double d_val; } MyUnion;

MyUnion u;

u.i_val= 3;

printf("%d\n", u.i_val);

u.d_val= 3.22;

printf("%f\n", u.d_val);

...

...

union – a new type, usage