У меня есть простой скрипт, в котором я выполняю следующую операцию с большими матрицами (может превышать 10000x10000
со значениями float
):
F = (I - Q)^-1 * R
Сначала я использовал тензоры pytorch на CPU (i7-8750H) и он работает в 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), чтобы посмотреть, смогу ли я получить еще одно ускорение, но код работает медленнее, чем просто версия(Я уже установил 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)
Возможно, накладные расходы на выделение памяти слишком велики по сравнению с вычислением нескольких операций.