GPU Programming for Scientific Computing and Beyond