📄 domain.c
字号:
#include"mpi.h"
#include<stdio.h>
#include<math.h>
#include"time.h"
#define DATA_SIZE 500000
#define ITER 100000
#define INIT_DATA 10000
#define CONV 0.1
#define CPU 4
#define p DATA_SIZE/CPU
int main(int argc,char * argv[])
{
double data[p+2]={0.0},new_data[p+2]={0.0};
double a1,a2,a3,a4,time;
double starttime,endtime;
int i,restart,allrestart,iter;
double send_messp,send_mess1;
double recv_messp,recv_mess1;
int myid,procs;
MPI_Status status;
MPI_Init(& argc, & argv);
MPI_Comm_rank(MPI_COMM_WORLD, & myid);
MPI_Comm_size(MPI_COMM_WORLD, & procs);
/*GS algorithm go back!!!!!*/
/*init the data*/
if(myid==CPU-1)
{
data[p]=INIT_DATA;
new_data[p]=INIT_DATA;
}
starttime=MPI_Wtime();
for(iter=0; iter<ITER; iter++){
restart=0;
/*ji shu ci die dai*/
if((iter%2)==0){
if(myid==0)
{
new_data[p]=1.0/3*(2*data[p-1]+data[p+1]);
for(i=2; i<p; i++){
new_data[i]=0.5*(new_data[i-1]+data[i+1]);
}
}
else
if(myid==CPU-1)
{
new_data[1]=1.0/3*(2*data[0]+data[2]);
for(i=p-1; i>1; i--){
new_data[i]=0.5*(new_data[i+1]+data[i-1]);
}
}
else
if(myid%2==1)
{
new_data[1]=1.0/3*(2*data[0]+data[2]);
new_data[p]=1.0/3*(data[p-1]+2*data[p+1]);
for(i=p-1; i>1; i--){
new_data[i]=0.5*(new_data[i+1]+data[i-1]);
}
}
else
{
new_data[1]=1.0/3*(2*data[0]+data[2]);
new_data[p]=1.0/3*(data[p-1]+2*data[p+1]);
for(i=2; i<p; i++){
new_data[i]=0.5*(new_data[i-1]+data[i+1]);
}
}
// #pragma omp for
for(i=1;i<=p;i++){
a1=new_data[i]-data[i];
if(a1>CONV)
restart=1;
}//endfor
}//end if
if(iter%2==1){
if(myid==0)
{
new_data[p]=1.0/3*(2*data[p-1]+data[p+1]);
for(i=p-1; i>1; i--){
new_data[i]=0.5*(new_data[i+1]+data[i-1]);
}
}
else
if(myid==CPU-1)
{
new_data[1]=1.0/3*(2*data[0]+data[2]);
for(i=2; i<p; i++){
new_data[i]=0.5*(new_data[i-1]+data[i+1]);
}
}
else
if(myid%2==0)
{
new_data[1]=1.0/3*(2*data[0]+data[2]);
new_data[p]=1.0/3*(data[p-1]+2*data[p+1]);
for(i=p-1; i>1; i--){
new_data[i]=0.5*(new_data[i+1]+data[i-1]);
}
}
else
{
new_data[1]=1.0/3*(2*data[0]+data[2]);
new_data[p]=1.0/3*(data[p-1]+2*data[p+1]);
for(i=2; i<p; i++){
new_data[i]=0.5*(new_data[i-1]+data[i+1]);
}
}
// #pragma omp for
for(i=1;i<=p;i++){
a1=new_data[i]-data[i];
if(a1>CONV)
restart=1;
}//endfor
}//end for
allrestart=0;
MPI_Reduce(&restart,&allrestart,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
MPI_Bcast(&allrestart,1,MPI_INT,0,MPI_COMM_WORLD);
if(allrestart==0)
{
// if(myid==0)
// {
endtime=MPI_Wtime();
printf("\n====================iter is over!!!! iter==%d=============\n",iter);
printf("\n====================time == %.6f===================\n",endtime-starttime);
// }
break;
}
else
{
for(i=1; i<=p ;i++)
data[i]= new_data[i];
}//end else
if(myid<CPU-1)
{
send_messp=data[p-1];
MPI_Send(&send_messp,1,MPI_DOUBLE,myid+1,0,MPI_COMM_WORLD);
MPI_Recv(&recv_mess1,1,MPI_DOUBLE,myid+1,99,MPI_COMM_WORLD,&status);
data[p+1]=recv_mess1;
}
if(myid!=0)
{
send_mess1=data[2];
MPI_Send(&send_mess1,1,MPI_DOUBLE,myid-1,99,MPI_COMM_WORLD);
MPI_Recv(&recv_messp,1,MPI_DOUBLE,myid-1,0,MPI_COMM_WORLD,&status);
data[0]=recv_messp;
}
}
printf("\n======================the points are:==========================\n");
if(myid==CPU-1)
for(i=p-100;i<=p;i++)
{
printf(" data[%d]=%f ",i,data[i]);
}
printf("\n=================the end======================================\n");
MPI_Finalize();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -