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

资源简介

并行计算大作业,MPI矩阵转置,效果很好

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#define MAX 5001
using namespace std;

int pnummlnfirst[MAX][MAX]*tmp;
double t_start t_end;
int ans[MAX][MAX];
MPI_Status status;

int main(int argc char* argv[]){
    int my_rankgroup_size;
    int i jp1p2xyt;

    n = atoi(argv[1]);
    MPI_Init(&argc&argv);
    MPI_Comm_size(MPI_COMM_WORLD&group_size);
    MPI_Comm_rank(MPI_COMM_WORLD&my_rank);
    pnum = group_size;
    m = sqrt(pnum);
    l = n/m;

    tmp = (int *)malloc(sizeof(int)*l*l);
    if(my_rank == 0){

        FILE *fp = fopen(“Parallel_compumatrix.txt““r“);
        if(!fp){
            printf(“error“);
            exit(1);
        }
        else
        {
            for(i = 0; i < n; i++){
                for(j = 0; j < n; j++){
                    fscanf(fp“%d “&(first[i][j]));
                    //printf(“%2d “first[i][j]);
                }
                //printf(“\n“);
            }
            fclose(fp);
        }

        t_start = MPI_Wtime();
        for(i = 0; i < m; i++){
            for(j = 0; j < m; j++){
                p1 = j*l p2 = i*l;
                //printf(“%d is sending.\n“i*m+j);
                for(x = 0; x < l; x++){
                    for(y = 0;y < l; y++){
                        tmp[x*l+y] = first[p1][p2];
                        p2++;
                        //printf(“%2d “tmp[x*l+y]);
                    }
                    //printf(“\n“);
                    p1++;
                    p2 = i*l;
                }
                if(i!=0 || j!=0)
                    MPI_Send(tmpl*lMPI_INTi*m+ji*m+jMPI_COMM_WORLD);

            }
        }
    }
    //所有进程给主进程发自己转置部分的数组
    else{    //printf(“l = %d“l);
        MPI_Recv(tmpl*lMPI_INT0my_rankMPI_COMM_WORLD&status);
        int t;
        for(i = 0; i < l; i++){
            for(j = i+1; j < l; j++){
                t = tmp[i*l+j];
                tmp[i*l+j] = tmp[j*l+i];
                tmp[j*l+i] = t;
            }
        }
        MPI_Send(tmpl*lMPI_INT0my_rankMPI_COMM_WORLD);
    }

    if(my_rank==0){
        for(i = 0; i < l; i++){
            for(j = 0; j < l; j++){
                ans[i][j] = first[j][i];

            }
        }
        for(i = 0; i < m; i++){
            for(j = 0; j < m; j++){
                if(i!=0 || j!=0){
                    MPI_Recv(tmpl*lMPI_INTi*m+ji*m+jMPI_COMM_WORLD&status);
                    for(x = 0; x < l; x++){
                        for(y = 0; y < l; y++){
                            ans[i*l+x][j*l+y] = tmp[x*l+y];
                        }
                    }
                }
            }
        }
    }

    t_end = MPI_Wtime();
    if (my_rank==0)
    {
        printf(“Matrix order:%d Time cost:%lf\n“nt_end-t_start);
    }
    free(tmp);
    MPI_Barrier(MPI_COMM_WORLD);
    MPI_Finalize(

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-04-18 23:57  实验三\
     文件       17324  2017-04-07 16:51  实验三\hw3
     文件        3025  2017-04-18 23:57  实验三\hw3.cpp
     文件        1130  2017-04-07 08:44  实验三\hw3.o46502
     文件        1130  2017-04-07 08:45  实验三\hw3.o46506
     文件        1130  2017-04-07 08:45  实验三\hw3.o46508
     文件        1130  2017-04-07 09:36  实验三\hw3.o46535
     文件        1835  2017-04-07 16:51  实验三\t3.pbs
     文件      612165  2017-04-20 20:54  实验报告三.pdf

评论

共有 条评论