Cupy矩阵乘法n次

Posted

技术标签:

【中文标题】Cupy矩阵乘法n次【英文标题】:cupy matrix multiplication n number of times 【发布时间】:2019-07-23 05:43:23 【问题描述】:

我需要将两个矩阵相乘很多次,我正在使用 CUPY。我就是这样做的

import cupy as cp
import time

iterations = 9680000
a = cp.random.rand(44,20)
b = cp.random.rand(20,1)

def ab(a,b,iterations):
for i in range(iterations):
    cp.matmul(a,b,out=None)

t1 = time.time()
ab(a,b,iterations)
t2 = time.time()
total = t2-t1

在上面的代码中 for 循环需要很多时间,我知道不应该那样做。我应该如何用cupy重写它,这样for循环才不会成为瓶颈

【问题讨论】:

每次迭代时相乘的矩阵是相同的还是不同的?在上面的代码中,它们看起来是一样的,但是你不能缓存结果吗? 每次迭代的矩阵都不一样 【参考方案1】:

如果您有一堆 ab 矩阵要相乘,那么如果您“堆叠”矩阵而不是循环遍历它们,numpy 和 cupy 都可以更有效地执行 matmul operation。

关于 cupy,矩阵“堆栈”仍然必须适合 GPU 内存,因此需要考虑这一点。如果您有太多的矩阵,堆栈将无法放入 GPU 内存中,那么您需要找到一种方法将工作分解为多个片段,然后循环遍历这些片段。但每一块都可以是一堆要相乘的矩阵。

这是一个包含一组较小矩阵的示例,显示了差异:

您的方法(迭代次数减少到 1000000):

$ cat t3.py
import cupy as cp
import time

iterations = 1000000
a = cp.random.rand(44,20)
b = cp.random.rand(20,1)

def ab(a,b,iterations):
  for i in range(iterations):
    cp.matmul(a,b,out=None)

t1 = time.time()
ab(a,b,iterations)
cp.cuda.Device(0).synchronize()
t2 = time.time()
total = t2-t1
print(total)
$ python t3.py
28.173577785491943
$

堆叠方法(迭代次数减少到 1000000):

$ cat t4.py
import cupy as cp
import time

iterations = 1000000
loops = 10
stack = iterations//loops
a = cp.random.rand(stack,44,20)
b = cp.random.rand(stack,20,1)

def ab(a,b,loops):
  for i in range(loops):
    cp.matmul(a,b,out=None)

t1 = time.time()
ab(a,b,loops)
cp.cuda.Device(0).synchronize()
t2 = time.time()
total = t2-t1
print(total)
$ python t4.py
0.8356013298034668
$

【讨论】:

以上是关于Cupy矩阵乘法n次的主要内容,如果未能解决你的问题,请参考以下文章

使用分而治之的矩阵乘法,时间复杂度

矩阵参数怎么用最小二乘法拟合

算法矩阵列乘法 | 动态规划

如何在 Cupy 中使用多个 GPU?

矩阵乘法——多矩阵连乘请记得加括号

算法提高 矩阵乘法 区间dp