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】:如果您有一堆 a
和 b
矩阵要相乘,那么如果您“堆叠”矩阵而不是循环遍历它们,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次的主要内容,如果未能解决你的问题,请参考以下文章