CS 140 : Numerical Examples on Shared Memory with Cilk PowerPoint PPT Presentation

presentation player overlay
1 / 25
About This Presentation
Transcript and Presenter's Notes

Title: CS 140 : Numerical Examples on Shared Memory with Cilk


1
CS 140 Numerical Examples on Shared Memory
with Cilk
  • Matrix-matrix multiplication
  • Matrix-vector multiplication

Thanks to Charles E. Leiserson for some of these
slides
2
Work and Span (Recap)
TP execution time on P processors
T1 work
T8 span
  • Speedup on p processors
  • T1/Tp
  • Parallelism
  • T1/T8

Also called critical-path length or
computational depth.
3
Cilk Loops Divide and Conquer
cilk_for (int i0 iltn i) AiBi
Vector addition
Implementation
G
Work T1 T(n)
Work T1
Span T8
Span T8 T(lg n)
grain size
Parallelism T1/T8 T(n/lg n)
Parallelism T1/T8
Assume that G T(1).
4
Square-Matrix Multiplication


C
A
B
Assume for simplicity that n 2k.
5
Parallelizing Matrix Multiply
T(n3)
Work T1
Span T8
T(n)
T(n2)
Parallelism T1/T8
For 1000 1000 matrices, parallelism (103)2
106.
6
Recursive Matrix Multiplication
Divide and conquer




8 multiplications of n/2 n/2 matrices. 1
addition of n n matrices.
7
DC Matrix Multiplication
template lttypename Tgt void MMult(T C, T A, T
B, int n) T D new Tnn //base case
partition matrices cilk_spawn MMult(C11, A11,
B11, n/2) cilk_spawn MMult(C12, A11, B12,
n/2) cilk_spawn MMult(C22, A21, B12, n/2)
cilk_spawn MMult(C21, A21, B11, n/2)
cilk_spawn MMult(D11, A12, B21, n/2)
cilk_spawn MMult(D12, A12, B22, n/2)
cilk_spawn MMult(D22, A22, B22, n/2)
MMult(D21, A22, B21, n/2) cilk_sync
MAdd(C, D, n) // C D
Row/column length of matrices
Coarsen for efficiency
Determine submatrices by index calculation
8
Matrix Addition
template lttypename Tgt void MMult(T C, T A, T
B, int n) T D new Tnn //base case
partition matrices cilk_spawn MMult(C11, A11,
B11, n/2) cilk_spawn MMult(C12, A11, B12,
n/2) cilk_spawn MMult(C22, A21, B12, n/2)
cilk_spawn MMult(C21, A21, B11, n/2)
cilk_spawn MMult(D11, A12, B21, n/2)
cilk_spawn MMult(D12, A12, B22, n/2)
cilk_spawn MMult(D22, A22, B22, n/2)
MMult(D21, A22, B21, n/2) cilk_sync
MAdd(C, D, n) // C D
template lttypename Tgt void MAdd(T C, T D, int
n) cilk_for (int i0 iltn i)
cilk_for (int j0 jltn j) Cnij
Dnij
9
Analysis of Matrix Addition
template lttypename Tgt void MAdd(T C, T D, int
n) cilk_for (int i0 iltn i)
cilk_for (int j0 jltn j) Cnij
Dnij
Work A1(n)
T(n2)
Span A8(n)
T(lg n)
Nested cilk_for statements have the same T(lg n)
span
10
Work of Matrix Multiplication
template lttypename Tgt void MMult(T C, T A, T
B, int n) T D new T nn //base case
partition matrices cilk_spawn MMult(C11, A11,
B11, n/2) cilk_spawn MMult(C12, A11, B12,
n/2) ? cilk_spawn MMult(D22, A22, B22,
n/2) MMult(D21, A22, B21, n/2)
cilk_sync MAdd(C, D, n) // C D
CASE 1 nlogba nlog28 n3 f(n) T(n2)
8M1(n/2) A1(n) T(1)
Work M1(n)
8M1(n/2) T(n2)
T(n3)
11
Span of Matrix Multiplication
template lttypename Tgt void MMult(T C, T A, T
B, int n) T D new T nn //base case
partition matrices cilk_spawn MMult(C11, A11,
B11, n/2) cilk_spawn MMult(C12, A11, B12,
n/2) ? cilk_spawn MMult(D22, A22, B22,
n/2) MMult(D21, A22, B21, n/2)
cilk_sync MAdd(C, D, n, size) // C D
maximum
CASE 2 nlogba nlog21 1 f(n) T(nlogba lg1n)
M8(n/2) A8(n) T(1)
Span M8(n)
M8(n/2) T(lg n)
T(lg2n)
12
Parallelism of Matrix Multiply
For 1000 1000 matrices, parallelism
(103)3/102 107.
13
Stack Temporaries
template lttypename Tgt void MMult(T C, T A, T
B, int n) //base case partition
matrices cilk_spawn MMult(C11, A11, B11, n/2)
cilk_spawn MMult(C12, A11, B12, n/2)
cilk_spawn MMult(C22, A21, B12, n/2)
cilk_spawn MMult(C21, A21, B11, n/2)
cilk_spawn MMult(D11, A12, B21, n/2)
cilk_spawn MMult(D12, A12, B22, n/2)
cilk_spawn MMult(D22, A22, B22, n/2)
MMult(D21, A22, B21, n/2) cilk_sync
MAdd(C, D, n) // C D
T D new T nn
Idea Since minimizing storage tends to yield
higher performance, trade off parallelism for
less storage.
14
No-Temp Matrix Multiplication
// C AB template lttypename Tgt void MMult2(T
C, T A, T B, int n) //base case
partition matrices cilk_spawn MMult2(C11, A11,
B11, n/2) cilk_spawn MMult2(C12, A11, B12,
n/2) cilk_spawn MMult2(C22, A21, B12, n/2)
MMult2(C21, A21, B11, n/2)
cilk_sync cilk_spawn MMult2(C11, A12, B21,
n/2) cilk_spawn MMult2(C12, A12, B22, n/2)
cilk_spawn MMult2(C22, A22, B22, n/2)
MMult2(C21, A22, B21, n/2) cilk_sync
Saves space, but at what expense?
15
Work of No-Temp Multiply
// C AB template lttypename Tgt void MMult2(T
C, T A, T B, int n) //base case
partition matrices cilk_spawn MMult2(C11, A11,
B11, n/2) cilk_spawn MMult2(C12, A11, B12,
n/2) cilk_spawn MMult2(C22, A21, B12, n/2)
MMult2(C21, A21, B11, n/2)
cilk_sync cilk_spawn MMult2(C11, A12, B21,
n/2) cilk_spawn MMult2(C12, A12, B22, n/2)
cilk_spawn MMult2(C22, A22, B22, n/2)
MMult2(C21, A22, B21, n/2) cilk_sync
CASE 1 nlogba nlog28 n3 f(n) T(1)
8M1(n/2) T(1)
Work M1(n)
T(n3)
16
Span of No-Temp Multiply
// C AB template lttypename Tgt void MMult2(T
C, T A, T B, int n) //base case
partition matrices cilk_spawn MMult2(C11, A11,
B11, n/2) cilk_spawn MMult2(C12, A11, B12,
n/2) cilk_spawn MMult2(C22, A21, B12, n/2)
MMult2(C21, A21, B11, n/2)
cilk_sync cilk_spawn MMult2(C11, A12, B21,
n/2) cilk_spawn MMult2(C12, A12, B22, n/2)
cilk_spawn MMult2(C22, A22, B22, n/2)
MMult2(C21, A22, B21, n/2) cilk_sync
max
CASE 1 nlogba nlog22 n f(n) T(1)
max
2M8(n/2) T(1)
Span M8(n)
T(n)
17
Parallelism of No-Temp Multiply
For 1000 1000 matrices, parallelism (103)2
106.
Faster in practice!
18
How general that was?
  • Matrices are often rectangular
  • Even when they are square, the dimensions are
    hardly a power of two

