Heterogeneous hardware is present everywhere and in every scale, ranging from mobile devices to servers, such as tablets, laptops, and desktops personal computers. Heterogeneous computing systems usually contain one or more CPUs, each one with a set of computing cores, and a GPU. Additionally, data centers are currently integrating more and more heterogeneous hardware, such as Field Programmable Gate Arrays (FPGAs) in their servers, enabling their clients to accelerate their applications via programmable hardware. This chapter presents the most popular state-of-the-art programming and architecture models to develop applications that take advantage of all heterogeneous resources available within a computer system.