Example #1
0
int main(int argc,char * argv[])
{
	int rank,size,i;
	MPI_Init(&argc,&argv);
	MPI_Comm_rank(MPI_COMM_WORLD,&rank);
	MPI_Comm_size(MPI_COMM_WORLD,&size);
	if(rank==0)
	{
		if(!readFromFile())
			exit(-1);
		if(size>2*variableNum)
		{
			printf("Too many Processors,reduce your -np value \n");
			MPI_Abort(MPI_COMM_WORLD,1);
		}
		beginTime=MPI_Wtime();
		for(int i=1;i<size;i++)
		{
		MPI_Send(&variableNum,1,MPI_INT,i,V_TAG,MPI_COMM_WORLD);
		MPI_Send(p,variableNum*2,MPI_DOUBLE,i,P_TAG,MPI_COMM_WORLD);
		}
		
		addTransTime(MPI_Wtime()-beginTime);
	}
	else
	{
	    MPI_Recv(&variableNum,1,MPI_INT,0,V_TAG,MPI_COMM_WORLD,&status);
	    MPI_Recv(p,variableNum*2,MPI_DOUBLE,0,P_TAG,MPI_COMM_WORLD,&status);
	}
	int wLength=2*variableNum;
	for(i=0;i<wLength;i++)
	{
		w[i].real=cos(i*2*PI/wLength);
		w[i].imag=sin(i*2*PI/wLength);
	}
	int everageLength=wLength/size;
	int moreLength=wLength%size;
	int startPos=moreLength+rank*everageLength;
	int stopPos=startPos+everageLength-1;
	if(rank==0)
	{
		startPos=0;
		stopPos=moreLength+everageLength-1;
	}
	evaluate(p,0,variableNum-1,w,s,startPos,stopPos,wLength);
       
	if(rank>0)
	{
		MPI_Send(s+startPos,everageLength*2,MPI_DOUBLE,0,S_TAG,MPI_COMM_WORLD);
		MPI_Recv(s,wLength*2,MPI_DOUBLE,0,S_TAG2,MPI_COMM_WORLD,&status);
	}
	else
	{
		double tempTime=MPI_Wtime();
		for(i=1;i<size;i++)
		{
			MPI_Recv(s+moreLength+i*everageLength,everageLength*2,MPI_DOUBLE,i,S_TAG,MPI_COMM_WORLD,&status);
		}
		for(i=1;i<size;i++)
		{
			MPI_Send(s,wLength*2,MPI_DOUBLE,i,S_TAG2,MPI_COMM_WORLD);
		}
	      printf("The final results :\n");
	      printres(s,wLength);
		addTransTime(MPI_Wtime()-tempTime);
	}	
	if(rank==0)
	{
	        totalTime=MPI_Wtime();
	        totalTime-=beginTime;
		printf("\nUse prossor size=%d\n",size);
		printf("Total running time=%f(s)\n",totalTime);
		printf("Distribute data time = %f(s)\n",transTime);
		printf("Parallel compute time = %f(s)\n ",totalTime-transTime);
	}
	MPI_Finalize();
	return 0;
}
Example #2
0
int main(int argc,char * argv[])
{
	int rank,size,i;

	MPI_Init(&argc,&argv);
	MPI_Comm_rank(MPI_COMM_WORLD,&rank);
	MPI_Comm_size(MPI_COMM_WORLD,&size);

	// 分发数据
	if(rank==0)
	{
		// 0# 进程从文件读入多项式p的阶数和系数序列
		if(!readFromFile())
			exit(-1);

		// 进程数目太多,造成每个进程平均分配不到一个元素,异常退出
		if(size>2*variableNum)
		{
			printf("Too many Processors,reduce your -np value \n");
			MPI_Abort(MPI_COMM_WORLD,1);
		}

		beginTime=MPI_Wtime();

		// 0#进程把多项式的阶数,p发送给其它进程
		sendOrigData(size);

		// 累计传输时间
		addTransTime(MPI_Wtime()-beginTime);

	}
	else // 其它进程接收进程0发送来的数据,包括variableNum、数组p
	{
		recvOrigData();
	}

	// 初始化数组w,用于进行傅立叶变换
	int wLength=2*variableNum;
	for(i=0;i<wLength;i++)
	{
		w[i].r=cos(i*2*PI/wLength);
		w[i].i=sin(i*2*PI/wLength);
	}

	// 划分各个进程的工作范围 startPos ~ stopPos
	int everageLength=wLength/size; // 8/2=4 (假设有两个进程)
	int moreLength=wLength%size; // 8%2=0
	int startPos=moreLength+rank*everageLength; // 0+0*4=0; 0+1*4=4;
	int stopPos=startPos+everageLength-1; // 0+4-1=3; 4+4-1=7;
	//[0,1,2,3,4,5,6,7], 片段: [0,3], [4,7]

	if(rank==0)
	{
		startPos=0; // 0
		stopPos=moreLength+everageLength-1; // 0+4-1=3
	}

    // 对p作FFT,输出序列为s,每个进程仅负责计算出序列中位置为 startPos 到 stopPos 的元素
	evaluate(p,0,variableNum-1,w,s,startPos,stopPos,wLength);
	// p 原始序列
	// 0 原始序列在数组f中的第一个下标
	// variableNum-1 原始序列在数组f中的最后一个下标
	// w 存放单位根的数组,其元素为w,w^2,w^3...
	// s 输出序列
	// startPos 所负责计算输出的y的片断的起始下标
	// stopPos 所负责计算输出的y的片断的终止下标
	// wLength s的长度
	
	printf("partial results, process %d.\n",rank);	
	myprint(s,wLength); // 输出每个进程的结果(部分结果)
	
	// 各个进程都把s中自己负责计算出来的部分发送给进程0,并从进程0接收汇总的s
	if(rank>0)
	{
		MPI_Send(s+startPos,everageLength*2,MPI_DOUBLE,0,S_TAG,MPI_COMM_WORLD);
		MPI_Recv(s,wLength*2,MPI_DOUBLE,0,S_TAG2,MPI_COMM_WORLD,&status);
	}
	else // 进程0接收s片段,向其余进程发送完整的s
	{
		double tempTime=MPI_Wtime();

		// 进程0接收s片段
		for(i=1;i<size;i++)
		{
			MPI_Recv(s+moreLength+i*everageLength,everageLength*2,MPI_DOUBLE,i,S_TAG,MPI_COMM_WORLD,&status);
		}

		//进程0向其余进程发送完整的结果s	
		for(i=1;i<size;i++)
		{
			MPI_Send(s,wLength*2,MPI_DOUBLE,i,S_TAG2,MPI_COMM_WORLD);
		}

		printf("The final results :\n");
		printres(s,wLength); //结果占s一半空间

		addTransTime(MPI_Wtime()-tempTime);
	}

	if(rank==0)
	{
		totalTime=MPI_Wtime();
		totalTime-=beginTime;

		printf("\nUse prossor size=%d\n",size);
		printf("Total running time=%f(s)\n",totalTime);
		printf("Distribute data time = %f(s)\n",transTime);
		printf("Parallel compute time = %f(s)\n ",totalTime-transTime);
	}

	MPI_Finalize();
}