MPI矩阵乘法

Posted

技术标签:

【中文标题】MPI矩阵乘法【英文标题】:MPI matrix multiplication 【发布时间】:2018-09-08 20:51:04 【问题描述】:

我正在尝试制作一个 MPI 矩阵乘法程序,但 scatter 函数似乎对我不起作用。只有一排分散,其余核心收到垃圾值。

在我之前调用 display_matrix() 函数时,我 MPI_Init() 似乎正在运行 4 个线程而不是 1 个(我有四核 CPU)。为什么甚至在初始化之前就会发生这种情况?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<mpi.h>

int **matrix_generator(int row,int col);
int **multiply_matrices(int **matrix_A,int **matrix_B,int rowsA, int colsA,int rowsB,int colsB);
void display_matrix(int **matrixA,int rows,int cols);

void main(int argc,char *argv[])

    srand(time(0));

    int **matrix_A,**matrix_B,**matrix_result,*scattered_matrix,*gathered_matrix, rowsA,colsA,rowsB,colsB,world_rank,world_size,i,j;

    rowsA = atoi(argv[1]);
    colsA = atoi(argv[2]);
    rowsB = atoi(argv[3]);
    colsB = atoi(argv[4]);

    scattered_matrix = (int *)malloc(sizeof(int) * rowsA*colsA/4); 

    if (argc != 5)
    
        fprintf(stderr,"Usage: mpirun -np <No. of processors> ./a.out <Rows A> <Columns A> <Rows B> <Columns B>\n");
        exit(-1);
    
    else if(colsA != rowsB)
    
        printf("Check the dimensions of the matrices!\n\n");
    

    matrix_A = matrix_generator(rowsA,colsA);
    matrix_B = matrix_generator(rowsB,colsB);

    display_matrix(matrix_A,rowsA,colsA);

    MPI_Init(&argc, &argv);

    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    MPI_Scatter(matrix_A, rowsA*colsA/4, MPI_INT, scattered_matrix, rowsA*colsA/4, MPI_INT, 0, MPI_COMM_WORLD);

    for(i=0;i<world_size;i++)
      
        printf("Scattering data %d from root to: %d \n",scattered_matrix[i],world_rank);
    

    MPI_Barrier(MPI_COMM_WORLD);

    MPI_Finalize();


int **matrix_generator(int row, int col)

    int i, j, **intMatrix;

    intMatrix = (int **)malloc(sizeof(int *) * row); 

    for (i = 0; i < row; i++)
    
        intMatrix[i] = (int *)malloc(sizeof(int *) * col);
        for (j = 0;j<col;j++)
        
            intMatrix[i][j]=rand()%10;
        
    
    return intMatrix;


void display_matrix(int **matrix, int rows,int cols)

    int i,j;
    for (i = 0; i < rows; i = i + 1)
    
        for (j = 0; j < cols; j = j + 1)
            printf("%d ",matrix[i][j]);
        printf("\n");
    

【问题讨论】:

欢迎来到 ***!矩阵的分配方式,一次一行,使其在内存中不连续,例如参见***.com/questions/25628321/…。此外,matrix_A 是指向行的指针,而 MPI_Scatter() 需要指向要分散的缓冲区的指针。因此,请尝试 MPI_Scatter(matrix_A[0],...) 或 MPI_Scatter(&matrix_A[0][0],...) 如您所见,我有一个可变大小的矩阵。如何将连续内存分配给可变大小的数组? 【参考方案1】:

主要问题是您的矩阵未分配在连续内存中(请参阅评论部分的链接)

MPI 标准没有指定在应用调用 MPI_Init() 之前会发生什么。

两个主要的 MPI 实现选择在调用 mpirun 时生成所有任务(这意味着首先有 4 个独立进程,当它们都调用 MPI_Init() 时它们“加入”到单个 MPI 作业中)。 话虽如此,曾几何时,供应商选择让 mpirun 启动单个 MPI 任务,并在调用 MPI_Init() 时使用自己的远程分叉。

归根结底,如果您想编写可移植代码,请在调用 MPI_Init() 之前尽可能少做(并且永远不要打印任何内容)。

【讨论】:

以上是关于MPI矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章

矩阵乘法 MPI 停止工作

MPI Java矩阵乘法错误

需要帮助使用 MPI 调试并行矩阵乘法

矩阵乘法 MPI 未编译

通过使用 MPI 创建 2d 拓扑的矩阵乘法

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