使用多 GPU 的并行矩阵乘法
Parallel Matrix Multiplication using multi GPU
我在我的系统中的不同 pci 插槽中安装了两个 GPU (2x Nvidia Quadro 410)。要解决这两个 GPU 上的 Martix 乘法,我如何拆分输入矩阵,使每个 GPU processes/computes 输出矩阵的一部分然后 returns 返回。
例如。对于两个矩阵 A,B 每个 10x10 的顺序,然后计算输出矩阵 C= A x B,这样,在 100 个元素(10 x 10)中,50 个元素应该在第一个 GPU 和另一半上计算,即 50 到b 在第二个 GPU 中计算。
我正在尝试在 OpenCL 上实现它。但是,欢迎任何算法,这将帮助我想出解决方案。
一般来说,如果您有矩阵 X
(大小为 a
xb
,行在前)和 Y(大小为 b
xc
),
X * Y = vcat(X[0:a/2,0:b] * Y, X[a/2:a,0:b] * Y)
在这个伪代码中,vcat
是垂直连接(将一个矩阵放在彼此的顶部,例如一个 4x3 矩阵与 2x3 矩阵连接将产生一个 6x3 矩阵),:
表示范围和[]
正在编制索引。
vcat
的两个参数都可以在不同的 GPU 上计算,连接可以通过将输出指向输出缓冲区的不同子区域来实现(假设我们有 C 序数组)。 X
的初始分割可以通过使用不同的子区域来类似地实现(因为它是沿着一行分割的)。
我在我的系统中的不同 pci 插槽中安装了两个 GPU (2x Nvidia Quadro 410)。要解决这两个 GPU 上的 Martix 乘法,我如何拆分输入矩阵,使每个 GPU processes/computes 输出矩阵的一部分然后 returns 返回。 例如。对于两个矩阵 A,B 每个 10x10 的顺序,然后计算输出矩阵 C= A x B,这样,在 100 个元素(10 x 10)中,50 个元素应该在第一个 GPU 和另一半上计算,即 50 到b 在第二个 GPU 中计算。 我正在尝试在 OpenCL 上实现它。但是,欢迎任何算法,这将帮助我想出解决方案。
一般来说,如果您有矩阵 X
(大小为 a
xb
,行在前)和 Y(大小为 b
xc
),
X * Y = vcat(X[0:a/2,0:b] * Y, X[a/2:a,0:b] * Y)
在这个伪代码中,vcat
是垂直连接(将一个矩阵放在彼此的顶部,例如一个 4x3 矩阵与 2x3 矩阵连接将产生一个 6x3 矩阵),:
表示范围和[]
正在编制索引。
vcat
的两个参数都可以在不同的 GPU 上计算,连接可以通过将输出指向输出缓冲区的不同子区域来实现(假设我们有 C 序数组)。 X
的初始分割可以通过使用不同的子区域来类似地实现(因为它是沿着一行分割的)。