1. A method for optimizing sparse matrix-vector multiplication (SpMV) on a graphics processing unit (GPU), wherein the method comprises: receiving a sparse matrix-vector multiplication; analyzing the sparse matrix-vector multiplication to identify one or more optimizations, wherein analyzing the sparse matrix-vector multiplication to identify one or more optimizations comprises analyzing a non-zero pattern for one or more optimizations and determining whether the sparse matrix-vector multiplication is to be reused across a computation; optimizing the sparse matrix-vector multiplication, wherein optimizing the sparse matrix-vector multiplication comprises optimizing global memory access, optimizing shared memory access and exploiting reuse and parallelism; and outputting an optimized sparse matrix-vector multiplication.