• 大小: 5KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-27
  • 语言: 其他
  • 标签: MPI  LU分解  

资源简介

对于一个n阶的非奇异矩阵A,其LU分解是求一个主对角元素全为1的下三角矩阵L与上三角矩阵U,使A=LU。

资源截图

代码片段和文件信息

#include “stdio.h“
#include “stdlib.h“
#include “mpi.h“
#define a(xy) a[x*M+y]
/*A为M*M矩阵*/
#define A(xy) A[x*M+y]
#define l(xy) l[x*M+y]
#define u(xy) u[x*M+y]
#define floatsize sizeof(float)
#define intsize sizeof(int)

int MN;
int m;
float *A;
int my_rank;
int p;
MPI_Status status;

void fatal(char *message)
{
    printf(“%s\n“message);
    exit(1);
}

void Environment_Finalize(float *afloat *f)
{
    free(a);
    free(f);
}

int main(int argc char **argv)
{
    int ijkmy_rankgroup_size;
    int i1i2;
    int vw;
    float *a*f*l*u;
    FILE *fdA;

    MPI_Init(&argc&argv);
    MPI_Comm_size(MPI_COMM_WORLD&group_size);
    MPI_Comm_rank(MPI_COMM_WORLD&my_rank);

    p=group_size;

    if (my_rank==0)
    {
        fdA=fopen(“dataIn.txt““r“);
        fscanf(fdA“%d %d“ &M &N);
        if(M != N)
        {
            puts(“The input is error!“);
            exit(0);
        }
        A=(float *)malloc(floatsize*M*M);
        for(i = 0; i < M; i ++)
            for(j = 0; j < M; j ++)
                fscanf(fdA “%f“ A+i*M+j);
        fclose(fdA);
printf(“Input of file \“dataIn.txt\“\n“);
        printf(“%d\t %d\n“M N);
        for(i=0;i        {
            for(j=0;j                printf(“%f\t“A(ij));
            printf(“\n“);
        }
    }

    /*0号进程将M广播给所有进程*/
    MPI_Bcast(&M1MPI_INT0MPI_COMM_WORLD);
    m=M/p;
    if (M%p!=0) m++;

    /*分配至各进程的子矩阵大小为m*M*/
    a=(float*)malloc(floatsize*m*M);

    /*各进程为主行元素建立发送和接收缓冲区*/
    f=(float*)malloc(floatsize*M);

    /*0号进程为l和u矩阵分配内存,以分离出经过变换后的A矩阵中的l和u矩阵*/
    if (my_rank==0)
    {
        l=(float*)malloc(floatsize*M*M);
        u=(float*)malloc(floatsize*M*M);
    }

    /*0号进程采用行连续划分将矩阵A划分为大小m*M的p块子矩阵,依次发送给1至p-1号进程*/
    if (a==NULL) fatal(“allocate error\n“);

    if (my_rank==0)
    {
        for(i=0;i            for(j=0;j                a(ij)=A(ij);
        for(i=m;i        {
            i1=i/m;
            i2=i%m+1;
            MPI_Send(&A(i0)MMPI_FLOATi1i2MPI_COMM_WORLD);
        }
    }
    else
    {
        for(i=0;i            MPI_Recv(&a(i0)MMPI_FLOAT0i+1MPI_COMM_WORLD&status);
    }

    for(i=0

评论

共有 条评论