Software Optimization for High Performance Computing: Creating Faster Applications