n
k
A
C
B
k


m
Which dimension to split?
19
General Matrix Multiplication
template lttypename Tgt void MMult3(T A, T B, T
C, int i0, int i1, int j0, int j1, int k0, int
k1) int di i1 - i0 int dj j1 - j0
int dk k1 - k0 if (di gt dj di gt dk
di gt THRESHOLD)    int mi i0 di / 2
   MMult3 (A, B, C, i0, mi, j0, j1, k0, k1)
   MMult3 (A, B, C, mi, i1, j0, j1, k0, k1)
else if (dj gt dk dj gt THRESHOLD)  
int mj j0 dj / 2   MMult3 (A, B, C, i0,
i1, j0, mj, k0, k1)   MMult3 (A, B, C, i0, i1,
mj, j1, k0, k1) else if (dk gt THRESHOLD)
  int mk k0 dk / 2   MMult3 (A, B, C,
i0, i1, j0, j1, k0, mk)   MMult3 (A, B, C, i0,
i1, j0, j1, mk, k1) else // Iterative
(triple-nested loop) multiply
Split m if it is the largest
Split n if it is the largest
Split k if it is the largest
for (int i i0 i lt i1 i)    for (int j
j0 j lt j1 j)      for (int k k0 k lt k1
k)      Cij Aik Bkj
20
Parallelizing General MMult
template lttypename Tgt void MMult3(T A, T B, T
C, int i0, int i1, int j0, int j1, int k0, int
k1) int di i1 - i0 int dj j1 - j0
int dk k1 - k0 if (di gt dj di gt dk
di gt THRESHOLD)    int mi i0 di / 2
   cilk_spawn MMult3 (A, B, C, i0, mi, j0, j1,
k0, k1)    MMult3 (A, B, C, mi, i1, j0, j1,
k0, k1) else if (dj gt dk dj gt
THRESHOLD)   int mj j0 dj / 2  
cilk_spawn MMult3 (A, B, C, i0, i1, j0, mj, k0,
k1)   MMult3 (A, B, C, i0, i1, mj, j1, k0, k1)
else if (dk gt THRESHOLD)   int mk
k0 dk / 2   MMult3 (A, B, C, i0, i1, j0, j1,
k0, mk)   MMult3 (A, B, C, i0, i1, j0, j1, mk,
k1) else // Iterative (triple-nested
loop) multiply
Unsafe to spawn here unless we use a temporary !
for (int i i0 i lt i1 i)    for (int j
j0 j lt j1 j)      for (int k k0 k lt k1
k)      Cij Aik Bkj
21
Split m
  • No races, safe to spawn !

n
k
A
C
B
k


m
22
Split n
  • No races, safe to spawn !

n
k
A
B
C
k


m
23
Split k
  • Data races, unsafe to spawn !

n
k
A
B
C
k


m
24
Matrix-Vector Multiplication


y
A
x
Let each worker handle a single row !
25
Matrix-Vector Multiplication
template lttypename Tgt void MatVec (T A, T x, T
y, int m, int n) for(int i0 iltm i)
for(int j0 jltn j) yi Aij
xj
Parallelize
template lttypename Tgt void MatVec (T A, T x, T
y, int m, int n) cilk_for (int i0 iltm
i) for(int j0 jltn j) yi Aij
xj
Write a Comment
User Comments (0)
About PowerShow.com