【问题标题】:MPI_Scatter: Why do I have to allocate memory in all the processes?MPI_Scatter:为什么我必须在所有进程中分配内存?
【发布时间】:2014-03-14 09:17:30
【问题描述】:

我正在处理使用 MPI(在 c++ 中)并行化 Conways 的生命游戏。我必须从输入中读取一个(非常大的)矩阵,然后将其按行分散在切片中,然后并行处理每个切片。我遵循的想法是只让一个进程处理 I/O 内容。特别是,进程 0 从文件中读取并将初始数据保存到一个 RxC 矩阵中,以分散在 (R/P)xC“切片矩阵”中的进程中。 现在,当我执行例程 MPI_Scatter 时,编译器抱怨,因为“大矩阵”仅在第一个进程中分配。为了让事情顺利进行,我必须在所有过程中分配大矩阵,即使这些仍然是空白的。这是普通的,还是我做错了什么?有没有办法避免为每个进程分配一个空白的、无用的矩阵? 谢谢各位!

【问题讨论】:

  • 将每个单独的 MPI 进程视为具有自己的变量、地址空间、的单独程序。如果您想在进程的内存中使用变量(例如数组),那么是的,您当然必须在该进程的内存中为其分配空间。但是,一般来说,您不应该在每个进程的内存中为全局数组分配空间,而只为数组的本地部分分配空间。通过您非常合理的程序设计,您可以将数组读取到进程 0,然后将(消息传递)切片发送到每个将要完成工作的进程。

标签: c++ matrix parallel-processing mpi scatter


【解决方案1】:

您不需要在任何地方分配“大矩阵”,但MPI_SCATTER 确实需要您在所有等级上分配一些内存。

如果您要像这样分散数据:

分散前:

rank 0 - 1 2 3 4

分散后:

rank 0 - 1
rank 1 - 2
rank 2 - 3
rank 3 - 4

您需要在每个等级上为一个 int 分配空间(而不是全部 4 个)。

【讨论】:

    【解决方案2】:

    你不必到处分配大矩阵,但是大矩阵变量需要到处声明。试试这个:

    int* big_matrix;
    if(process_id == 0) {
        big_matrix = (int*) malloc(big_number * sizeof(int));
        // fill the big matrix with values
    }
    int* part_of_matrix = (int*) malloc(small_number * sizeof(int));
    MPI_Scatter(big_matrix, small_number, MPI_INT, part_of_matrix, small_number, MPI_INT, 0, MPI_COMM_WORLD);
    

    至少这是在 C 中执行此操作的一种方法。您可能必须将 big_matrix 初始化为 0 或在 C++ 中。

    【讨论】:

    • 抱歉,我有一个疑问,声明不应该是int** big_matrix 吗?
    猜你喜欢
    • 1970-01-01
    • 2011-01-10
    • 2012-01-29
    • 2020-06-04
    • 2013-06-18
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多