Guiding Principles
Goals First we must agree on the goals. Several (non-exclusive) choices – Want every CS major to be educated in performance including power. – Want every CS major to be educated in parallel computing (for performance/for productivity). Programming = Parallel programming ? – Want those CS majors interested in performance computing to learn (more) about parallelism – Want all (some) non-CS majors interested in computational sciences and engineering to learn about parallel computing. Key question: – How fundamental is parallel computing ? – Is it a core topic ?
How is knowledge in performance and/or parallel computing to be presented ? Spread throughout the curriculum – Parallelism in the first programming course – Impact on performance of machine components and algorithmic choices with programming assignments in each other course including computer architecture, AI, datamining, … – Parallel algorithms and parallel data strcutures discussed in courses on algorithms. – This would come at a price. Some other things would be taught in less detail or not at all.
AND/OR Courses specially designed to teach performance and parallel computing. – Which ones should be required ? Which should be electives? How is knowledge in performance and/or parallel computing to be presented ? (cont.)
Principles in designing the curriculum Common set of concepts and terms: Need to identify set of common concepts, techniques, skills, that are to be taught. Universality: Curriculum based on universal, general principles with case studies to illustrate them. Top down or bottom up. Need to emphasize foundations in a rapidly evolving field. Machines, languages, etc. Breadth: Cover different approaches. Even those that are not popular today. Shared-memory, distributed memory, data parallel, data flow, functional. SIMD, MIMD, heterogenous.
Principles in designing the curriculum Practice: Theoretical discussion will not be enough. Students need to face the complexity of machine-program interaction, the frustration of optimizations. Range of machines are needed for exercises. Discuss today’s reality: Need to teach today’s reality and teach enough to deal with today’s machines and languages. History: Students need to know what happened before and why we are where we are.
Principles in designing the curriculum Identify Skills: – Ability to analyze the performance of a program. Know what to expect. Identify bottlenecks. Program optimization strategies, use of compilers, use of performance monitoring tools, empirical search. – Ability to design good parallel programs to begin with. Software engineering. Team work in parallel computing. Programming in the large (parallelism) vs programming in the small Co-routine decomposition. Language selection. Testing. Use of debugging tools including race detection. – Ability to transform programs to improve performance. Know what are the options. Program transformations. Algorithms. Ability to design or interact with runtime program optimization. – Ability to select a good target platform for a particular problem.
Practical issues Will need – Good (balanced) textbooks – Resources for experiments – Periodic revisions
Specialized sequences Define advanced course (sequences) – Parallelism for computations sciences. – Parallel machine design issues. – Parallel programming languages and their implementation. – Advanced Parallel Algorithms.