-
Notifications
You must be signed in to change notification settings - Fork 1
/
00_introduction.tex
15 lines (8 loc) · 3.2 KB
/
00_introduction.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\section{Introduction}
\par
High Performance Computing (HPC) denotes the utilization of cutting-edge computing technologies to tackle intricate problems and conduct extensive simulations or calculations at speeds and scales surpassing those achievable by conventional desktop or server computers.
HPC entails the amalgamation of systems administration, encompassing network and security expertise, and parallel programming into a multidisciplinary domain that encompasses digital electronics, computer architecture, system software, programming languages, algorithms, and computational methodologies.~\cite{hpc}.
\par
The Central Processing Unit (CPU) serves as the primary hardware component in computers, renowned for its robust processing capabilities, particularly for executing multiple tasks simultaneously, notably within high-performance computing (HPC) environments. In contrast, the Graphics Processing Unit (GPU) is a specialized hardware unit initially designed to enhance graphics rendering and parallel computation tasks. Over time, GPUs have evolved into powerful, fully programmable processors capable of handling a wide range of computational tasks. This transformation has positioned GPUs as highly effective solutions for addressing massively parallel computing challenges, owing to their intricate many-core architectures.~\cite{gpu_wiki}.
\par
GPU Programming involves crafting code to harness the computational prowess of GPUs for specific tasks, spanning parallel computing, data processing, and scientific simulations. Yet, mastering GPU programming necessitates a deep understanding of parallel programming, memory management, extensive practical experience, and a commitment to ongoing learning, given the continuous evolution of GPU architectures. Consequently, this Best Practice Guide (BPG) offers a methodical and comprehensive resource for GPU programming, empowering developers to exploit the massively parallel architecture of GPUs to accelerate applications across various domains. It's important to note that this BPG builds upon previously developed series of BPGs (\cite{prace-bpg}), which remain relevant as they furnish valuable background information about modern accelerators (\cite{modern-accelerators}), processors (\cite{modern-processors}), general-purpose GPUs (\cite{gpgpu}), and others. However, the primary focus of this guide lies in addressing GPU programming issues, encompassing a wide array of programming languages, software environments, and APIs, such as ~\textbf{directive-based programming models} (Section \ref{sec:directive-based-programming-models}), ~\textbf{non-portable kernel-based programming models} (Section \ref{sec:non-portable-kernel-based-programming-models}), and ~\textbf{portable kernel-based programming models} (Section \ref{sec:portable-kernel-based-programming-models}). Additionally, this BPG elucidates representative high-level frameworks and libraries developed for GPU programming, along with general procedures for code portability from CPU to GPU and between different GPU frameworks (Section \ref{sec:porting_code}). Finally, in Section \ref{sec:stencil_example}, multiple code samples for the two-dimensional heat diffusion problem utilizing the Stencil technique are provided.