The introduction of multicores to the computing market has created a big change in the software industry for mobile devices, desktop computers, servers, and supercomputers. To benefit from increases in performance due to the multicore hardware, software must be specifically built for the multicore hardware. This course introduces various contemporary multicore architectures and teaches the way how to develop software for them. Topics include multicore processor architectures (mobile devices, desktop computers, servers, and supercomputers), memory hierarchies, memory consistency models, multicore operating systems, parallel programming models, scheduling techniques, synchronization, performance analysis techniques, optimization techniques, debugging techniques. Especially, we cover accelerator architectures, such as GPUs, and understand the trend in heterogeneous computing that exploits such accelerators.