-CUDA (Compute Unified Device Architecture) is a parallel computing architecture developed by NVIDIA~\cite{CUDA15} for GPUs. It provides a high level GPGPU-based programming model to program GPUs for general purpose computations. The GPU is viewed as an accelerator such that data-parallel operations of a CUDA program running on a CPU are off-loaded onto GPU and executed by this later. The data-parallel operations executed by GPUs are called kernels. The same kernel is executed in parallel by a large number of threads organized in grids of thread blocks, such that each GPU multiprocessor executes one or more thread blocks in SIMD fashion (Single Instruction, Multiple Data) and in turn each core of the multiprocessor executes one or more threads within a block. Threads within a block can cooperate by sharing data through a fast shared memory and coordinate their execution through synchronization points. In contrast, within a grid of thread blocks, there is no synchronization at all between blocks. The GPU only works on data filled in the global memory and the final results of the kernel executions must be transferred out of the GPU. In the GPU, the global memory has lower bandwidth than the shared memory associated to each multiprocessor. Thus in the CUDA programming, it is necessary to design carefully the arrangement of the thread blocks in order to ensure low latency and a proper usage of the shared memory, and the global memory accesses should be minimized.
+CUDA (Compute Unified Device Architecture) is a parallel computing
+architecture developed by NVIDIA~\cite{CUDA15} for GPUs. It provides a
+high level GPGPU-based programming model to program GPUs for general
+purpose computations. The GPU is viewed as an accelerator such that
+data-parallel operations of a CUDA program running on a CPU are
+off-loaded onto GPU and executed by this latter. The data-parallel
+operations executed by GPUs are called kernels. The same kernel is
+executed in parallel by a large number of threads organized in grids
+of thread blocks, such that each GPU multiprocessor executes one or
+more thread blocks in SIMD fashion (Single Instruction, Multiple Data)
+and in turn each core of the multiprocessor executes one or more
+threads within a block. Threads within a block can cooperate by
+sharing data through a fast shared memory and coordinate their
+execution through synchronization points. In contrast, within a grid
+of thread blocks, there is no synchronization at all between
+blocks. The GPU only works on data filled in the global memory and the
+final results of the kernel executions must be transferred out of the
+GPU. In the GPU, the global memory has lower bandwidth than the shared
+memory associated to each multiprocessor. Thus with CUDA programming,
+it is necessary to design carefully the arrangement of the thread
+blocks in order to ensure a low latency and a proper use of the shared
+memory. As for the global memory accesses, it should also be minimized.