我正在实现一个算法,它本质上是一系列矩阵-矩阵乘法,如下所示:
水库 = M 1 .M 2 .M 3。... .M n
我的矩阵是非常小的 100x100 浮点数,但序列非常长,大约数十亿。
我尝试使用 CUBLAS 来进行矩阵乘法,但这很慢,但我确实注意到了一些有趣的事情。
将 100x100 与 100x100 矩阵相乘很慢,但将 1.000.000x100 与 100x100 相乘相对较快,这让我想到。如果我不是从左到右进行扫描,而是并行进行 10.000 次扫描。这应该很快,如果我在完成后乘以我的矩阵,我会得到相同的结果——只是更快。
水库1 = M 1 .M 2 .M 3。... .M n/1000-1 分辨率 1 = M 1+n/1000 .M 2+n/1000 .M 3+n/1000。... .M 2(n/1000)-1 ... 水库1 = M 1+999*n/1000 .M 2+999*n/1000 .M 3+999*n/1000。... .M 1000*(n/1000)-1 分辨率 = 分辨率1 * 分辨率2 * ... * 分辨率999
M_1 ... M_n 在一组大约 100 个不同的矩阵中毫无价值,所以空间消耗并不是真正的问题,我需要做的就是在一次操作中进行多次乘法运算。
现在这是我的问题。我已经完成了一个矩阵-矩阵(sgemm)实现,灵感来自 nvidia 在他们的文档中展示的一个,但它的速度大约是 cublas 的 4 倍。有人知道 CUBLAS 是如何工作的吗?如果代码在某处可用?