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

📄 pmandel.cpp

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 CPP
字号:
#include <afx.h>//#include "PpmPgm.h"#include <stdlib.h>#include <stdio.h>#include <string.h>#include <windows.h>#include "mpi.h"#include "pmandel.h"#include "lists.h"#include "args.h"#include "pm_genproc.h"FILE *debug_file;MPI_Datatype winspecs_type, flags_type, NUM_type, rect_type;/* Forward refs */int SeparateRect_Master  (MPE_XGraph graph, Winspecs *winspecs, Flags *flags);void SeparateRect_Slave  (MPE_XGraph graph, Winspecs *winspecs, Flags *flags);int DrawImage            (MPE_XGraph, Winspecs *, Flags *);int ProcessArgsFromFile (MPE_XGraph, Winspecs *, Flags *);int DragZoom             (MPE_XGraph, Flags *);int main(int argc, char *argv[]){	int np, myid, myWindowOpened, allWindowsOpened;	Winspecs winspecs;	Flags flags;	MPE_XGraph graph;	try{	if (IsArgPresent(&argc, argv, "-h")) 	{		PrintHelp(argv[0]);	}	if (IsArgPresent(&argc, argv, "-Stretch"))		g_bNoStretch = false;	MPI_Init(&argc, &argv);	MPI_Comm_rank(MPI_COMM_WORLD, &myid);	MPI_Comm_size(MPI_COMM_WORLD, &np);		if (np == 1) 	{		fprintf(stderr, "\nmandle requires at least 2 processes (master + slaves)\n\n");		PrintHelp(argv[0]);		MPI_Finalize();		return 1;	}		DefineMPITypes();	GetDefaultWinspecs(&winspecs);	GetDefaultFlags(&winspecs, &flags);	GetWinspecs(&argc, argv, &winspecs);	GetFlags(&argc, argv, &winspecs, &flags);		myWindowOpened = (		MPE_Open_graphics(&graph, MPI_COMM_WORLD, (char *)0,		winspecs.xpos, winspecs.ypos,		winspecs.width, winspecs.height, !myid)			==0);		MPI_Allreduce(&myWindowOpened, &allWindowsOpened, 1, MPI_INT, MPI_LAND,		MPI_COMM_WORLD);		if (allWindowsOpened) 	{		//printf("all windows opened\n");fflush(stdout);		if (!winspecs.bw) 		{			winspecs.colorArray = (MPE_Color *) malloc(winspecs.numColors * sizeof(MPE_Color));			MPE_Make_color_array(graph, winspecs.numColors, winspecs.colorArray);		}		//printf("calling DrawImage\n");fflush(stdout);		int ret_val;		ret_val = DrawImage(graph, &winspecs, &flags);		//printf("back in main\n");fflush(stdout);		MPI_Barrier(MPI_COMM_WORLD);		//printf(".");fflush(stdout);		if (!myid && (ret_val == FALSE))		{			MPI_Status status;			printf("done\n");fflush(stdout);			MPI_Recv(0, 0, MPI_INT, 0, WINDOW_CLOSED, MPI_COMM_WORLD, &status);		}		/*		if (!myid)		{			PpmPgm *ppm = new PpmPgm(graph.width, graph.height);			//printf("copying data to ppm\n");fflush(stdout);			for (int i=0; i<graph.width; i++)				for (int j=0; j<graph.height; j++)					ppm->SetPixel(i, j, graph.map[i + j*graph.width]);			printf("writing output to file\n");fflush(stdout);			CFile fout;			TCHAR filename[100];			_stprintf(filename, TEXT("\\temp\\mandel%d.ppm"), myid);			fout.Open(filename, CFile::modeCreate | CFile::modeReadWrite);			ppm->Write(fout);			fout.Close();		}		//*/		//printf("closing graphics\n");fflush(stdout);		MPE_Close_graphics(&graph);	} 	else 	{		if (!myid) 		{			fprintf(stderr, "One or more processes could not connect\n");			fprintf(stderr, "to the display.  Exiting.\n\n");		}		if (myWindowOpened)			MPE_Close_graphics(&graph);	}	//printf("Finalize\n");fflush(stdout);	MPI_Finalize();	}catch(...)	{		printf("Exception thrown, exiting...\n");	}	return 0;}int ProcessArgsFromFile(MPE_XGraph graph, Winspecs *winspecs, Flags *oldFlags){	Flags newFlags;	char line[1025], *copy, *tok, **argv;	int doOneMore, ndrawn, myid, argc;	xpand_list_Strings *argList;	FILE *inf;	int ret_val = FALSE;		MPI_Comm_rank(MPI_COMM_WORLD, &myid);		if (myid == 0) 	{		if (!oldFlags->inf || strcmp(oldFlags->inf, "-") == 0) 		{			inf = stdin;		} 		else 		{			inf = fopen(oldFlags->inf, "r");			if (inf == NULL) 			{				fprintf(stderr, "Sorry, could not open %s, skipping.\n", oldFlags->inf);fflush(stderr);				doOneMore = 0;				MPI_Bcast(&doOneMore, 1, MPI_INT, 0, MPI_COMM_WORLD);			}		}				ndrawn = 0;				while (inf && (oldFlags->loop || fgets(line, 1024, inf)))		{			if (oldFlags->loop && !fgets(line, 1024, inf)) 			{				rewind(inf);				fgets(line, 1024, inf);			}			if (*line!='#' && StrContainsNonWhiteSpace(line)) 			{				/* skip blank lines and lines starting with # */								line[strlen(line) - 1] = 0; /* chop off trailing '\n' */				argList = Strings_CreateList(10);				Strings_AddItem(argList, oldFlags->inf);				tok = strtok(line, " \t");				while (tok) 				{					copy = (char *) malloc(sizeof(char) * strlen(tok) + 1);					strcpy(copy, tok);					Strings_AddItem(argList, copy);					tok = strtok((char *)0, " \t");				}				newFlags = *oldFlags;				newFlags.inf = (char *)0;				newFlags.loop = 0;				newFlags.zoom = 0;				argc = ListSize(argList);				argv = ListHeadPtr(argList);				doOneMore = 1;				//printf("-");fflush(stdout);				MPI_Bcast(&doOneMore, 1, MPI_INT, 0, MPI_COMM_WORLD);				GetFlags(&argc, argv, winspecs, &newFlags);				if (DrawImage(graph, winspecs, &newFlags))				{					inf = NULL;					ret_val =  TRUE;					doOneMore = 0;					//printf("-");fflush(stdout);					MPI_Bcast(&doOneMore, 1, MPI_INT, 0, MPI_COMM_WORLD);					//break;					return TRUE;				}			}		}		doOneMore = 0;		//printf("-");fflush(stdout);		MPI_Bcast(&doOneMore, 1, MPI_INT, 0, MPI_COMM_WORLD);			} 	else 	{		//printf("-");fflush(stdout);		MPI_Bcast(&doOneMore, 1, MPI_INT, 0, MPI_COMM_WORLD);		argc = 0;		argv = 0;		while (doOneMore) 		{			newFlags = *oldFlags;			GetFlags(&argc, argv, winspecs, &newFlags);			if (DrawImage(graph, winspecs, &newFlags))			{				ret_val = TRUE;			}			//printf("-");fflush(stdout);			MPI_Bcast(&doOneMore, 1, MPI_INT, 0, MPI_COMM_WORLD);		}	}		return ret_val;}int DrawImage(MPE_XGraph graph, Winspecs *winspecs, Flags *flags){	int myid, drawAnother;		MPI_Comm_rank(MPI_COMM_WORLD, &myid);		MPI_Barrier(MPI_COMM_WORLD);	/* helpful when starting up debuggers */		//printf("Entering DrawImage\n");fflush(stdout);	if (flags->inf) 	{		//printf("input file selected\n");fflush(stdout);		int ret_val = ProcessArgsFromFile(graph, winspecs, flags);		//printf("ret_val: %d\n", ret_val);fflush(stdout);		return ret_val;	} 	else 	{		drawAnother = 0;				do 		{			MPE_INIT_LOG();			if (myid == 0) 			{				MPE_Fill_rectangle(graph, 0, 0, winspecs->width, winspecs->height, MPE_BLACK); //MPE_WHITE);				fprintf(stderr, "Drawing region -rmin %.17lf -imin %.17lf -rmax %.17lf -imax %.17lf\n",					NUM2DBL(flags->rmin), NUM2DBL(flags-> imin),					NUM2DBL(flags->rmax), NUM2DBL(flags-> imax));				fflush(stderr);				if (SeparateRect_Master(graph, winspecs, flags))				{					// Window closed					MPI_Barrier(MPI_COMM_WORLD);					return TRUE;				}			} 			else 			{				SeparateRect_Slave(graph, winspecs, flags);			}			MPI_Barrier(MPI_COMM_WORLD);			MPE_FINISH_LOG(flags->logfile);			if (flags->zoom) 			{				//drawAnother = DragZoom(graph, flags);				drawAnother = 0;			} 			else 			{				Sleep(3000);				MPI_Barrier(MPI_COMM_WORLD);			}		} while (drawAnother);	}	return FALSE;}/*int DragZoom(MPE_XGraph graph, Flags *flags){	int x1, y1, x2, y2, i, myid;	NUM zx1, zy1, zx2, zy2;		MPI_Comm_rank(MPI_COMM_WORLD, &myid);		if (!myid) 	{		printf("Ready for zoom rectangle");		MPE_Get_drag_region(graph, 1, MPE_DRAG_SQUARE, &x1, &y1, &x2, &y2);		if (x1>x2) 		{			i = x1; x1 = x2; x2 = i;		}		if (y1>y2) 		{			i = y1; y1 = y2; y2 = i;		}		Pixel2Complex(flags, x1, y1, &zx1, &zy1);		Pixel2Complex(flags, x2, y2, &zx2, &zy2);		NUM_ASSIGN(flags->rmin, zx1);		NUM_ASSIGN(flags->imin, zy2);		NUM_ASSIGN(flags->rmax, zx2);		NUM_ASSIGN(flags->imax, zy1);	}		MPI_Bcast(flags, 1, flags_type, 0, MPI_COMM_WORLD);	return 1;}//*/

⌨️ 快捷键说明

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