Become a TechLeader in high-performance computing
As hardware designers turn to multicore CPUs and GPUs, software developers must embrace parallel programming to increase performance. No single approach has yet established itself as the "right way" to develop parallel software, especially as the hardware evolves so rapidly. The following courses are in the works. Check back for dates soon.
Introduction to Parallel Processing
Course Description: As hardware designers turn to multi-core CPUs and GPUs, software developers must embrace parallel programming to increase performance. No single approach has yet established itself as the "right way" to develop parallel software, especially as the hardware evolves so rapidly. This course starts by overviewing the architecture of modern processors, including multi-core, many-core, and general APUs. This discussion includes not only the computation cores themselves, but also the importance of understanding the memory hierarchy and caching. The course then turns to the programmability of these systems, and works from the ground up: multithreading, higher-level directive and task-based, message-passing, and map-reduce. The course also moves from shared memory to distributed memory to the cloud, showing examples of C++11, CUDA, Thrust, OpenMP, PPL, MPI, and Hadoop to program these systems. Additional topics include measuring performance, linear speedup, Amdahl's law, profiling and debugging tools, types of parallelism (data, task, dataflow, embarrassing), and common patterns (fork-join, reduction, and map-reduce). Hands-on lab exercises in C and C++ are an integral part of the course; attendees should expect to bring a laptop.
- Intro to HPC and multicore hardware
- Modern many-core hardware
- Types of parallelism
- Parallel programming in C++11
- The dangers of parallel programming
- OpenMP: a higher-level abstraction
- Task-based parallelism with the TPL
- Tools: debuggers, profilers, and analyzers
- Parallelism at scale: clusters and MPI
- Parallelism at scale: cloud and Hadoop
- Future research directions
Course Description: Embedded software is found in most electronic devices designed today. Embedded software controls our cell phones, microwaves, network routers, automobiles, and industrial controls. Each of these embedded systems is unique and highly customized to the specific application. As a result, embedded systems development is a widely varying field that can take years to master. This course will overview some of the basic principles of writing software for embedded systems. The course will survey the issues and discusses the various techniques for dealing with them. In particular, the course discusses approaches to the appropriate use of the real-time operating systems upon which much embedded software is based. In addition to explaining what these systems do, this course provides guidance on how you can use them most effectively. The information in this course is not specific to any microprocessor or real-time operating system nor is it oriented towards any particular software design methodology. The principles are the same, regardless of which microprocessor and which real-time operating system and which software design methodology you use. We will concentrate on the principles that you can apply to almost any embedded system project. The material in this course will provide the necessary information to understand the embedded systems development cycle and the specialized aspects of developing and testing software in this environment. This course will also discuss the design considerations unique to embedded systems. The course will cover the key methods and technologies for each phase of the development process: specification, partition, design, integration, validation, and maintenance and upgrade.
- Hardware Fundamentals for the Software Engineer
- Embedded Software Development
- Modeling Embedded Systems
- Embedded Software Architectures