我有一个 numpy 脚本,我在其中对大矩阵执行以下操作(可以10000x10000
使用float
值):
F = (I - Q)^-1 * R
我首先在 CPU (i7-8750H) 上使用了 pytorch 张量,它的运行速度提高了 2 倍:
tensorQ = torch.from_numpy(Q)
tensorR = torch.from_numpy(R)
sub= torch.eye(a * d, dtype=float) - tensorQ
inv= torch.inverse(sub)
tensorF = torch.mm(inv, tensorR)
F = tensorF.numpy()
现在我正在尝试在 GPU (1050Ti Max-Q) 上执行它,看看我是否可以获得另一个加速,但代码运行速度比 numpy 版本慢(我已经安装了 CUDA 和 cuDNN)。也许 pytorch 它甚至不是做这类事情的最佳库,但我现在正在学习它,我认为它可以帮助我:
dev = torch.device('cuda')
tensorQ = torch.from_numpy(Q).to(dev)
tensorR = torch.from_numpy(R).to(dev)
sub= torch.eye(a * d, dtype=float).to(dev) - tensorQ
inv= torch.inverse(sub).to(dev)
tensorF = torch.mm(inv, tensorR).cpu()
F = tensorF.numpy()
我错过了什么吗?
编辑: 我也尝试过使用 CuPy,但它仍然很慢:
Q = cp.array(matrixQ)
R = cp.array(matrixR)
sub = cp.identity(attacker * defender) - matrixQ
inv = cp.linalg.inv(sub)
F = cp.matmul(inv, matrixR)
F = cp.asnumpy(matrixF)
与少量操作的计算相比,内存分配的开销可能太大了。