computer systems: a programmer’s perspective long mult_eg(long a, long b, long c) {

50
����

Upload: others

Post on 13-May-2020

21 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

����������

���

���������

�����������������������������

���������

����

������������

������

�������������

Page 2: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

����������

���

���������

�����������������������������

���������

����

������������

������

�������������

���

���������

�����������������������������

Page 3: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

����������

�����������������������Computer Systems: A Programmer’s Perspective����������������

Page 4: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

����������

Superscalar processor

� ������������������������������������������������������

� ���������������������������������������

Instruction-level parallelism

� ��������������������������������������������������

� ������������������������������

���

Page 5: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

��������������������������

long mult_eg(long a, long b, long c) { long p1 = a*b; long p2 = a*c; long p3 = p1*p2; return p3;}

������������������������������������������������������

������������ ��������������������������������������������� a*b�����a*c�����������������������������

�����������������������Computer Systems: A Programmer’s Perspective������������������

Page 6: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

��������������������������

long mult_eg(long a, long b, long c) { long p1 = a*b; long p2 = a*c; long p3 = p1*p2; return p3;}

����� ����� ����� ����� ����� ����� �����

������� a*b a*c p1*p2

������� a*b a*c p1*p2

������� a*b a*c p1*p2

�����������������������Computer Systems: A Programmer’s Perspective����������������

Page 7: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������������

��������

latency cycles/issue

���� � ������ � �

����������� � ����������������� � ��������������� ���� ����

������ � ������������ � ���������� ���� ����

�����������������������Computer Systems: A Programmer’s Perspective����������������

Page 8: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������������

��������

latency cycles/issue

���� � ������ � �

����������� � ����������������� � ��������������� ���� ����

������ � ������������ � ���������� ���� ����

������������������

�����������������������Computer Systems: A Programmer’s Perspective�����������������

Page 9: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������������

��������

latency cycles/issue

���� � ������ � �

����������� � ����������������� � ��������������� ���� ����

������ � ������������ � ���������� ���� ����

������������������������������������������

�����������������������Computer Systems: A Programmer’s Perspective�����������������

Page 10: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

void combine4(vec_ptr v, data_t *dest) { long int i; int length = vec_length(v); data_t* data = get_vec_start(v); data_t acc = IDENT; for (i = 0; i < length; i++) acc = acc OPER data[i]; *dest = acc;}

�����������������������Computer Systems: A Programmer’s Perspective�����������������

Page 11: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

void combine4(vec_ptr v, data_t *dest) { long int i; int length = vec_length(v); data_t* data = get_vec_start(v); data_t acc = IDENT; for (i = 0; i < length; i++) acc = acc OPER data[i]; *dest = acc;}

���*

.L519: imull (%rax,%rdx,4), %ecx # t = t * d[i] addq $1, %rdx # i++ cmpq %rdx, %rbp # Compare length:i jg .L519 # If >, loop

int + *

double + *

������������������� 1.27 3.01 3.01 5.01������������� 1.00 3.00 3.00 5.00

�����������������������Computer Systems: A Programmer’s Perspective��������������������

Page 12: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

����������������������

for (i = 0; i < length; i++) acc = acc OPER d[i];

1d[0]

* d[1]

* d[2]

* d[3]

* d[4]

* d[5]

* d[6]

* d[7]

*

�����������������������Computer Systems: A Programmer’s Perspective�����������������

Page 13: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

��������������

void combine5(vec_ptr v, data_t *dest) { long int i; int length = vec_length(v); int limit = length - 1; data_t* data = get_vec_start(v); data_t acc = IDENT; /* Combine 2 elements at a time */ for (i = 0; i < limit; i += 2) acc = (acc OPER data[i]) OPER data[i+1]; /* Finish any remaining elements */ for (; i < length; i++) acc = acc OPER data[i]; *dest = acc;}

�����������������������Computer Systems: A Programmer’s Perspective�����������������

Page 14: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

��������������

void combine5(vec_ptr v, data_t *dest) { long int i; int length = vec_length(v); int limit = length - 1; data_t* data = get_vec_start(v); data_t acc = IDENT; /* Combine 2 elements at a time */ for (i = 0; i < limit; i += 2) acc = (acc OPER data[i]) OPER data[i+1]; /* Finish any remaining elements */ for (; i < length; i++) acc = acc OPER data[i]; *dest = acc;}

int + *

double + *

������������������� 1.27 3.01 3.01 5.01��������� 1.01 3.01 3.01 5.01

������������� 1.00 3.00 3.00 5.00

�����������������������Computer Systems: A Programmer’s Perspective�����������������

Page 15: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

����������������������

for (i = 0; i < limit; i += 2) acc = (acc OPER d[i]) OPER d[i+1];

1d[0]

* d[1]

* d[2]

* d[3]

* d[4]

* d[5]

* d[6]

* d[7]

*

��

Page 16: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������������������

��������

...

d

1

+

[]

+

d

1

+

[]

+

d

1

+

[]

+

d

1

+

[]

+

��

Page 17: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������������������

���������

...

d

2

+

[]

+

d

[]

+

d

2

+

[]

+

d

[]

+

��

Page 18: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������������������

������������������������

...

d

1

+

[]

*

d

1

+

[]

*

d

1

+

[]

*

d

1

+

[]

*

��

Page 19: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�������������

for (i = 0; i < limit; i += 2) acc = (acc OPER d[i]) OPER d[i+1];

for (i = 0; i < limit; i += 2) acc = acc OPER (d[i] OPER d[i+1]);

����������������������������������������������������������������������

int + *

double + *

��������� 1.01 3.01 3.01 5.01������������ 1.01 1.51 1.51 2.51������������� 1.00 3.00 3.00 5.00

�����

Page 20: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

������������������������

1

d[0] d[1]

*

*

d[2] d[3]

*

*

d[4] d[5]

*

*

d[6] d[7]

*

*

*�����double�� ��������

���������������⇒��������

�����

Page 21: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

������������������������

1

d[0] d[1]

*

*

d[2] d[3]

*

*

d[4] d[5]

*

*

d[6] d[7]

*

*

int + *

double + *

��������� 1.01 3.01 3.01 5.01������������ 1.01 1.51 1.51 2.51������������� 1.00 3.00 3.00 5.00

��

Page 22: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

���������������������

1d[0]

* d[1]

* d[2]

* d[3]

* d[4]

* d[5]

* d[6]

* d[7]

*

��

Page 23: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

���������������������

1d[0]

* d[2]

* d[4]

* d[6]

* 1d[1]

* d[3]

* d[5]

* d[7]

* *

����������������������������������������

�����

Page 24: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

������������������������������������

void combine6(vec_ptr v, data_t *dest) { long int i; int length = vec_length(v); int limit = length - 1; data_t* data = get_vec_start(v); data_t acc0 = IDENT, acc1 = IDENT; /* Combine 2 elements at a time */ for (i = 0; i < limit; i += 2) { acc0 = acc0 OPER data[i]; acc1 = acc1 OPER data[i+1]; } /* Finish any remaining elements */ for (; i < length; i++) acc0 = acc0 OPER data[i]; *dest = acc0 OPER acc1;}

��

Page 25: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

��������������

int + *

double + *

������������ 1.01 1.51 1.51 2.51���������� 0.81 1.51 1.51 2.51���������� 0.72 1.07 1.01 1.25

������������� 1.00 3.00 3.00 5.00

�������������������������������������������

�����

Page 26: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������������

latency cycles/issue

���������������� � �

����� ����� ����� ����� ����� �����

������� a*b c*d e*f g*h

������� a*b c*d c*d g*h

������� a*b c*d c*d g*h

��

Page 27: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

���������������������������������

latency cycles/issue capacity

���������������� � � �

����� ����� ����� ����� �����

������� a*b c*d e*f

������� a*b c*d c*d

������� a*b c*d c*d

������� g*h

������� g*h

������� g*h��

Page 28: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

����������������

latency cycles/issue capacitythroughput

bound

���� � � � �������� � � � �

����������� � � � �������������������� � � � ��������������� ���� ���� � ����

������ � � � ������������ � � � ������������ ���� ���� � ����

��

Page 29: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

����������������

latency cycles/issue capacitythroughput

bound

���� � � � �������� � � � �

����������� � � � �������������������� � � � ��������������� ���� ���� � ����

������ � � � ������������ � � � ������������ ���� ���� � ����

cycles/issue� / �capacity

combine int + *

double + *

���������������� 0.50 1.00 1.00 0.50�����

Page 30: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

����������������

latency cycles/issue capacitythroughput

bound

���� � � � �������� � � � �

����������� � � � �������������������� � � � ��������������� ���� ���� � ����

������ � � � ������������ � � � ������������ ���� ���� � ����

cycles/issue� / �capacity

combine int + *

double + *

���������������� 0.50 1.00 1.00 0.50

���������������������������+

��

Page 31: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

���������������

int + *

double + *

������������ 1.01 1.51 1.51 2.51���������� 0.81 1.51 1.51 2.51���������� 0.72 1.07 1.01 1.25

������������� 1.00 3.00 3.00 5.00���������������� 0.50 1.00 1.00 0.50

���������������

+ ����������������

- ����������������������

�����

Page 32: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

���������������

���������������*

����������������

������������

�� �� �� �� �� �� ��� ���

� 5.01 5.01 5.01 5.01 5.01 5.01 5.01� 2.51 2.51 2.51� 1.67� 1.25 1.26� 0.84 0.88� 0.63�� 0.51�� 0.52

�����������������������Computer Systems: A Programmer’s Perspective�����������������

Page 33: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

���������������

��������+

����������������

������������

�� �� �� �� �� �� ��� ���

� 1.27 1.01 1.01 1.01 1.01 1.01 1.01� 0.81 0.69 0.54� 0.74� 0.69 1.24� 0.56 0.56� 0.54�� 0.54�� 0.56

�����������������������Computer Systems: A Programmer’s Perspective�����������������

Page 34: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�������������������������������������

int + *

double + *

��������� 1.01 3.01 3.01 5.01������������ 1.01 1.51 1.51 2.51

���������� 0.81 1.51 1.51 2.51���������� 0.72 1.07 1.01 1.25

������������ 0.55 1.00 1.01 0.52������������� 1.00 3.00 3.00 5.00

���������������� 0.50 1.00 1.00 0.50

�����������������������Computer Systems: A Programmer’s Perspective�����������������

Page 35: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

��������������������

for (i = 0; i < limit; i += 2) { acc0 = acc0 + data[i]; acc1 = acc1 + data[i+1];}

�������0.81

��

Page 36: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

��������������������

for (i = 0; i < limit; i += 2) { acc0 = acc0 + data[i]; acc1 = acc1 + data[i+1];}

.L3: addl (%rdi,%rax,4), %ecx addl 4(%rdi,%rax,4), %r8d addq $2, %rax cmpq %r9, %rax jl .L3 jmp .L2 ���.L2: finish...

�������0.81

��

Page 37: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

��������������������

for (i = 0; i < limit; i += 2) { acc0 = acc0 + data[i]; acc1 = acc1 + data[i+1];}

.L3: addl (%rdi,%rax,4), %ecx addl 4(%rdi,%rax,4), %r8d addq $2, %rax cmpq %r9, %rax jl .L3 jmp .L2 ���.L2: finish...

�����������������

�������0.81

��

Page 38: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

��������������������

for (i = 0; i < limit; i += 2) { acc0 = acc0 + data[i]; acc1 = acc1 + data[i+1];}

.L3: addl (%rdi,%rax,4), %ecx addl 4(%rdi,%rax,4), %r8d addq $2, %rax cmpq %r9, %rax jl .L3 jmp .L2 ���.L2: finish...

�����������������

�������������������������������������������������������can't�just�waiton a comparison!

�������0.81

��

Page 39: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

Branch prediction������guess�����������������������������������������

� ��������������������������������������������������

� ��������������������������������������������

� ��������������������������������������������������������������������������������������

�����

Page 40: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 0

��

Page 41: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 0

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 2

branch taken

��

Page 42: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 0

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 2

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 4

branch taken

branch taken

���

���������������������������������������

Page 43: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

����������������100��� addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 96

��

Page 44: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

����������������100��� addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 96

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 98

assume branch taken

��

Page 45: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

����������������100��� addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 96

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 98

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 100

assume branch taken(oops!)

assume branch taken

��

Page 46: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

����������������100��� addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 96

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 98

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 100

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl L3 i = 102

assume branch taken(oops!)

assume branch taken(oops!)

assume branch taken

��

Page 47: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

����������������100��� addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 96

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 98

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 100

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl L3 i = 102

assume branch taken(oops!)

assume branch taken(oops!)

assume branch taken

branch not taken

��

Page 48: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

����������������100��� addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 96

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 98

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 100

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl L3 i = 102

assume branch taken(oops!)

assume branch taken(oops!)

assume branch taken

branch not taken

��

Page 49: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

�����������������

����������������100��� addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 96

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 98

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl .L3 i = 100

addl (%rdi,%rax,4), %ecxaddl 4(%rdi,%rax,4), %r8daddq $2, %raxcmpq %r9, %raxjl L3 i = 102

assume branch taken(oops!)

assume branch taken(oops!)

assume branch taken

branch not taken

������������������������������

��

Page 50: Computer Systems: A Programmer’s Perspective long mult_eg(long a, long b, long c) {

����������������������������

��������������������������������������

� ����������������������������call�����ret���������

� ��������������������������������������������������

�����