⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 power.c

📁 《并行算法实践》附带的mpi源程序
💻 C
字号:
#include "stdio.h"#include "stdlib.h"#include "mpi.h"#include "math.h"#define E 0.0001#define a(x,y) a[x*size+y]#define b(x) b[x]#define v(x) v[x]#define A(x,y) A[x*size+y]#define V(x) V[x]#define intsize sizeof(int)#define floatsize sizeof(float)#define charsize sizeof(char)int size,N;int m;float *A;float *V;                                         /* store the value x */double starttime;double time1;double time2;int my_rank;int p;MPI_Status status;FILE *fdA,*fdB;void Environment_Finalize(float *a,float *b,float *v){    free(a);    free(b);    free(v);}int main(int argc, char **argv){    int i,j,my_rank,group_size;    float sum;    float *b;    float *v;    float *a;    float differ,max,localmax,oldmax;    int loop;    loop=0;    differ=1.0;    oldmax=0.0;    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)    {        starttime=MPI_Wtime();        fdA=fopen("dataIn.txt","r");        fscanf(fdA,"%d %d", &size, &N);        if (size != N-1)        {            printf("the input is wrong\n");            exit(1);        }        A=(float *)malloc(floatsize*size*size);        V=(float *)malloc(floatsize*size);        for(i = 0; i < size; i++)        {            for(j = 0; j < size; j++)            {                fscanf(fdA,"%f", A+i*size+j);            }            fscanf(fdA,"%f", V+i);        }        fclose(fdA);        printf("Input of file \"dataIn.txt\"\n");        printf("%d\t%d\n", size, N);        for(i = 0; i < size; i ++)        {            for(j = 0; j < size; j ++) printf("%f\t",A(i,j));            printf("%f\n",V(i));        }        printf("\n");        printf("Output of running\n");    }    MPI_Bcast(&size,1,MPI_INT,0,MPI_COMM_WORLD);    m=size/p;if (size%p!=0) m++;    v=(float *)malloc(floatsize*size);    a=(float *)malloc(floatsize*m*size);    b=(float *)malloc(floatsize*m);    if (a==NULL||b==NULL||v==NULL)        printf("allocate space  fail!");    if (my_rank==0)    {        for(i=0;i<size;i++)            v(i)=V(i);    }    MPI_Bcast(v,size,MPI_FLOAT,0,MPI_COMM_WORLD);    if (my_rank==0)    {        for(i=0;i<m;i++)            for(j=0;j<size;j++)                a(i,j)=A(i,j);    }    if (my_rank==0)    {        for(i=1;i<p;i++)            MPI_Send(&(A(m*i,0)),m*size,MPI_FLOAT,i,i,MPI_COMM_WORLD);        free(A);free(V);    }    else        MPI_Recv(a,m*size,MPI_FLOAT,0,my_rank,MPI_COMM_WORLD,&status);    time1=MPI_Wtime();    while (differ>E)                              /* computing start */    {        for(i=0;i<m;i++)        {            sum=0.0;            for(j=0;j<size;j++)                sum=sum+a(i,j)*v(j);            b(i)=sum;        }        localmax=fabs(b(0));        for(i=1;i<m;i++)            if (fabs(b(i))>localmax)                localmax=fabs(b(i));        MPI_Allreduce(&localmax,&max,1,MPI_FLOAT,MPI_MAX,MPI_COMM_WORLD);        for(i=0;i<m;i++)            b(i)=b(i)/max;        MPI_Allgather(b,m,MPI_FLOAT,v,m,MPI_FLOAT,MPI_COMM_WORLD);        differ=fabs(max-oldmax);        oldmax=max;        loop++;        if (my_rank==0)            printf("%2d th  differ=%f\n",loop,differ);    }                                             /* while */    time2=MPI_Wtime();    if (my_rank==0)    {        printf("the envalue is %f\n\n",max);        printf("Iteration num = %d\n",loop);        printf("Whole running time    = %f s\n",time2-starttime);        printf("Distribute data time  = %f s\n",time1-starttime);        printf("Parallel compute time = %f s\n",time2-time1);    }    MPI_Barrier(MPI_COMM_WORLD);    MPI_Finalize();    Environment_Finalize(a,b,v);    return (0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -