在一次操作中进行多个矩阵 - 矩阵乘法

Mar*_*sen 5 c c++ cuda blas cublas

我正在实现一种算法,实质上是一系列矩阵 - 矩阵乘法,如下所示:

Res = M1.M2.M3. ... .Mn

我的矩阵实际上是小的100x100浮点数,但序列非常长,大约数十亿.

我尝试使用CUBLAS来进行矩阵乘法,但这很慢,但我确实注意到了一些有趣的东西.

将100x100与100x100矩阵相乘的速度很慢,但是将1.000.000x100乘以100x100相对较快,这让我想到了.如果我从左到右进行扫描而不是并行扫描10.000次.这应该是非常快的,如果我在完成这项工作后将我的矩阵相乘,我会得到相同的结果 - 只是更快.

Res1 = M1.M2.M3. ... .Mn/1000-1
Res1 = M1+n/1000.M2+n/1000.M3+n/1000. ... .M2(n/1000)-1
...
Res1  = M1+999*n/1000.M2+999*n/1000.M3+999*n/1000. ... .M1000*(n/1000)-1
Res = Res1*Res2* ... *Res999 

毫无价值M_1 ... M_n在一组约100个不同的矩阵中,因此空间消耗并不是真正的问题,我需要做的就是在一次操作中进行多次乘法.

现在这是我的问题.我已经完成了一个矩阵矩阵(sgemm)实现的灵感来自他们的文档中的一个nvidia演示,但它的顺序大约是cublas的4倍.有谁知道CUBLAS如何运作?如果代码在某处可用?

har*_*ism 11

你看过最新的CUBLAS(4.1版)吗?它包括一个新的批量GEMM模式,专门用于大批量的小矩阵矩阵乘法.我建议做一个成对的乘法树,正如Jonathan Dursi在他的回答中所建议的那样,使用CUBLAS批处理的API加速它,而不是像他建议的那样编写你自己的自定义内核.

CUBLAS 4.1包含在CUDA Toolkit v4.1中.

CUBLAS BATCHED GEMM API提高了小矩阵批次的性能

  • +1 - 这是一个很棒的新功能,我对此一无所知! (2认同)
  • @MartinKristiansen:112x112x10,000x3*4需要超过1GB的内存.你有256MB.我不确定你的"无限循环"是什么意思,但听起来好像你没有正确检查从cudaMalloc()返回的错误代码. (2认同)