Modern scientific computing focuses on developing applications using GPUs because of the rapidngrowth in computing power, and drop in the price of massively parallel accelerators. The abundant datanparallelism available in many-core GPUs has been a key interest to improve accuracy in scientific andnengineering simulation. Modern GPUs use multiple streaming multiprocessors (SMs) with potentiallynthousands of cores, fast context switching, and high memory bandwidth to tolerate ever-increasingnlatencies to main memory by overlapping long-latency loads in stalled threads with useful computationnin other threads. The Compute Unified Device Architecture (CUDA) is a simple C-like interfacenproposed for programming NVIDIA GPUs. However, porting applications to CUDA remains a challengento average programmers. CUDA places on the programmer the burden of packaging GPU code innseparate functions, of explicitly managing data transfer between the host and GPU memories, and ofnmanually optimizing the utilization of the GPU memory. Hence, the pre-condition in efficient utilizationnof the GPU resources is a comprehensive understanding of the underlying architecture, and then3 exertion of complex kernel optimizations.