資源簡介
對于一個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?????????????for(j?=?0;?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
評論
共有 條評論