|
|
1 | (16) |
|
|
3 | (3) |
|
Navigating the concurrency sea |
|
|
3 | (3) |
|
Where does concurrency appear? |
|
|
6 | (3) |
|
Why is concurrency considered hard? |
|
|
9 | (2) |
|
|
9 | (2) |
|
|
11 | (1) |
|
|
12 | (2) |
|
|
13 | (1) |
|
|
14 | (1) |
|
|
14 | (3) |
|
|
17 | (26) |
|
|
19 | (10) |
|
|
19 | (4) |
|
Parallelism versus concurrency |
|
|
23 | (2) |
|
Dependencies and parallelism |
|
|
25 | (3) |
|
Shared versus distributed memory |
|
|
28 | (1) |
|
|
29 | (11) |
|
|
30 | (4) |
|
Mutual exclusion and critical sections |
|
|
34 | (2) |
|
Coherence and consistency |
|
|
36 | (2) |
|
|
38 | (2) |
|
|
40 | (3) |
|
|
43 | (22) |
|
|
44 | (8) |
|
|
44 | (2) |
|
|
46 | (3) |
|
Liveness, starvation and fairness |
|
|
49 | (2) |
|
|
51 | (1) |
|
|
52 | (10) |
|
|
52 | (2) |
|
|
54 | (2) |
|
|
56 | (1) |
|
|
57 | (3) |
|
|
60 | (2) |
|
|
62 | (3) |
|
|
65 | (20) |
|
|
66 | (3) |
|
|
69 | (7) |
|
|
69 | (6) |
|
Explicitly controlled threads |
|
|
75 | (1) |
|
|
76 | (4) |
|
|
77 | (1) |
|
|
78 | (1) |
|
|
79 | (1) |
|
The limits of explicit control |
|
|
80 | (2) |
|
|
81 | (1) |
|
|
82 | (1) |
|
|
83 | (2) |
|
High-Level Language Constructs |
|
|
85 | (24) |
|
Common high-level constructs |
|
|
88 | (6) |
|
|
89 | (2) |
|
|
91 | (1) |
|
Abstract types and data structures |
|
|
92 | (2) |
|
Using and evaluating language constructs |
|
|
94 | (8) |
|
|
98 | (3) |
|
Working with the cognitive dimensions |
|
|
101 | (1) |
|
Implications of concurrency |
|
|
102 | (2) |
|
Sequential constructs and concurrency |
|
|
103 | (1) |
|
|
104 | (2) |
|
|
106 | (3) |
|
Historical Context and Evolution of Languages |
|
|
109 | (40) |
|
|
111 | (9) |
|
Multiprogramming and interrupt driven I/O |
|
|
111 | (1) |
|
Cache-based memory hierarchies |
|
|
112 | (1) |
|
Pipelining and vector processing |
|
|
113 | (1) |
|
|
114 | (1) |
|
Massively parallel computers |
|
|
115 | (2) |
|
Clusters and distributed memory systems |
|
|
117 | (1) |
|
|
118 | (1) |
|
|
118 | (2) |
|
Evolution of programming languages |
|
|
120 | (25) |
|
In the beginning, there was FORTRAN |
|
|
120 | (2) |
|
|
122 | (3) |
|
|
125 | (1) |
|
|
125 | (3) |
|
|
128 | (3) |
|
Declarative and functional languages |
|
|
131 | (7) |
|
|
138 | (6) |
|
|
144 | (1) |
|
Limits to automatic parallelization |
|
|
145 | (2) |
|
|
147 | (2) |
|
Modern Languages and Concurrency Constructs |
|
|
149 | (26) |
|
|
150 | (8) |
|
|
152 | (3) |
|
|
155 | (2) |
|
|
157 | (1) |
|
|
158 | (5) |
|
|
160 | (1) |
|
|
160 | (1) |
|
|
161 | (2) |
|
|
163 | (5) |
|
|
163 | (1) |
|
PAR, SEQ and ALT in occam |
|
|
164 | (2) |
|
|
166 | (2) |
|
|
168 | (1) |
|
|
169 | (3) |
|
Discussion of functional operators |
|
|
171 | (1) |
|
|
172 | (3) |
|
Performance Considerations and Modern Systems |
|
|
175 | (22) |
|
|
176 | (10) |
|
Architectural solutions to the performance problem |
|
|
177 | (1) |
|
Examining single threaded memory performance |
|
|
178 | (2) |
|
Shared memory and cache coherence |
|
|
180 | (5) |
|
Distributed memory as a deeper memory hierarchy |
|
|
185 | (1) |
|
Amdahl's law, speedup, and efficiency |
|
|
186 | (2) |
|
|
188 | (3) |
|
|
188 | (1) |
|
|
189 | (1) |
|
|
190 | (1) |
|
|
191 | (3) |
|
|
194 | (3) |
|
Introduction to Parallel Algorithms |
|
|
197 | (10) |
|
Designing parallel algorithms |
|
|
198 | (1) |
|
|
199 | (1) |
|
Strategies for exploiting concurrency |
|
|
200 | (1) |
|
|
201 | (2) |
|
Patterns supporting parallel source code |
|
|
203 | (1) |
|
Demonstrating parallel algorithm patterns |
|
|
204 | (1) |
|
|
205 | (2) |
|
Pattern: Task Parallelism |
|
|
207 | (26) |
|
Supporting algorithm structures |
|
|
208 | (7) |
|
The Master-worker pattern |
|
|
209 | (1) |
|
Implementation mechanisms |
|
|
210 | (2) |
|
Abstractions supporting task parallelism |
|
|
212 | (3) |
|
|
215 | (7) |
|
|
218 | (2) |
|
Individual expression and fitness evaluation |
|
|
220 | (1) |
|
|
221 | (1) |
|
Mandelbrot set computation |
|
|
222 | (8) |
|
|
222 | (1) |
|
Identifying tasks and separating master from worker |
|
|
223 | (3) |
|
|
226 | (3) |
|
|
229 | (1) |
|
|
230 | (1) |
|
|
230 | (3) |
|
Pattern: Data Parallelism |
|
|
233 | (14) |
|
|
233 | (3) |
|
|
236 | (2) |
|
|
238 | (2) |
|
Limitations of SIMD data parallel programming |
|
|
240 | (2) |
|
|
242 | (2) |
|
Approximating data parallelism with tasks |
|
|
243 | (1) |
|
|
244 | (1) |
|
|
245 | (2) |
|
Pattern: Recursive Algorithms |
|
|
247 | (16) |
|
|
248 | (6) |
|
Recursion and concurrency |
|
|
252 | (1) |
|
Recursion and the divide and conquer pattern |
|
|
253 | (1) |
|
|
254 | (3) |
|
|
257 | (4) |
|
|
261 | (2) |
|
Pattern: Pipelined Algorithms |
|
|
263 | (16) |
|
Pipelining as a software design pattern |
|
|
265 | (1) |
|
Language support for pipelining |
|
|
266 | (1) |
|
|
267 | (5) |
|
|
268 | (1) |
|
|
269 | (1) |
|
|
270 | (2) |
|
|
272 | (4) |
|
Peta Vision code description |
|
|
274 | (2) |
|
|
276 | (3) |
|
Appendix A OpenMP Quick Reference |
|
|
279 | (16) |
|
|
280 | (1) |
|
Creating threads and their implicit tasks |
|
|
280 | (2) |
|
|
282 | (3) |
|
Synchronization and the OpenMP memory model |
|
|
285 | (3) |
|
|
288 | (3) |
|
OpenMP runtime library and environment variables |
|
|
291 | (1) |
|
Explicit tasks and OpenMP 3.0 |
|
|
292 | (3) |
|
Appendix B Erlang Quick Reference |
|
|
295 | (10) |
|
|
295 | (5) |
|
Execution and memory model |
|
|
300 | (1) |
|
|
301 | (4) |
|
Appendix C Cilk Quick Reference |
|
|
305 | (10) |
|
|
306 | (4) |
|
|
310 | (2) |
|
|
310 | (1) |
|
|
311 | (1) |
|
|
312 | (2) |
|
|
314 | (1) |
References |
|
315 | (8) |
Index |
|
323 | |