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, wherein said receiving is carried out by a distinct software module executing on a hardware processor; 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, and wherein said analyzing is carried out by a distinct software module executing on a hardware processor; 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, wherein said optimizing is carried out by a distinct software module executing on a hardware processor; and outputting an optimized sparse matrix-vector multiplication, wherein said outputting is carried out by a distinct software module executing on a hardware processor.