Parallel Prefix
CSE 332 – Section 8
Slides by James Richie Sulaeman
Parallel Prefix/Suffix
Parallel prefix is a type of programming problem where:
Parallel Pre/suffix
Allows for efficient computation of certain operations on large datasets since it enables multiple threads to work simultaneously on different portions of the data.
Parallel Suffix is just the reversed version of prefix:
Problem 0
Parallel Prefix Sum
Parallel Suffix Sum
cutoff = 1
Problem 0a
range: 1,2
sum:
fromLeft:
range: 0,1
sum:
fromLeft:
range: 0,2
sum:
fromLeft:
input =
range: 3,4
sum:
fromLeft:
range: 2,3
sum:
fromLeft:
range: 2,4
sum:
fromLeft:
range: 0,4
sum:
fromLeft:
range: 5,6
sum:
fromLeft:
range: 4,5
sum:
fromLeft:
range: 4,6
sum:
fromLeft:
range: 7,8
sum:
fromLeft:
range: 6,7
sum:
fromLeft:
range: 6,8
sum:
fromLeft:
range: 4,8
sum:
fromLeft:
range: 0,8
sum:
fromLeft:
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
|
|
|
|
|
|
|
|
output =
Given an array input, output an array such that
output[i] = sum(input[0],...,input[i])
cutoff = 1
range: 1,2
sum:
fromLeft:
range: 0,1
sum:
fromLeft:
range: 0,2
sum:
fromLeft:
input =
range: 3,4
sum:
fromLeft:
range: 2,3
sum:
fromLeft:
range: 2,4
sum:
fromLeft:
range: 0,4
sum:
fromLeft:
range: 5,6
sum:
fromLeft:
range: 4,5
sum:
fromLeft:
range: 4,6
sum:
fromLeft:
range: 7,8
sum:
fromLeft:
range: 6,7
sum:
fromLeft:
range: 6,8
sum:
fromLeft:
range: 4,8
sum:
fromLeft:
range: 0,8
sum:
fromLeft:
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
|
|
|
|
|
|
|
|
output =
leaves[i].sum = input[i]
Given an array input, output an array such that
output[i] = sum(input[0],...,input[i])
range: 1,2
sum: 9
fromLeft:
range: 0,1
sum: 8
fromLeft:
range: 3,4
sum: 3
fromLeft:
range: 2,3
sum: 6
fromLeft:
range: 5,6
sum: 5
fromLeft:
range: 4,5
sum: 2
fromLeft:
range: 7,8
sum: 4
fromLeft:
range: 6,7
sum: 7
fromLeft:
Problem 0a - Fill in sum
cutoff = 1
range: 0,2
sum:
fromLeft:
input =
range: 2,4
sum:
fromLeft:
range: 0,4
sum:
fromLeft:
range: 4,6
sum:
fromLeft:
range: 6,8
sum:
fromLeft:
range: 4,8
sum:
fromLeft:
range: 0,8
sum:
fromLeft:
range: 0,8
sum: 44
fromLeft:
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
|
|
|
|
|
|
|
|
output =
Given an array input, output an array such that
output[i] = sum(input[0],...,input[i])
leaves[i].sum = input[i]
parent.sum = left.sum + right.sum
range: 1,2
sum: 9
fromLeft:
range: 0,1
sum: 8
fromLeft:
range: 3,4
sum: 3
fromLeft:
range: 2,3
sum: 6
fromLeft:
range: 5,6
sum: 5
fromLeft:
range: 4,5
sum: 2
fromLeft:
range: 7,8
sum: 4
fromLeft:
range: 6,7
sum: 7
fromLeft:
range: 0,2
sum: 17
fromLeft:
range: 2,4
sum: 9
fromLeft:
range: 4,6
sum: 7
fromLeft:
range: 6,8
sum: 11
fromLeft:
range: 0,4
sum: 26
fromLeft:
range: 4,8
sum: 18
fromLeft:
Problem 0a - Fill in sum (cont.)
cutoff = 1
input =
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
|
|
|
|
|
|
|
|
output =
Given an array input, output an array such that
output[i] = sum(input[0],...,input[i])
leaves[i].sum = input[i]
parent.sum = left.sum + right.sum
left.fromLeft = parent.fromLeft
right.fromLeft = parent.fromLeft + left.sum
range: 1,2
sum: 9
fromLeft:
range: 0,1
sum: 8
fromLeft:
range: 3,4
sum: 3
fromLeft:
range: 2,3
sum: 6
fromLeft:
range: 5,6
sum: 5
fromLeft:
range: 4,5
sum: 2
fromLeft:
range: 7,8
sum: 4
fromLeft:
range: 6,7
sum: 7
fromLeft:
range: 0,2
sum: 17
fromLeft:
range: 2,4
sum: 9
fromLeft:
range: 4,6
sum: 7
fromLeft:
range: 6,8
sum: 11
fromLeft:
range: 0,4
sum: 26
fromLeft:
range: 4,8
sum: 18
fromLeft:
range: 0,8
sum: 44
fromLeft:
range: 1,2
sum: 9
fromLeft: 8
range: 0,1
sum: 8
fromLeft: 0
range: 3,4
sum: 3
fromLeft: 23
range: 2,3
sum: 6
fromLeft: 17
range: 5,6
sum: 5
fromLeft: 28
range: 4,5
sum: 2
fromLeft: 26
range: 7,8
sum: 4
fromLeft: 40
range: 6,7
sum: 7
fromLeft: 33
range: 0,2
sum: 17
fromLeft: 0
range: 2,4
sum: 9
fromLeft: 17
range: 4,6
sum: 7
fromLeft: 26
range: 6,8
sum: 11
fromLeft: 33
range: 0,4
sum: 26
fromLeft: 0
range: 4,8
sum: 18
fromLeft: 26
range: 0,8
sum: 44
fromLeft: 0
Problem 0a
cutoff = 1
input =
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
|
|
|
|
|
|
|
|
output =
Given an array input, output an array such that
output[i] = sum(input[0],...,input[i])
leaves[i].sum = input[i]
parent.sum = left.sum + right.sum
left.fromLeft = parent.fromLeft
right.fromLeft = parent.fromLeft + left.sum
range: 1,2
sum: 9
fromLeft: 8
range: 0,1
sum: 8
fromLeft: 0
range: 3,4
sum: 3
fromLeft: 23
range: 2,3
sum: 6
fromLeft: 17
range: 5,6
sum: 5
fromLeft: 28
range: 4,5
sum: 2
fromLeft: 26
range: 7,8
sum: 4
fromLeft: 40
range: 6,7
sum: 7
fromLeft: 33
range: 0,2
sum: 17
fromLeft: 0
range: 2,4
sum: 9
fromLeft: 17
range: 4,6
sum: 7
fromLeft: 26
range: 6,8
sum: 11
fromLeft: 33
range: 0,4
sum: 26
fromLeft: 0
range: 4,8
sum: 18
fromLeft: 26
range: 0,8
sum: 44
fromLeft: 0
8 |
17 |
23 |
26 |
28 |
33 |
40 |
44 |
Problem 0a
1. Divide problem into parallel pieces
cutoff = 1
range: 0,2
sum:
fromLeft:
input =
range: 2,4
sum:
fromLeft:
range: 0,4
sum:
fromLeft:
range: 4,6
sum:
fromLeft:
range: 6,8
sum:
fromLeft:
range: 4,8
sum:
fromLeft:
range: 0,8
sum:
fromLeft:
range: 0,8
sum: 44
fromRight:
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
|
|
|
|
|
|
|
|
output =
Given an array input, output an array such that
output[i] = sum(input[i],...,input[input.length-1])
2. Find sum at cutoff
leaves[i].sum = input[i]
3. Propagate sum up
parent.sum = left.sum + right.sum
range: 1,2
sum: 9
fromRight:
range: 0,1
sum: 8
fromRight:
range: 3,4
sum: 3
fromRight:
range: 2,3
sum: 6
fromRight:
range: 5,6
sum: 5
fromRight:
range: 4,5
sum: 2
fromRight:
range: 7,8
sum: 4
fromRight:
range: 6,7
sum: 7
fromRight:
range: 0,2
sum: 17
fromRight:
range: 2,4
sum: 9
fromRight:
range: 4,6
sum: 7
fromRight:
range: 6,8
sum: 11
fromRight:
range: 0,4
sum: 26
fromRight:
range: 4,8
sum: 18
fromRight:
Problem 0b
Same steps to calculate sum
input =
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
|
|
|
|
|
|
|
|
output =
right.fromRight = parent.fromRight
left.fromRight = parent.fromRight + right.sum
range: 1,2
sum: 9
fromRight:
range: 0,1
sum: 8
fromRight:
range: 3,4
sum: 3
fromRight:
range: 2,3
sum: 6
fromRight:
range: 5,6
sum: 5
fromRight:
range: 4,5
sum: 2
fromRight:
range: 7,8
sum: 4
fromRight:
range: 6,7
sum: 7
fromRight:
range: 0,2
sum: 17
fromRight:
range: 2,4
sum: 9
fromRight:
range: 4,6
sum: 7
fromRight:
range: 6,8
sum: 11
fromRight:
range: 0,4
sum: 26
fromRight:
range: 4,8
sum: 18
fromRight:
range: 0,8
sum: 44
fromRight:
range: 1,2
sum: 9
fromRight: 27
range: 0,1
sum: 8
fromRight: 36
range: 3,4
sum: 3
fromRight: 18
range: 2,3
sum: 6
fromRight: 21
range: 5,6
sum: 5
fromRight: 11
range: 4,5
sum: 2
fromRight: 16
range: 7,8
sum: 4
fromRight: 0
range: 6,7
sum: 7
fromRight: 4
range: 0,2
sum: 17
fromRight: 27
range: 2,4
sum: 9
fromRight: 18
range: 4,6
sum: 7
fromRight: 11
range: 6,8
sum: 11
fromRight: 0
range: 0,4
sum: 26
fromRight: 18
range: 4,8
sum: 18
fromRight: 0
range: 0,8
sum: 44
fromRight: 0
Problem 0b
1. Divide problem into parallel pieces
cutoff = 1
2. Find sum at cutoff
leaves[i].sum = input[i]
3. Propagate sum up
parent.sum = left.sum + right.sum
Same steps to calculate sum
Given an array input, output an array such that
output[i] = sum(input[i],...,input[input.length-1])
range: 0,8
sum: 44
fromRight:
input =
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
|
|
|
|
|
|
|
|
output =
5. output[i] = leaves[i].fromRight + input[i]
44 |
36 |
27 |
21 |
18 |
16 |
11 |
4 |
Problem 0b
range: 1,2
sum: 9
fromRight:
range: 0,1
sum: 8
fromRight:
range: 3,4
sum: 3
fromRight:
range: 2,3
sum: 6
fromRight:
range: 5,6
sum: 5
fromRight:
range: 4,5
sum: 2
fromRight:
range: 7,8
sum: 4
fromRight:
range: 6,7
sum: 7
fromRight:
range: 0,2
sum: 17
fromRight:
range: 2,4
sum: 9
fromRight:
range: 4,6
sum: 7
fromRight:
range: 6,8
sum: 11
fromRight:
range: 0,4
sum: 26
fromRight:
range: 4,8
sum: 18
fromRight:
range: 1,2
sum: 9
fromRight: 27
range: 0,1
sum: 8
fromRight: 36
range: 3,4
sum: 3
fromRight: 18
range: 2,3
sum: 6
fromRight: 21
range: 5,6
sum: 5
fromRight: 11
range: 4,5
sum: 2
fromRight: 16
range: 7,8
sum: 4
fromRight: 0
range: 6,7
sum: 7
fromRight: 4
range: 0,2
sum: 17
fromRight: 27
range: 2,4
sum: 9
fromRight: 18
range: 4,6
sum: 7
fromRight: 11
range: 6,8
sum: 11
fromRight: 0
range: 0,4
sum: 26
fromRight: 18
range: 4,8
sum: 18
fromRight: 0
range: 0,8
sum: 44
fromRight: 0
right.fromRight = parent.fromRight
left.fromRight = parent.fromRight + right.sum
1. Divide problem into parallel pieces
cutoff = 1
2. Find sum at cutoff
leaves[i].sum = input[i]
3. Propagate sum up
parent.sum = left.sum + right.sum
Same steps to calculate sum
Given an array input, output an array such that
output[i] = sum(input[i],...,input[input.length-1])
Problem 1
Parallel Prefix FindMin
cutoff = 1
Problem 1
range: 1,2
min:
fromLeft:
range: 0,1
min:
fromLeft:
range: 0,2
min:
fromLeft:
input =
range: 3,4
min:
fromLeft:
range: 2,3
min:
fromLeft:
range: 2,4
min:
fromLeft:
range: 0,4
min:
fromLeft:
range: 5,6
min:
fromLeft:
range: 4,5
min:
fromLeft:
range: 4,6
min:
fromLeft:
range: 7,8
min:
fromLeft:
range: 6,7
min:
fromLeft:
range: 6,8
min:
fromLeft:
range: 4,8
min:
fromLeft:
range: 0,8
min:
fromLeft:
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
|
|
|
|
|
|
|
|
output =
Given an array input, output an array such that
output[i] = min(input[0],...,input[i])
range: 1,2
min:
fromLeft:
range: 0,1
min:
fromLeft:
range: 0,2
min:
fromLeft:
input =
range: 3,4
min:
fromLeft:
range: 2,3
min:
fromLeft:
range: 2,4
min:
fromLeft:
range: 0,4
min:
fromLeft:
range: 5,6
min:
fromLeft:
range: 4,5
min:
fromLeft:
range: 4,6
min:
fromLeft:
range: 7,8
min:
fromLeft:
range: 6,7
min:
fromLeft:
range: 6,8
min:
fromLeft:
range: 4,8
min:
fromLeft:
range: 0,8
min:
fromLeft:
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
|
|
|
|
|
|
|
|
output =
range: 1,2
min: 9
fromLeft:
range: 0,1
min: 8
fromLeft:
range: 3,4
min: 3
fromLeft:
range: 2,3
min: 6
fromLeft:
range: 5,6
min: 5
fromLeft:
range: 4,5
min: 2
fromLeft:
range: 7,8
min: 4
fromLeft:
range: 6,7
min: 7
fromLeft:
Problem 1
Given an array input, output an array such that
output[i] = min(input[0],...,input[i])
cutoff = 1
leaves[i].min = input[i]
range: 0,2
min:
fromLeft:
input =
range: 2,4
min:
fromLeft:
range: 0,4
min:
fromLeft:
range: 4,6
min:
fromLeft:
range: 6,8
min:
fromLeft:
range: 4,8
min:
fromLeft:
range: 0,8
min:
fromLeft:
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
|
|
|
|
|
|
|
|
output =
range: 1,2
min: 9
fromLeft:
range: 0,1
min: 8
fromLeft:
range: 3,4
min: 3
fromLeft:
range: 2,3
min: 6
fromLeft:
range: 5,6
min: 5
fromLeft:
range: 4,5
min: 2
fromLeft:
range: 7,8
min: 4
fromLeft:
range: 6,7
min: 7
fromLeft:
range: 0,2
min: 8
fromLeft:
range: 2,4
min: 3
fromLeft:
range: 4,6
min: 2
fromLeft:
range: 6,8
min: 4
fromLeft:
range: 0,4
min: 3
fromLeft:
range: 4,8
min: 2
fromLeft:
range: 0,8
min: 2
fromLeft:
Problem 1
Given an array input, output an array such that
output[i] = min(input[0],...,input[i])
cutoff = 1
leaves[i].min = input[i]
parent.min = min(left.min, right.min)
range: 0,8
min: 2
fromLeft:
range: 0,4
min: 3
fromLeft:
range: 4,8
min: 2
fromLeft:
range: 6,8
min: 4
fromLeft:
cutoff = 1
input =
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
output =
leaves[i].min = input[i]
parent.min = min(left.min, right.min)
left.fromLeft = parent.fromLeft
right.fromLeft = min(parent.fromLeft, left.min)
Problem 1
Given an array input, output an array such that
output[i] = min(input[0],...,input[i])
range: 0,2
min: 8
fromLeft:
range: 2,4
min: 3
fromLeft:
range: 0,1
min: 8
fromLeft:
range: 4,6
min: 2
fromLeft:
range: 1,2
min: 9
fromLeft:
range: 3,4
min: 3
fromLeft:
range: 2,3
min: 6
fromLeft:
range: 5,6
min: 5
fromLeft:
range: 4,5
min: 2
fromLeft:
range: 7,8
min: 4
fromLeft:
range: 6,7
min: 7
fromLeft:
range: 0,8
min: 2
fromLeft: ∞
range: 0,4
min: 3
fromLeft: ∞
range: 4,8
min: 2
fromLeft: 3
range: 6,8
min: 4
fromLeft: 2
range: 0,2
min: 8
fromLeft: ∞
range: 2,4
min: 3
fromLeft: 8
range: 0,1
min: 8
fromLeft: ∞
range: 4,6
min: 2
fromLeft: 3
range: 1,2
min: 9
fromLeft: 8
range: 3,4
min: 3
fromLeft: 6
range: 2,3
min: 6
fromLeft: 8
range: 5,6
min: 5
fromLeft: 2
range: 4,5
min: 2
fromLeft: 3
range: 7,8
min: 4
fromLeft: 2
range: 6,7
min: 7
fromLeft: 2
|
|
|
|
|
|
|
|
cutoff = 1
input =
8 |
9 |
6 |
3 |
2 |
5 |
7 |
4 |
|
|
|
|
|
|
|
|
output =
leaves[i].min = input[i]
parent.min = min(left.min, right.min)
left.fromLeft = parent.fromLeft
right.fromLeft = min(parent.fromLeft, left.min)
8 |
8 |
6 |
3 |
2 |
2 |
2 |
2 |
Problem 1
Given an array input, output an array such that
output[i] = min(input[0],...,input[i])
range: 0,8
min: 2
fromLeft: ∞
range: 0,4
min: 3
fromLeft: ∞
range: 4,8
min: 2
fromLeft: 3
range: 6,8
min: 4
fromLeft: 2
range: 0,2
min: 8
fromLeft: ∞
range: 2,4
min: 3
fromLeft: 8
range: 0,1
min: 8
fromLeft: ∞
range: 4,6
min: 2
fromLeft: 3
range: 1,2
min: 9
fromLeft: 8
range: 3,4
min: 3
fromLeft: 6
range: 2,3
min: 6
fromLeft: 8
range: 5,6
min: 5
fromLeft: 2
range: 4,5
min: 2
fromLeft: 3
range: 7,8
min: 4
fromLeft: 2
range: 6,7
min: 7
fromLeft: 2
Problem 2
Parallel Pack
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Problem 2 Overview
Given an array input, output an array that contains only the elements that are less than 10
12 |
5 |
-8 |
34 |
6 |
10 |
2 |
7 |
input =
bits =
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
bitsum =
0 |
1 |
2 |
2 |
3 |
3 |
4 |
5 |
output =
5 |
-8 |
6 |
2 |
7 |
Problem 2
input =
12 |
5 |
-8 |
34 |
6 |
10 |
2 |
7 |
|
|
|
|
|
|
|
|
bits =
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
lo: 0
hi: 8
lo: 0
hi: 4
lo: 4
hi: 8
lo: 6
hi: 8
lo: 0
hi: 2
lo: 2
hi: 4
lo: 0
hi: 1
lo: 4
hi: 6
lo: 1
hi: 2
lo: 3
hi: 4
lo: 2
hi: 3
lo: 5
hi: 6
lo: 4
hi: 5
lo: 7
hi: 8
lo: 6
hi: 7
cutoff = 1
range: 1,2
sum:
fromLeft:
range: 0,1
sum:
fromLeft:
range: 0,2
sum:
fromLeft:
bits =
range: 3,4
sum:
fromLeft:
range: 2,3
sum:
fromLeft:
range: 2,4
sum:
fromLeft:
range: 0,4
sum:
fromLeft:
range: 5,6
sum:
fromLeft:
range: 4,5
sum:
fromLeft:
range: 4,6
sum:
fromLeft:
range: 7,8
sum:
fromLeft:
range: 6,7
sum:
fromLeft:
range: 6,8
sum:
fromLeft:
range: 4,8
sum:
fromLeft:
range: 0,8
sum:
fromLeft:
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
|
|
|
|
|
|
|
|
bitsum =
to compute bitsum array
Problem 2
cutoff = 1
range: 1,2
sum:
fromLeft:
range: 0,1
sum:
fromLeft:
range: 0,2
sum:
fromLeft:
range: 3,4
sum:
fromLeft:
range: 2,3
sum:
fromLeft:
range: 2,4
sum:
fromLeft:
range: 0,4
sum:
fromLeft:
range: 5,6
sum:
fromLeft:
range: 4,5
sum:
fromLeft:
range: 4,6
sum:
fromLeft:
range: 7,8
sum:
fromLeft:
range: 6,7
sum:
fromLeft:
range: 6,8
sum:
fromLeft:
range: 4,8
sum:
fromLeft:
range: 0,8
sum:
fromLeft:
|
|
|
|
|
|
|
|
leaves[i].sum = bits[i]
range: 1,2
sum: 1
fromLeft:
range: 0,1
sum: 0
fromLeft:
range: 3,4
sum: 0
fromLeft:
range: 2,3
sum: 1
fromLeft:
range: 5,6
sum: 0
fromLeft:
range: 4,5
sum: 1
fromLeft:
range: 7,8
sum: 1
fromLeft:
range: 6,7
sum: 1
fromLeft:
to compute bitsum array
bits =
bitsum =
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
Problem 2
cutoff = 1
range: 0,2
sum:
fromLeft:
range: 2,4
sum:
fromLeft:
range: 0,4
sum:
fromLeft:
range: 4,6
sum:
fromLeft:
range: 6,8
sum:
fromLeft:
range: 4,8
sum:
fromLeft:
range: 0,8
sum:
fromLeft:
|
|
|
|
|
|
|
|
leaves[i].sum = bits[i]
parent.sum = left.sum + right.sum
range: 1,2
sum: 1
fromLeft:
range: 0,1
sum: 0
fromLeft:
range: 3,4
sum: 0
fromLeft:
range: 2,3
sum: 1
fromLeft:
range: 5,6
sum: 0
fromLeft:
range: 4,5
sum: 1
fromLeft:
range: 7,8
sum: 1
fromLeft:
range: 6,7
sum: 1
fromLeft:
range: 0,2
sum: 1
fromLeft:
range: 2,4
sum: 1
fromLeft:
range: 4,6
sum: 1
fromLeft:
range: 6,8
sum: 2
fromLeft:
range: 0,4
sum: 2
fromLeft:
range: 4,8
sum: 3
fromLeft:
range: 0,8
sum: 5
fromLeft:
to compute bitsum array
bits =
bitsum =
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
Problem 2
range: 0,1
sum: 0
fromLeft:
range: 0,2
sum: 1
fromLeft:
range: 1,2
sum: 1
fromLeft:
range: 2,3
sum: 1
fromLeft:
range: 2,4
sum: 1
fromLeft:
range: 3,4
sum: 0
fromLeft:
range: 4,5
sum: 1
fromLeft:
range: 5,6
sum: 0
fromLeft:
range: 6,7
sum: 1
fromLeft:
range: 7,8
sum: 1
fromLeft:
range: 6,8
sum: 2
fromLeft:
range: 4,6
sum: 1
fromLeft:
range: 4,8
sum: 3
fromLeft:
range: 0,4
sum: 2
fromLeft:
range: 0,8
sum: 5
fromLeft:
range: 7,8
sum: 1
fromLeft: 4
range: 6,7
sum: 1
fromLeft: 3
range: 5,6
sum: 0
fromLeft: 3
range: 4,5
sum: 1
fromLeft: 2
range: 3,4
sum: 0
fromLeft: 2
range: 2,3
sum: 1
fromLeft: 1
range: 1,2
sum: 1
fromLeft: 0
range: 0,1
sum: 0
fromLeft: 0
range: 0,2
sum: 1
fromLeft: 0
range: 2,4
sum: 1
fromLeft: 1
range: 4,6
sum: 1
fromLeft: 2
range: 6,8
sum: 2
fromLeft: 3
range: 4,8
sum: 3
fromLeft: 2
range: 0,4
sum: 2
fromLeft: 0
range: 0,8
sum: 5
fromLeft: 0
cutoff = 1
|
|
|
|
|
|
|
|
leaves[i].sum = bits[i]
parent.sum = left.sum + right.sum
left.fromLeft = parent.fromLeft
right.fromLeft = parent.fromLeft + left.sum
to compute bitsum array
bits =
bitsum =
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
Problem 2
range: 0,8
sum: 5
fromLeft: 0
range: 0,4
sum: 2
fromLeft: 0
range: 4,8
sum: 3
fromLeft: 2
range: 6,8
sum: 2
fromLeft: 3
range: 4,6
sum: 1
fromLeft: 2
range: 2,4
sum: 1
fromLeft: 1
range: 0,2
sum: 1
fromLeft: 0
range: 7,8
sum: 1
fromLeft: 4
range: 6,7
sum: 1
fromLeft: 3
range: 5,6
sum: 0
fromLeft: 3
range: 4,5
sum: 1
fromLeft: 2
range: 3,4
sum: 0
fromLeft: 2
range: 2,3
sum: 1
fromLeft: 1
range: 1,2
sum: 1
fromLeft: 0
range: 0,1
sum: 0
fromLeft: 0
cutoff = 1
|
|
|
|
|
|
|
|
leaves[i].sum = bits[i]
parent.sum = left.sum + right.sum
left.fromLeft = parent.fromLeft
right.fromLeft = parent.fromLeft + left.sum
0 |
1 |
2 |
2 |
3 |
3 |
4 |
5 |
to compute bitsum array
bits =
bitsum =
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
Problem 2
Problem 2
input =
12 |
5 |
-8 |
34 |
6 |
10 |
2 |
7 |
lo: 0
hi: 1
|
|
|
|
|
|
|
|
0 |
1 |
2 |
2 |
3 |
3 |
4 |
5 |
bits =
bitsum =
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
output =
|
|
|
|
|
lo: 1
hi: 2
lo: 2
hi: 3
lo: 3
hi: 4
lo: 4
hi: 5
lo: 5
hi: 6
lo: 6
hi: 7
lo: 7
hi: 8
lo: 0
hi: 2
lo: 6
hi: 8
lo: 2
hi: 4
lo: 4
hi: 6
lo: 0
hi: 4
lo: 4
hi: 8
lo: 0
hi: 8
5 |
-8 |
6 |
2 |
7 |
Problem 3
Work is the runtime of a program on one processor.
Span is the runtime of a program on infinitely many processors.
Work is the sum of all the work done by all processors
Span is the sum of all the work done by the longest dependence chain / parallel ‘tree’ branch
Neither. Work is defined for one processor and span is defined for infinitely many processors. Adding more processors will not affect either work or span.
Problem 3
Problem 3
T3
work: 2
T2
work: 2
T4
work: 2
T1
work: 1
T6
work: 1
T5
work: 4
T7
work: 1
Work = 1 + 2 + 2 + 2 + 4 + 1 + 1
= 13
Span ( T1→T2→T5 ) = 1 + 2 + 4
= 7
Amdahl’s Law Review
e) Suppose a program needs to do 20% of its work sequentially (the rest can be parallelized), what is the maximum speed up with 4 processors? What about 8?
Problem 3
Recall Amdahl’s Law:
e) Suppose a program needs to do 20% of its work sequentially (the rest can be parallelized).
Problem 3
Recall Amdahl’s Law:
Observe: we got way more parallelism from the first 4 processors (2.5) than the second 4 (0.833).
Takeaway: we get diminishing returns from additional processors
With 8 processors?
What is the maximum speed up with 4 processors?
Thank You!