0

我需要将两个矩阵相乘很多次,我正在使用 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

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

4

1 回答 1

0

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

对于 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
$
于 2019-07-23T15:05:54.953 回答