矩阵乘法的基本多GPU并行化

时间:2017-06-05 14:51:36

标签: python gpu pytorch

我希望在总结结果之前,通过计算GPU 0上的+---+---+---+---+ | | A | B | C | +---+---+---+---+ | X | 4 | 8 | 5 | | Y | 7 | 9 | 4 | | Z | 5 | | | +---+---+---+---+ 和GPU 1上的C = A^n + B^n来并行化2个GPU上的简单跟随表达式A^n

在TensorFlow中我会像:

B^n

然而,由于PyTorch是动态的,我在做同样的事情时遇到了麻烦。我尝试了以下但只需要更多时间。

with tf.device('/gpu:0'):
    An = matpow(A, n)
with tf.device('/gpu:1'):
    Bn = matpow(B, n)
with tf.Session() as sess:
    C = sess.run(An + Bn)

我知道有一个模块可以使用with torch.cuda.device(0): A = A.cuda() with torch.cuda.device(1): B = B.cuda() C = matpow(A, n) + matpow(B, n).cuda(0) 在批量维度上并行化模型,但在这里我尝试做一些更基本的事情。

1 个答案:

答案 0 :(得分:0)

您可以使用cuda streams。这不一定会通过两个设备分发,但执行将是并行的。

s1 = torch.cuda.Stream()
s2 = torch.cuda.Stream()

with torch.cuda.stream(s1):
    A = torch.pow(A,n)
with torch.cuda.stream(s2):
    B = torch.pow(B,n)

C = A+B

虽然我不确定如果只对这一操作进行并行化是否会真正加快计算速度。你的矩阵必须非常大。

如果您的要求是在设备之间拆分,可以在流之前添加:

A = A.cuda(0)
B = B.cuda(1)

然后在电源操作后,您需要再次将它们放在同一设备上,例如B = B.cuda(0)。之后你可以做补充。