MPI C 将矩阵逐行发送到所有进程子进程 (MPI_COMM_SPAWN)

Posted

技术标签:

【中文标题】MPI C 将矩阵逐行发送到所有进程子进程 (MPI_COMM_SPAWN)【英文标题】:MPI C send a matrix line by line to all process childrens (MPI_COMM_SPAWN) 【发布时间】:2018-03-16 09:04:57 【问题描述】:

我有一个父进程和一个矩阵,我想为每一行创建一个子进程并将其发送到相应的进程行。

父进程代码:

int tag = 0;
MPI_Status status;

int random(int n) 
    return rand() % n;


float** generate_matrix(int n, int m) 
    int i, j;
    float **x;
    x = (float **) malloc(m * sizeof(float));
    for (i = 0; i < m; i++) 
        x[i] = (float *) malloc(n * sizeof(float));
    
    for (i = 0; i < m; i++) 
        for (j = 0; j < n; j++) 
            x[i][j] = random(100);
        
    
    return x;

int main(int argc, char** argv) 

    int my_rank;
    int num_procs;
    MPI_Comm workercomm;
    int n = 4, m = 5;
    float**matrix = generate_matrix(n, m);

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &num_procs);

    MPI_Comm_spawn("C:/Users/colegnou/workspace/worker/Debug/worker.exe",
    MPI_ARGV_NULL, m,
    MPI_INFO_NULL, 0, MPI_COMM_SELF, &workercomm, MPI_ERRCODES_IGNORE);

    for (int i = 0; i < m; i++) 
        MPI_Bcast(matrix[i], n, MPI_FLOAT, MPI_ROOT, workercomm);
    
    MPI_Finalize();
    return 0;

和工人代码:

int tag = 0;
MPI_Status status;

int main(int argc, char** argv) 

    MPI_Init(&argc, &argv);
    MPI_Comm parent;
    MPI_Comm_get_parent(&parent);
    int myid;
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);

    int n = 4;
    float*vector = (float *) malloc(n * sizeof(float));

    if (parent != MPI_COMM_NULL) 
        MPI_Bcast(vector, n, MPI_FLOAT, MPI_ROOT, parent);
    
    printf("%d ->", myid);
    for (int i = 0; i < n; i++) 
        printf("%f ", vector[i]);
    
    printf("\n");

    MPI_Comm_free(&parent);
    free(vector);
    MPI_Finalize();
    return 0;

但我希望每个子进程都在 matrix 中逐行打印他的相应输出,而不是输出: ..................................................... ....................................

  4 ->0.000000 0.000000 0.000000 0.000000
    1 ->0.000000 0.000000 0.000000 0.000000
    3 ->0.000000 0.000000 0.000000 0.000000
    0 ->0.000000 0.000000 0.000000 0.000000
    2 ->0.000000 0.000000 0.000000 0.000000

谢谢!!

【问题讨论】:

【参考方案1】:

在工作代码中,您应该使用root=0 而不是MPI_ROOT

使用内部通信器时,请随意重新阅读MPI_Bcast() 的定义 https://www.open-mpi.org/doc/v2.1/man3/MPI_Bcast.3.php

注意矩阵的分配不正确,应该malloc(m * sizeof(float *))代替。

您还应该在工作器中执行m 广播,除非您正在寻找MPI_Scatter()(在这种情况下,您应该分配一个连续的二维矩阵)

【讨论】:

感谢帮助,但它只向所有进程发送矩阵的第一行:D 这是MPI_Bcast() 所做的,你可能需要MPI_Scatter()

以上是关于MPI C 将矩阵逐行发送到所有进程子进程 (MPI_COMM_SPAWN)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C MPI 中发送指向数组的指针数组

矩阵乘法与 mpi

使用 MPI_Send 和 MPI_Recv 未正确接收矩阵

创建一个不是创建进程子进程的新进程

MPI 和 C 中的矩阵向​​量乘法

块输出的 MPI 矩阵