Unfortunately, these three requirements - reliability, efficiency and portability - are often at odds with each other. This is particularly the case in the world of "many-core" architectures, which use large numbers of processing elements to compute results in a highly parallel fashion. Many-core architectures can be used to accelerate software so that it runs very efficiently, and are present in every modern desktop, laptop, tablet and smartphone.
Many-core programming languages are usually low-level, providing the "close-to-the-metal" capabilities needed for high performance. Unfortunately, this makes it difficult to write portable many-core software, and the difficulty of low-level programming means that it is easy to accidentally introduce subtle errors into an application.
This has led to an interest in higher-level languages that offer better portability and reduce the scope for programmer errors, but which must be "compiled" down to lower-level forms. While appealing, such languages lead to layers of abstraction, and reliability suffers due to errors in translating code across abstraction layers.
This lecture focused on the challenges of "going really fast without crashing" in the context of many-core systems, using practical examples to demonstrate the main problems associated with programming many-core systems. The lecture also showcased three different areas where Alastair's research group contributed to getting a handle on these problems: (1) static analysis for low-level many-core code, (2) a high-level programming model for portable programming, and (3) a "fuzzing" technique to identify bugs in many-core compilers.