【问题标题】:scatterv and sendreceive of columns of a matrix in MPI [duplicate]MPI中矩阵列的scatterv和sendreceive [重复]
【发布时间】:2014-06-03 19:44:28
【问题描述】:

我的程序需要在进程之间分散一个矩阵。矩阵在内存中由一维数组表示。在我的第一个版本中,我将矩阵按行分散在进程之间。进程向彼此发送它们的局部矩阵的一些行,以便计算每个进程需要以适当方式进行的计算结果。进程使用 sendrecv 函数发送这些行。直到一切正常。

现在我想到,如果矩阵的列比行多得多,最好按列而不是行分散矩阵,以减少要发送的本地矩阵元素流程,并以这种方式提高程序的可扩展性。问题是......我怎样才能按列分散矩阵?然后......我如何选择正确的列以由进程发送给彼此?

【问题讨论】:

    标签: c++ c++11 parallel-processing mpi


    【解决方案1】:

    如果可能,请尝试将一维数组从行主要顺序更改为列主要顺序,将其分散并执行计算,接收它,然后将其从列主要顺序更改回行主要顺序。根据您的矩阵,来回转换的成本可能大于沿列并行化所节省的成本。请参阅 boost::multi_array 文档 (http://www.boost.org/doc/libs/1_55_0b1/libs/multi_array/doc/user.html#sec_storage)

    【讨论】:

    • 哦,是的...我可以直接按列主顺序保存它而无需转换,所以这很好。我现在必须考虑我的具体算法...是否有效。无论如何,谢谢。
    • 我设法实现了我想要的。现在的问题是,在我看来,可扩展性降低了。我唯一要做的就是创建另一个类似于第一个功能的功能。我检查行数是否高于列数,在这种情况下,我的矩阵以行主要顺序存储,我像以前一样运行算法。否则,我以列主要顺序保存矩阵并运行类似(相同但对偶)的算法。是否有可能仅添加一个 if 并选择要运行的函数会降低性能和可伸缩性?这在我看来很奇怪......
    • @user73793:你的算法是做什么的?它是否对行或列执行求和之类的计算?它是否仅适用于单个值而不是行或列?在不了解您的算法的情况下,我无话可说。
    • 它计算输入矩阵和内核之间的二维卷积,因此计算通过输入矩阵的所有元素。如果你愿意,我可以把我的代码发给你。
    • @user73793:如果代码不是太大,请编辑问题并粘贴代码。否则,请使用 pastebin.com 之类的服务并提供链接。
    猜你喜欢
    • 2015-03-19
    • 2016-08-03
    • 2014-06-03
    • 1970-01-01
    • 2013-12-23
    • 2017-10-12
    • 1970-01-01
    • 2018-03-02
    • 2018-09-08
    相关资源
    最近更新 更多