Parallel computing has become an important subject in the field of computer
science and has proven to be critical when researching high performance solutions.
The evolution of computer architectures (*multi-core* and *many-core*) towards a higher
number of cores can only confirm that parallelism is the method of choice for speeding
up an algorithm. In the last decade, the graphics processing unit, or GPU, has gained
an important place in the field of high performance computing (HPC) because of its
low cost and massive parallel processing power. Super-computing has become, for the
first time, available to anyone at the price of a desktop computer. In this paper, we
survey the concept of parallel computing and especially GPU computing. Achieving
efficient parallel algorithms for the GPU is not a trivial task, there are several technical
restrictions that must be satisfied in order to achieve the expected performance. Some
of these limitations are consequences of the underlying architecture of the GPU and
the theoretical models behind it. Our goal is to present a set of theoretical and technical concepts that are often required to understand the GPU and its *massive parallelism *model. In particular, we show how this new technology can help the field of *computational physics*, especially when the problem is *data-parallel*. We present four examples
of computational physics problems: *n-body, collision detection, Potts model* and *cellular
automata *simulations. These examples well represent the kind of problems that are
suitable for GPU computing. By understanding the GPU architecture and its massive
parallelism programming model, one can overcome many of the technical limitations
found along the way, design better GPU-based algorithms for computational physics
problems and achieve speedups that can reach up to two orders of magnitude when
compared to sequential implementations.