First step, having something that works.
Address comments.
Add a test for the op version (but not for grad yet).
Add tests for the grad of the op version (which is broken for now).
Fix shape errors in the gradient (but it's still not the right value).
Add tests for grad shape.
Some improvements to the gradient, but it's still transposed and partially wrong.
Fix the the gradient on W.  Finally.
Fix the crash on exit with pycuda.
Fix last bug.
Use the non-scan version by default, since it's faster.
Add inplace optimizations.
Don't try to use opt when cuda is not available.
Add test to check that the inplace opts are working.
And make the opt test work.
Fix shape error in tests (which also means that we had wrong behavior).
Add support for the fortran order in gemv (and a test for it).
Add C code to SparseBlockGemvSS
Fix errors in C code and add a cache version.  It passes the tests and works.
Use gemm_batched in the python code.
Fix memory leak in C code for blocksparse.