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中.