【问题标题】:Matrix multiplication MPI [closed]矩阵乘法 MPI
【发布时间】:2017-10-30 23:08:07
【问题描述】:

在大学里,我被要求在一个实验室进行并行编程:并行化矩阵的乘法。我写了一个类似于示例的算法,但实现提供了一个断点。请告诉我,我能解决什么问题?

#define _CRT_SECURE_NO_WARNINGS
#include <cstdlib>
#include <iostream> 
#include <math.h> 
#include "mpi.h" 
#include <stdio.h>
const int N=4; 
int main(int argc, char *argv[]) {
    int r,q,myid,numprocs;
    int i0;
    int *b,*c,*loc_a,*loc_c;
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);
    MPI_Status status;
    q=N/numprocs;
    b=new int [N*N];
    c=new int [N*N];
    loc_c=new int[N*N];
    loc_a=new int[q];
    for(int i=0;i<N*N;i++)     {
        c[i]=0;      loc_c[i]=0;     
    }     
    if(myid==0)     {
        for (int j = 0; j<numprocs; j++) {
            for (r = 0; r<q*N; r++) {
                loc_a[r] = 1; 
            }        
            MPI_Send(&loc_a[0], q*N, MPI_INT, j, 0, MPI_COMM_WORLD); 
        }      
        for (int i = 0; i<N*N; i++) { 
            b[i] = 1; 
        }        
    }     
    MPI_Recv(&loc_a[0], q*N, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
    for (r = 0; r<N; r++) {
        MPI_Bcast(&b[r*N], N, MPI_INT, 0, MPI_COMM_WORLD);
        i0 = myid*q;
        for (int i = 0; i<q; i++) {
            for (int j = 0; j<N; j++) {
                loc_c[r*N + i0] += loc_a[i*N + j] * b[r*N + j]; 
            }      
            i0++; 
        }     
        MPI_Reduce(loc_c, c, N*N, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); 
    }     
    if (myid == 0) {
        FILE *f = fopen("result.txt", "w");
        for (int i = 0; i<N; i++) {
            for (int j = 0; j<N; j++) {
                fprintf(f, "%d\t", c[j*N + i]); 
            }       
            fprintf(f, "\n"); 
        }     
        fclose(f); 
    }
return 0; 
MPI_Finalize(); 
}

【问题讨论】:

  • 调试代码,至少告诉我们一行
  • 作业中止:[ranks] 消息 [0] 致命错误 MPI_Send 中的致命错误:其他 MPI 错误,错误堆栈:MPI_Send(buf=0x00277FE8, count=16, MPI_INT, dest=0, tag= 0, MPI_COMM_WORLD) 失败 DEADLOCK: 试图在没有匹配接收的情况下向本地进程发送消息

标签: c++ matrix mpi matrix-multiplication


【解决方案1】:

你得到的错误信息看起来很简单:

您正在以自身为目标 (myid == 0andj == 0) 的进程上调用阻塞 MPI_SEND,而没有先调用非阻塞 RECV,这意味着您的进程将在继续之前无限等待自己接收消息,导致死锁。

您有多种选择,具体取决于您的目标:

  1. 先调用非阻塞recv

  2. 不要使用 MPI_Send 发送给自己(检查是否为my_id == j,如果为真则不要发送)

【讨论】:

  • 感谢有用的回答,第一选择有效。
猜你喜欢
  • 2013-12-23
  • 2018-09-08
  • 2012-11-04
  • 2014-04-21
  • 2015-04-03
  • 2017-10-12
  • 2016-01-23
  • 2013-03-05
  • 2017-07-18
相关资源
最近更新 更多