OpenMP 1.0 was released in 1997 when the primary concern was symmetric multiprocessors. Modern platforms are increasingly heterogeneous, with CPU cores, GPU cores, and other specialized accelerators. Most of the announced Exascale systems are just such machines, and so programming GPUs with OpenMP has now become a key skill for scientific software developers. OpenMP has target directives that map code and data onto a potentially diverse set of devices.
In this hands-on tutorial, we will explore these directives to program GPUs. We assume people know the fundamentals of OpenMP (perhaps by taking the OpenMP Common Core tutorial) so we can focus on deeply understanding the target directives and their use in complex application programs. We expect students to use their own laptops to connect to remote servers with GPUs; an alternative is for students to load an OpenMP compiler onto their laptops in advance.