Understand cublasSgemmStridedBatched for non-contiguous GEMM on CudaTensors
It seems like cublasSgemmStridedBatched can be used for matrix multiplication on GPU without copy for non-contiguous tensors. See the article [here](https://devblogs.nvidia.com/parallelforall/cublas-strided-batched-matrix-multiply/). (Note: if it works we can also use it for GEMV)

API has been added to Arraymancer here: https://github.com/mratsim/Arraymancer/blob/513dcf7cb03685fe7140eea8e4acd46c0700b2b6/src/arraymancer/backend/cublas.nim#L192-L231

Unfortunately I can't manage to use it even to multiply 2 contiguous matrices. Official documentation is [here](http://docs.nvidia.com/cuda/cublas/index.html#cublas-lt-t-gt-gemmstridedbatched) but there is no example of simple matmul

The follow snippet doesn't work whatever the strides I use to tell Cuda "There is no overlap"
Another poor soul had the same issue on [StackOverflow](https://stackoverflow.com/questions/42679910/on-entry-to-sgemm-parameter-number-15-had-an-illegal-value) and [Nvidia forums](https://devtalk.nvidia.com/default/topic/998754/gemmstridedbatched/).

Snippet is a port from his code
```Nim
import ../src/cuda
import nimcuda/[cuda_runtime_api, driver_types, cublas_api, cublas_v2, nimcuda]


let m = 100
let n = 5
let k = 8


# C = B^T * A

var alpha = 1'f32

let B = randomTensor([800, 5], 1'f32).astype(float32).cuda
# B^T block has dimension 5 by 8
let ldb = 800
let strideB = 8

let A = randomTensor([800, 100], 1'f32).astype(float32).cuda
# A block has a dimension of 8 by 100
let lda = 800
let strideA = 8


var beta = 0'f32

let C = newTensor([500,100], float32).cuda
# C block has dimension 5 by 100

let ldc = 500
let strideC = 5

let n_blocks = 100

let foo = randomTensor([4,4],1'f32)
echo foo
echo foo.cuda

# echo B
# echo A
# echo C

cublas_gemmStridedBatched(
      CUBLAS_OP_T, CUBLAS_OP_N,
      n, m, k,
      alpha, B.get_data_ptr, ldb, n*k,
      A.get_data_ptr, ldA, m*k,
      beta, C.get_data_ptr, ldc, m * n,
      n_blocks
    )

echo C.cpu == B.cpu.transpose * A.cpu
```


Error:
```
 ** On entry to SGEMM  parameter number 15 had an illegal value
 ** On entry to SGEMM  parameter number 15 had an illegal value
 ** On entry to SGEMM  parameter number 15 had an illegal value
```
Note that parameter are (?) moved by one due to cublasHandle param being hidden.

## References - cublasSgemmStridedBatched in the wild:
- [Caffe2](https://github.com/caffe2/caffe2/blob/99959090cc51d67334ee76541d2d210ef6f2bea2/caffe2/operators/batch_matmul_op.cu#L62)
- [Mxnet](https://github.com/dmlc/mshadow/commit/d2758c0bc862b2feb69913eea05bad04df5e66be) 