并行矩阵产品

时间:2010-12-08 21:58:15

标签: algorithm matrix parallel-processing mpi

为了在并行模式下计算2个矩阵A和B(nxm维度)之间的乘积,我有以下限制:服务器向每个客户端发送矩阵A中的多个行,以及来自矩阵A的多个行矩阵B.这不能改变。此外,客户端可以在彼此之间交换信息,以便计算矩阵产品,但是他们不能要求服务器发送任何其他数据。

这应该尽可能最有效地完成,这意味着通过最小化进程之间发送的消息数量 - 被视为昂贵的操作 - 并尽可能地并行进行小型计算。

根据我的研究,实际上客户端之间交换的最大数量的消息是n ^ 2,以防每个进程向其他所有进程广播其行。现在,问题在于如果我最小化发送的消息数量 - 这将是用于分配输入数据的log(n) - 但计算只能由一个或多个进程完成,但无论如何,它不是不再是并行完成的,这是问题的主要思想。

什么是更有效的算法,可以计算这个产品?

(我正在使用MPI,如果它有任何区别)。

3 个答案:

答案 0 :(得分:5)

要逐个元素计算矩阵乘积C = A x B,您只需计算C(i,j) = dot_product(A(i,:),B(:,j))即可。也就是说,C的(i,j)元素是A的第i行和B的第j列的点积。

如果你坚持发送A行和B行,那么你将很难编写一个性能超过简单串行程序的并行程序。相反,你应该做的是将A行和B行发送到处理器以计算C的元素。如果你被限制发送A行和B行,那么我建议你这样做,但计算服务器上的产品。也就是说,忽略所有工作者处理器并只是连续执行计算。

一种替代方案是在工作处理器上计算部分点积并累积部分结果。这需要一些棘手的编程;它可以完成,但是如果你第一次尝试编写一个优于(执行速度)简单串行程序的程序,我会非常惊讶。

(是的,还有其他分解矩阵矩阵产品用于并行执行的方法,但它们比上述更复杂。如果你想研究它们,那么Matrix Computations就是开始阅读的地方。)< / p>

您还需要仔细考虑您提出的效率衡量标准 - 最有效的消息传递程序将是不传递任何消息的程序。如果消息传递的成本远远超过计算成本,那么两个度量的无消息传递实现将是最有效的。一般来说,并行程序效率的衡量标准是加速比与处理器数量的比率:因此8个处理器的8倍加速是非常有效的(并且通常无法实现)。

如上所述,你的问题不是一个明智的问题。问题设定者错误地指定了它,或者您错误地说明(或误解了)正确的规范。

答案 1 :(得分:0)

有些东西不对:如果两个矩阵都有n x m维,那么它们就不能相乘(除非n = m)。在A * B的情况下,A必须具有与B具有行一样多的列。你确定服务器没有发送B转换行吗?这相当于从B发送列,在这种情况下解决方案是微不足道的。

假设所有这些检出,并且您的客户确实从A和B获得行:可能最简单的解决方案是每个客户端将其行矩阵B发送到客户端#0,客户端#0重新组合原始矩阵B,然后将其列发送回其他客户端。基本上,客户端#0将充当实际知道如何有效分解数据的服务器。这将是2*(n-1)消息(不包括用于重新组合产品矩阵的消息),但考虑到您已经需要n消息在客户端之间分发A和B矩阵,没有显着的性能损失(它仍然是O(n)条消息。

这里最大的瓶颈显然是矩阵B的初始收集和重新分配,矩阵B的扩展非常可怕,所以如果你有相当小的矩阵和很多进程,你可能最好在服务器上串行计算产品。

答案 2 :(得分:0)

我不知道这是否是作业。但如果它不是作业,那么你应该使用一个库。一个想法是scalapack

http://www.netlib.org/scalapack/scalapack_home.html

Scalapack在fortran中写入,但您可以从c ++中调用它。