1

我正在尝试在 CUPY 中使用多个 GPU 并行化多个矩阵乘法。

Cupy 加速矩阵乘法(例如$A\times B$)。我想知道我是否有四个方阵 A、B、C、D。我想在两个不同的本地 GPU 上计算 AB 和 CD。我怎样才能在 CUPY 中做到这一点?

例如,在张量流中,

for i in xrange(FLAGS.num_gpus):
  with tf.device('/gpu:%d' % i):

CUPY中是否有类似的方法。关于 Cupy 的问题在于它会立即执行代码,因此它不能运行下一行(例如 $C\times D$),直到当前行完成(例如 $A\times B$)。

感谢托斯的帮助。现在的新问题是,假设我有十个这样的矩阵对存储在两个 3d numpy 数组中(比如?*?*10)。如何编写一个循环来存储乘法的结果?

anumpy #size(1e5,1e5,10)
bnumpy #size(1e5,1e5,10)

for i in range(10):
   #say I have 3 gpus
   with cupy.cuda.Device(i % 3):
      a = cupy.array(anumpy[:,:,i])
      b = cupy.array(bnumpy[:,:,i])
      ab[:,:,math.floor(i/3)] = a @ b

如何将这 3 个 ab 组合在不同的设备中?我可以在不同的 GPU 中拥有同名的数组吗?

4

3 回答 3

2

使用with cupy.cuda.Device(i)并避免阻塞操作。例如,要计算 CPU 数组对的 matmul,请在cupy.asnumpy调用所有 matmul 操作后将结果发送到 CPU ( )。

a = cupy.array(a)
b = cupy.array(b)
ab = a @ b
# ab = cupy.asnumpy(ab)  # not here
with cupy.cuda.Device(1):
    c = cupy.array(c)
    d = cupy.array(d)
    cd = c @ d
    cd = cupy.asnumpy(cd)
ab = cupy.asnumpy(ab)
于 2019-09-19T04:49:16.963 回答
1

在大多数操作中,CuPy 不会同步设备执行。类似的代码A.dot(B)在设备上启动矩阵乘积后立即返回,无需等待设备端操作本身,因此如果操作足够重(例如矩阵很大),计算有效地与另一个设备上的第二个矩阵乘积重叠.

于 2019-09-19T04:29:32.340 回答
0

我不能 100% 确定我是否正确理解了这个问题,但我想它可能是这样的:

def my_cal(gpu_id, anumpy, bnumpy):
  a = None
  b = None
  ab = None

  with cupy.cuda.Device(gpu_id):
    for i in range(10):
        a = cupy.array(anumpy[:,:,i])
        b = cupy.array(bnumpy[:,:,i])
        ab[:,:,math.floor(i/3)] = a @ b
  return cupy.asnumpy(ab)


np_ab0 = my_cal(0, anumpy, bnumpy)
np_ab1 = my_cal(1, anumpy, bnumpy)
np_ab2 = my_cal(2, anumpy, bnumpy)
于 2019-09-20T10:44:41.963 回答