如果您有一堆要相乘的矩阵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
$