Freeing Programmers from the Shackles of Sequentiality
Thesis Proposal Talk Sven Stork
Committee Jonathan Aldrich (CMU) Todd Mowry (CMU) William Scherlis (CMU) Paulo Marques (UC) Ernesto Costa (UC) Marco Viera (UC)
1
Freeing Programmers from the Shackles of Sequentiality Thesis - - PowerPoint PPT Presentation
Freeing Programmers from the Shackles of Sequentiality Thesis Proposal Talk Sven Stork Committee Jonathan Aldrich (CMU) Paulo Marques (UC) Todd Mowry (CMU) Ernesto Costa (UC) William Scherlis (CMU) Marco Viera (UC) 1 2 2 2 2 2 How
Thesis Proposal Talk Sven Stork
Committee Jonathan Aldrich (CMU) Todd Mowry (CMU) William Scherlis (CMU) Paulo Marques (UC) Ernesto Costa (UC) Marco Viera (UC)
1
2
2
2
2
2
3
4
affected
5
6
7
8
9
parallel programming abstractions
10
11
11
12
13
14
15
16 Plaid Runtime JVM AEminium + Plaid Compiler
17 Plaid Runtime JVM ÆMINIUM + Plaid Compiler
ÆMINIUM +
18 Plaid Runtime JVM Plaid Compiler
ÆMINIUM Runtime
19
20
21
22
1 N RW unique shared R immutable immutable
23
23
23
23
23
23
23
unique immutable immutable
synchronization
Object
shared shared
24
shared shared unique immutable immutable
synchronization
Object
25
immutable immutable
shared shared unique immutable immutable
synchronization
Object
26
immutable immutable
shared shared unique immutable immutable
synchronization
Object
27
immutable immutable
unique immutable immutable
synchronization
Object
shared shared
28
immutable immutable unique shared
synchronization
Object
shared
29
unique immutable immutable
synchronization
Object
shared shared
30
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } amount:
public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from:
immutable
amount:
immutable 31
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } amount:
public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from:
immutable
amount:
immutable 31
Syntax: permission [>> permission] type var
BORROW: unique Account from unique >> unique Account from CHANGE: unique >> immutable Account account
amount:
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from:
immutable
amount:
immutable 32
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from:
immutable
amount:
33
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from:
immutable
amount:
34
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from:
immutable
amount:
immutable 35
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from: amount:
immutable 36
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from:
immutable
amount:
37
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from:
immutable
amount:
38
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from: amount:
immutable 39
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from: amount:
immutable 40
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from:
immutable
amount:
41
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique
// to:
unique
from:
immutable
amount:
42
// to: from: amount:
public void transfer(unique Account from, unique Account to, immutable Amount amount) { withdraw(from, amount); deposit(to, amount); } public void deposit(unique Account account, immutable Amount amount) {...} public void withdraw(unique Account account, immutable Amount amount){...}
unique unique immutable
amount:
immutable 43
44
transfer(unique Account from, unique Account to, immutable Amount amount)
unique unique immutable immutable
from: to: amount:
45
immutable
transfer(unique Account from, unique Account to, immutable Amount amount)
unique unique immutable
from: to: amount:
46
immutable
transfer(unique Account from, unique Account to, immutable Amount amount)
unique unique immutable
from: to: amount: deposit(to, amount)
47
withdraw(from, amount)
immutable immutable
transfer(unique Account from, unique Account to, immutable Amount amount)
unique unique
from: to: amount:
split
withdraw(from, amount) deposit(to, amount) amount:
48
immutable
transfer(unique Account from, unique Account to, immutable Amount amount)
unique unique immutable
from: to: amount:
split
withdraw(from, amount) deposit(to, amount) amount:
49
immutable
transfer(unique Account from, unique Account to, immutable Amount amount)
unique unique immutable
from: to: amount:
split
withdraw(from, amount) deposit(to, amount) amount:
50
immutable
transfer(unique Account from, unique Account to, immutable Amount amount)
unique unique immutable
from: to: amount:
split
withdraw(from, amount) deposit(to, amount) amount:
51
immutable
transfer(unique Account from, unique Account to, immutable Amount amount)
unique unique immutable
from: to: amount:
split
withdraw(from, amount) deposit(to, amount) amount:
52
immutable
transfer(unique Account from, unique Account to, immutable Amount amount)
unique unique immutable
from: to: amount:
split
withdraw(from, amount) deposit(to, amount) amount:
53
join
}
immutable
transfer(unique Account from, unique Account to, immutable Amount amount)
unique unique immutable
from: to: amount:
split
withdraw(from, amount) deposit(to, amount) amount:
54
join
}
immutable
transfer(unique Account from, unique Account to, immutable Amount amount)
unique unique immutable
from: to: amount:
split
withdraw(from, amount) deposit(to, amount) amount:
55
join
}
amount:
immutable
transfer(unique Account from, unique Account to, immutable Amount amount)
immutable unique unique
from: to: amount:
split
withdraw(from, amount) deposit(to, amount)
56
join
}
57
matters
synchronization
unavoidable
58
58
58
58
59
59
permissions
60
shared shared exclusive
synchronization
61
protected exclusive shared shared
synchronization
62
split
shared protected exclusive shared
63
atomic
protected exclusive shared shared
synchronization
64
split
shared shared exclusive
synchronization
65
66
class DLLItem { public Object data; public DLLItem prev; public DLLItem next; } public class DLL { private DLLItem head; public void add(Object data) { DLLItem li = new DLLItem(); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } }
I1
DLL
I2 I3
O1 O2 O3
67
class DLLItem { public Object data; public DLLItem prev; public DLLItem next; } public class DLL { private DLLItem head; public void add( Object data) { DLLItem li = new DLLItem(); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } }
I1
DLL
I2 l3
O1 O2 O3
68
class DLLItem { public Object data; public shared DLLItem prev; public shared DLLItem next; } public class DLL { private shared DLLItem head; public void add( Object data) { shared DLLItem li = new DLLItem(); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } }
I1
DLL
l2 l3
O1 O2 O3
69
class DLLItem { public unique Object data; public shared DLLItem prev; public shared DLLItem next; } public class DLL { private shared DLLItem head; public void add(unique >> none Object data) { shared DLLItem li = new DLLItem(); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } }
I1
DLL
l2 l3
O1 O2 O3
70
class DLLItem { public unique Object data; public shared DLLItem prev; public shared DLLItem next; } public class DLL { private shared DLLItem head; public void add(unique >> none Object data) : unique { shared DLLItem li = new DLLItem(); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } }
I1
DLL
l2 l3
O1 O2 O3
71
class DLLItem { public unique Object data; public shared DLLItem prev; public shared DLLItem next; } public class DLL { private shared DLLItem head; public void add(unique >> none Object data) : unique { shared DLLItem li = new DLLItem(); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } }
I1
DLL
l2 l3
O1 O2 O3
71
class DLLItem { public unique Object data; public shared DLLItem prev; public shared DLLItem next; } public class DLL { private shared DLLItem head; public void add(unique >> none Object data) : unique { shared DLLItem li = new DLLItem(); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } }
I1
DLL
l2 l3
O1 O2 O3
ERROR: Access shared data
72
class DLLItem { public unique Object data; public shared DLLItem prev; public shared DLLItem next; } public class DLL { private shared DLLItem head; public void add(unique >> none Object data) : unique { atomic { shared DLLItem li = new DLLItem(); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } } }
I1
DLL
l2 l3
O1 O2 O3
72
class DLLItem { public unique Object data; public shared DLLItem prev; public shared DLLItem next; } public class DLL { private shared DLLItem head; public void add(unique >> none Object data) : unique { atomic { shared DLLItem li = new DLLItem(); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } } }
I1
DLL
l2 l3
O1 O2 O3
Unique receiver means no aliases
73
class DLLItem { public unique Object data; public shared DLLItem prev; public shared DLLItem next; } public class DLL { group nodes; private shared DLLItem head; public void add(unique >> none Object data) : unique { shared DLLItem li = new DLLItem (); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } }
I1
DLL
l2 l3
O1 O2 O3
74
class DLLItem<G> { public unique Object data; public shared DLLItem<G> prev; public shared DLLItem<G> next; } public class DLL { group nodes; private shared DLLItem head; public void add(unique >> none Object data) : unique { shared DLLItem li = new DLLItem (); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } }
I1
DLL
l2 l3
O1 O2 O3
75
class DLLItem<G> { public unique Object data; public shared DLLItem<G> prev; public shared DLLItem<G> next; } public class DLL { group nodes; private shared DLLItem head; public void add(unique >> none Object data) : unique { shared DLLItem<nodes> li = new DLLItem<nodes>(); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } }
I1
DLL
l2 l3
O1 O2 O3
75
class DLLItem<G> { public unique Object data; public shared DLLItem<G> prev; public shared DLLItem<G> next; } public class DLL { group nodes; private shared DLLItem head; public void add(unique >> none Object data) : unique { shared DLLItem<nodes> li = new DLLItem<nodes>(); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } }
I1
DLL
l2 l3
O1 O2 O3
76
class DLLItem<G> { public unique Object data; public shared DLLItem<G> prev; public shared DLLItem<G> next; } public class DLL { group nodes; private shared DLLItem head; public void add(unique >> none Object data) : unique { unpack { shared DLLItem<nodes> li = new DLLItem<nodes>(); this.head.prev = li; li.next = this.head; li.data = data; this.head = li; } } }
I1
DLL
l2 l3
O1 O2 O3
77
public void add(unique >> none Object data) : unique { unpack { ... li.data = data; } }
unique
// this:
unique
data:
78
public void add(unique >> none Object data) : unique { unpack { ... li.data = data; } }
unique
// this:
unique
data:
79
public void add(unique >> none Object data) : unique { unpack { ... li.data = data; } }
unique unique
data:
exclusive
// this: this.nodes:
80
public void add(unique >> none Object data) : unique { unpack { ... li.data = data; } }
unique unique
data:
exclusive
// this: this.nodes:
81
public void add(unique >> none Object data) : unique { unpack { ... li.data = data; } } data:
unique
exclusive
// this: this.nodes:
unique
82
public void add(unique >> none Object data) : unique { unpack { ... li.data = data; } }
unique
// this:
unique
data:
exclusive
// this.nodes:
83
public void add(unique >> none Object data) : unique { unpack { ... li.data = data; } }
unique
// this:
unique
data:
exclusive
// this.nodes:
84
85
86
1 3 2 4 5 4’ 4’’ 4’’’ 4’’’
task dependency fork/join dependency
87
88
1 3 2 4 5 4’ 4’’ 4’’’ 4’’’
task dependency fork/join dependency
Tasks
Dependencies
88
1 3 2 4 5 4’ 4’’ 4’’’ 4’’’
task dependency fork/join dependency
Tasks
Dependencies
89
1 3 2 4 5 4’ 4’’ 4’’’ 4’’’
task dependency fork/join dependency
90
1 3 2 4 5 4’ 4’’ 4’’’ 4’’’
task dependency fork/join dependency
91
1 3 2 4 5 4’ 4’’ 4’’’ 4’’’
task dependency fork/join dependency
92
1 3 2 4 5 4’ 4’’ 4’’’ 4’’’
task dependency fork/join dependency
93
1 3 2 4 5 4’ 4’’ 4’’’ 4’’’
task dependency fork/join dependency
4’ 4’’ 4’’’ 4’’’
94
1 3 2 4 5
task dependency fork/join dependency
4’ 4’’ 4’’’ 4’’’
95
1 3 2 4 5
task dependency fork/join dependency
4’ 4’’ 4’’’ 4’’’
96
1 3 2 4 5
task dependency fork/join dependency
97
98
99
100
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 Speedup Number of cores n = 23 n = 25 n = 27101
102
103
104
105
concurrency characteristics
(SPLASH, SPEC, DaCapo, etc)
106
107 Nov 2011 Sep 2012
Jan 2012 March 2012 May 2012 Jul 2012
108
Nov 2011 Sep 2012 Jan 2012 March 2012 May 2012 Jul 2012
109
Nov 2011 Sep 2012 Jan 2012 March 2012 May 2012 Jul 2012
110
Nov 2011 Sep 2012 Jan 2012 March 2012 May 2012 Jul 2012
111
112
113
114