• 大小: 5KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-03
  • 语言: 其他
  • 标签: MPI矩阵  

资源简介

通过减少问题规模形式,做并行计算,求解矩阵相乘问题,mpi,MPI,思想是将第一个矩阵分块,每个进程只计算矩阵的几行,最终传给主进程吗、,主进程输出结果

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include   
#define N 8192                     //矩阵的阶数  
#define MASTER 0                  //主进程号  
#define FROM_MASTER 1             //设置消息类型  
#define FROM_WORKER 2             //设置消息类型  
MPI_Status status;  
void main(int argcchar **argv)  
{  
    int numtasks                   //进程总数  
         taskid                    //进程标识  
         numworkers                //从进程数目  
         source                    //消息源  
         dest                      //消息目的地  
         nbytes  
         mtype                     //消息类型  
         rows                       
         averowextraoffset       //从进程所分的行数  
         ijkt  
         count;  
   double A[N][N]B[N][N];  
   long long C[N][N];  
   long long sumand = 0;           //求的乘积矩阵的所有元素的和  
   double starttimeendtime;  
   MPI_Init(&argc&argv);   // 初始化MPI环境  
   MPI_Comm_rank(MPI_COMM_WORLD&taskid);//标识各个MPI进程 ,告诉调用该函数进程的当前进程号  
   MPI_Comm_size(MPI_COMM_WORLD&numtasks);//用来标识相应进程组中有多少个进程  
   numworkers = numtasks-1;     //从进程数目  
  
/* 程序采用主从模式,以下为主进程程序 */  
     
if(taskid==MASTER)  
{  
    printf(“--------主进程开始对矩阵A、B初始化\n“);  
    //对A矩阵B矩阵 进行初始化赋值  
    for(i=0;i    {  
        t = i + 1;   
        for(j=0;j        {  
           A[i][j]= t ++ ;  
           B[i][j]= 1;  
        }  
    }  
    printf(“--------主进程开始对从进程发送数据\n“);  
   starttime = MPI_Wtime();
 /*将数据(A矩阵B矩阵)发送到从进程*/  
    averow=N/numworkers;   // 每个从进程所得到的行数  
    extra=N%numworkers;  
    offset=0;  
    mtype=FROM_MASTER;  
    for(dest=1;dest<=numworkers;dest++)  
    {  
        rows=(dest<=extra)?  averow+1:averow;  
        //发送标识每个从进程开始寻找数据矩阵的偏移地址  
        MPI_Send(&offset1MPI_INTdestmtypeMPI_COMM_WORLD);  
        //发送每个从进程需要计算的行数  
        MPI_Send(&rows1MPI_INTdestmtypeMPI_COMM_WORLD);  
        //发送每个从进程 count=rows*N 比特流偏移量  
        count=rows*N;  
        //发送 矩阵 A  
        MPI_Send(&A[offset][0]countMPI_DOUBLEdestmtypeMPI_COMM_WORLD);

评论

共有 条评论

相关资源