int main(int argc, char **argv) { int usemenu = parsecmdline(argc, argv);//./server port -i -n -l short unsigned int key[3]; key[0] = getpid(); key[1] = time(NULL); seed48(key); serverdata_type *s = readinput(inputfile, sdata);//read server.dat or saved-data to initiate dU* and p* pthread_t thread; if (usemenu) {int pthread_id = pthread_create(&thread, NULL, runmenu, (void *)s); //printf("pthread_id=%d\n",pthread_id); } int socket = bindsocket(port); //printf("socket=%d\n",socket); if (!usemenu) printf("No menu will be available\n"); initparameters(s); //printf("key = %d\n", s->key); // main loop - we read requests and complete transactions while (FOREVER_EVER_EVER) { //printf("entering loop\n"); processrequest(socket, s); //printf("finishing loop\n"); } return 0; }
//int initialise(FILE *fi) { //flatmax int initialise(ifstream *fi) { //flatmax int c; clearpitchpatterns(); vpp.count= -1; c=readinput(fi); sortptp(); compfreqlimit(); return(c); }
int main(int argc, char *argv[]) { char infile[PATH_MAX], outfile[PATH_MAX], *abspath; int outfd; struct stat st; struct passwd *pwd = getpwuid(getuid()); if (setlocale(LC_ALL, "") == NULL) warn("failed to set locale"); /* check for switches - only -v and -h are available and must be before any arguments */ if (argv[1][0] == '-' && argv[1][2] == '\0') switch (argv[1][1]) { case 'v': errx(EXIT_SUCCESS, "niii - %s - by c00kiemon5ter", VERSION); case 'h': errx(EXIT_SUCCESS, "%s", USAGE); default: errx(EXIT_FAILURE, "%s", USAGE); } /* check for argument - if none use the user's home dir, else use the given dir */ switch (argc) { case 1: snprintf(ircdir, sizeof(ircdir), "%s/irc", pwd->pw_dir); break; case 2: strncpy(ircdir, argv[1], sizeof(ircdir)); break; default: errx(EXIT_FAILURE, "%s", USAGE); } /* check if there is indeed such a directorty and get the absolute path */ if (stat(ircdir, &st) < 0 || !S_ISDIR(st.st_mode)) err(EXIT_FAILURE, "failed to find directory: %s", ircdir); if ((abspath = realpath(ircdir, NULL)) == NULL) err(EXIT_FAILURE, "failed to get absolute path for directory: %s", ircdir); strncpy(ircdir, abspath, sizeof(ircdir)); free(abspath); /* create the filepaths and open the files - we need to monitor the out descriptor */ sprintf(outfile, "%s/out", ircdir); sprintf(infile, "%s/in", ircdir); if ((in = fopen(infile, "w")) == NULL) err(EXIT_FAILURE, "failed to open file: %s", infile); if ((outfd = open(outfile, O_RDONLY)) == -1) err(EXIT_FAILURE, "failed to open descriptor for file: %s", outfile); if ((out = fdopen(outfd, "r")) == NULL) err(EXIT_FAILURE, "failed to open file: %s", outfile); /* start curses - create windows - read history */ createwins(); readout(); /* listen for new messages on out file */ /* handle input */ while (running) readinput(); /* cleanup */ destroywins(); fclose(in); fclose(out); close(outfd); /* all was good :] */ return EXIT_SUCCESS; }
int main() { if (dazuko_init() == 0) { /* read from keyboard */ do { printf("DummyOS kernel> "); fflush(stdout); } while (readinput() == 0); } return 0; }
int main( void ) { while( readinput() ) { #if DBG testprint() ; #endif solve() ; #if DBG testprint() ; #endif printoutput() ; memset( bits, 0, sizeof(bits) ) ; memset( output, 0, sizeof(output) ) ; } return EXIT_SUCCESS ; }
/** main program to verify all traces passed */ int main(int argc, char* argv[]) { rbtree_t* all_locks; int i; time_t starttime = time(NULL); #ifdef USE_THREAD_DEBUG /* do not overwrite the ublocktrace files with the ones generated * by this program (i.e. when the log code creates a lock) */ check_locking_order = 0; #endif if(argc <= 1) { usage(); return 1; } log_init(NULL, 0, NULL); log_ident_set("lock-verify"); /* init */ all_locks = rbtree_create(order_lock_cmp); errors_detected = 0; /* read the input files */ for(i=1; i<argc; i++) { readinput(all_locks, argv[i]); } /* check ordering */ check_order(all_locks); /* do not free a thing, OS will do it */ printf("checked %d locks in %d seconds with %d errors.\n", (int)all_locks->count, (int)(time(NULL)-starttime), errors_detected); if(errors_detected) return 1; return 0; }
int main(int argc, char** argv) { if (argc != 7) { usage(argc,argv); } char *pfile, *tfile, *ofile;// *testFile; int iterations = atoi(argv[3]); pfile = argv[4]; tfile = argv[5]; ofile = argv[6]; //testFile = argv[7]; int numCols = atoi(argv[1]); int numRows = atoi(argv[1]); int layers = atoi(argv[2]); /* calculating parameters*/ float dx = chip_height/numRows; float dy = chip_width/numCols; float dz = t_chip/layers; float Cap = FACTOR_CHIP * SPEC_HEAT_SI * t_chip * dx * dy; float Rx = dy / (2.0 * K_SI * t_chip * dx); float Ry = dx / (2.0 * K_SI * t_chip * dy); float Rz = dz / (K_SI * dx * dy); // cout << Rx << " " << Ry << " " << Rz << endl; float max_slope = MAX_PD / (FACTOR_CHIP * t_chip * SPEC_HEAT_SI); float dt = PRECISION / max_slope; float *powerIn, *tempOut, *tempIn, *tempCopy;// *pCopy; // float *d_powerIn, *d_tempIn, *d_tempOut; int size = numCols * numRows * layers; powerIn = (float*)calloc(size, sizeof(float)); tempCopy = (float*)malloc(size * sizeof(float)); tempIn = (float*)calloc(size,sizeof(float)); tempOut = (float*)calloc(size, sizeof(float)); //pCopy = (float*)calloc(size,sizeof(float)); float* answer = (float*)calloc(size, sizeof(float)); // outCopy = (float*)calloc(size, sizeof(float)); readinput(powerIn,numRows, numCols, layers,pfile); readinput(tempIn, numRows, numCols, layers, tfile); memcpy(tempCopy,tempIn, size * sizeof(float)); hclib_pragma_marker("omp_to_hclib", "", "pragma254_omp_to_hclib"); { struct timeval start, stop; float time; gettimeofday(&start,NULL); computeTempOMP(powerIn, tempIn, tempOut, numCols, numRows, layers, Cap, Rx, Ry, Rz, dt,iterations); gettimeofday(&stop,NULL); time = (stop.tv_usec-start.tv_usec)*1.0e-6 + stop.tv_sec - start.tv_sec; computeTempCPU(powerIn, tempCopy, answer, numCols, numRows, layers, Cap, Rx, Ry, Rz, dt,iterations); float acc = accuracy(tempOut,answer,numRows*numCols*layers); printf("Time: %.3f (s)\n",time); printf("Accuracy: %e\n",acc); } writeoutput(tempOut,numRows, numCols, layers, ofile); free(tempIn); free(tempOut); free(powerIn); return 0; }
int main(int argc,char **argv) { PetscErrorCode ierr; int time; /* amount of loops */ struct in put; PetscScalar rh; /* relative humidity */ PetscScalar x; /* memory varialbe for relative humidity calculation */ PetscScalar deep_grnd_temp; /* temperature of ground under top soil surface layer */ PetscScalar emma; /* absorption-emission constant for air */ PetscScalar pressure1 = 101300; /* surface pressure */ PetscScalar mixratio; /* mixing ratio */ PetscScalar airtemp; /* temperature of air near boundary layer inversion */ PetscScalar dewtemp; /* dew point temperature */ PetscScalar sfctemp; /* temperature at surface */ PetscScalar pwat; /* total column precipitable water */ PetscScalar cloudTemp; /* temperature at base of cloud */ AppCtx user; /* user-defined work context */ MonitorCtx usermonitor; /* user-defined monitor context */ PetscMPIInt rank,size; TS ts; SNES snes; DM da; Vec T,rhs; /* solution vector */ Mat J; /* Jacobian matrix */ PetscReal ftime,dt; PetscInt steps,dof = 5; PetscBool use_coloring = PETSC_TRUE; MatFDColoring matfdcoloring = 0; PetscBool monitor_off = PETSC_FALSE; PetscInitialize(&argc,&argv,(char*)0,help); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); /* Inputs */ readinput(&put); sfctemp = put.Ts; dewtemp = put.Td; cloudTemp = put.Tc; airtemp = put.Ta; pwat = put.pwt; if (!rank) PetscPrintf(PETSC_COMM_SELF,"Initial Temperature = %g\n",sfctemp); /* input surface temperature */ deep_grnd_temp = sfctemp - 10; /* set underlying ground layer temperature */ emma = emission(pwat); /* accounts for radiative effects of water vapor */ /* Converts from Fahrenheit to Celsuis */ sfctemp = fahr_to_cel(sfctemp); airtemp = fahr_to_cel(airtemp); dewtemp = fahr_to_cel(dewtemp); cloudTemp = fahr_to_cel(cloudTemp); deep_grnd_temp = fahr_to_cel(deep_grnd_temp); /* Converts from Celsius to Kelvin */ sfctemp += 273; airtemp += 273; dewtemp += 273; cloudTemp += 273; deep_grnd_temp += 273; /* Calculates initial relative humidity */ x = calcmixingr(dewtemp,pressure1); mixratio = calcmixingr(sfctemp,pressure1); rh = (x/mixratio)*100; if (!rank) printf("Initial RH = %.1f percent\n\n",rh); /* prints initial relative humidity */ time = 3600*put.time; /* sets amount of timesteps to run model */ /* Configure PETSc TS solver */ /*------------------------------------------*/ /* Create grid */ ierr = DMDACreate2d(PETSC_COMM_WORLD,DMDA_BOUNDARY_PERIODIC,DMDA_BOUNDARY_PERIODIC,DMDA_STENCIL_STAR,-20,-20, PETSC_DECIDE,PETSC_DECIDE,dof,1,NULL,NULL,&da);CHKERRQ(ierr); ierr = DMDASetUniformCoordinates(da, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0);CHKERRQ(ierr); /* Define output window for each variable of interest */ ierr = DMDASetFieldName(da,0,"Ts");CHKERRQ(ierr); ierr = DMDASetFieldName(da,1,"Ta");CHKERRQ(ierr); ierr = DMDASetFieldName(da,2,"u");CHKERRQ(ierr); ierr = DMDASetFieldName(da,3,"v");CHKERRQ(ierr); ierr = DMDASetFieldName(da,4,"p");CHKERRQ(ierr); /* set values for appctx */ user.da = da; user.Ts = sfctemp; user.fract = put.fr; /* fraction of sky covered by clouds */ user.dewtemp = dewtemp; /* dew point temperature (mositure in air) */ user.csoil = 2000000; /* heat constant for layer */ user.dzlay = 0.08; /* thickness of top soil layer */ user.emma = emma; /* emission parameter */ user.wind = put.wnd; /* wind spped */ user.pressure1 = pressure1; /* sea level pressure */ user.airtemp = airtemp; /* temperature of air near boundar layer inversion */ user.Tc = cloudTemp; /* temperature at base of lowest cloud layer */ user.init = put.init; /* user chosen initiation scenario */ user.lat = 70*0.0174532; /* converts latitude degrees to latitude in radians */ user.deep_grnd_temp = deep_grnd_temp; /* temp in lowest ground layer */ /* set values for MonitorCtx */ usermonitor.drawcontours = PETSC_FALSE; ierr = PetscOptionsHasName(NULL,"-drawcontours",&usermonitor.drawcontours);CHKERRQ(ierr); if (usermonitor.drawcontours) { PetscReal bounds[] = {1000.0,-1000., -1000.,-1000., 1000.,-1000., 1000.,-1000., 1000,-1000, 100700,100800}; ierr = PetscViewerDrawOpen(PETSC_COMM_WORLD,0,0,0,0,300,300,&usermonitor.drawviewer);CHKERRQ(ierr); ierr = PetscViewerDrawSetBounds(usermonitor.drawviewer,dof,bounds);CHKERRQ(ierr); } usermonitor.interval = 1; ierr = PetscOptionsGetInt(NULL,"-monitor_interval",&usermonitor.interval,NULL);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Extract global vectors from DA; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = DMCreateGlobalVector(da,&T);CHKERRQ(ierr); ierr = VecDuplicate(T,&rhs);CHKERRQ(ierr); /* r: vector to put the computed right hand side */ ierr = TSCreate(PETSC_COMM_WORLD,&ts);CHKERRQ(ierr); ierr = TSSetProblemType(ts,TS_NONLINEAR);CHKERRQ(ierr); ierr = TSSetType(ts,TSBEULER);CHKERRQ(ierr); ierr = TSSetRHSFunction(ts,rhs,RhsFunc,&user);CHKERRQ(ierr); /* Set Jacobian evaluation routine - use coloring to compute finite difference Jacobian efficiently */ ierr = DMSetMatType(da,MATAIJ);CHKERRQ(ierr); ierr = DMCreateMatrix(da,&J);CHKERRQ(ierr); ierr = TSGetSNES(ts,&snes);CHKERRQ(ierr); if (use_coloring) { ISColoring iscoloring; ierr = DMCreateColoring(da,IS_COLORING_GLOBAL,&iscoloring);CHKERRQ(ierr); ierr = MatFDColoringCreate(J,iscoloring,&matfdcoloring);CHKERRQ(ierr); ierr = MatFDColoringSetFromOptions(matfdcoloring);CHKERRQ(ierr); ierr = MatFDColoringSetUp(J,iscoloring,matfdcoloring);CHKERRQ(ierr); ierr = ISColoringDestroy(&iscoloring);CHKERRQ(ierr); ierr = MatFDColoringSetFunction(matfdcoloring,(PetscErrorCode (*)(void))SNESTSFormFunction,ts);CHKERRQ(ierr); ierr = SNESSetJacobian(snes,J,J,SNESComputeJacobianDefaultColor,matfdcoloring);CHKERRQ(ierr); } else { ierr = SNESSetJacobian(snes,J,J,SNESComputeJacobianDefault,NULL);CHKERRQ(ierr); } /* Define what to print for ts_monitor option */ ierr = PetscOptionsHasName(NULL,"-monitor_off",&monitor_off);CHKERRQ(ierr); if (!monitor_off) { ierr = TSMonitorSet(ts,Monitor,&usermonitor,NULL);CHKERRQ(ierr); } ierr = FormInitialSolution(da,T,&user);CHKERRQ(ierr); dt = TIMESTEP; /* initial time step */ ftime = TIMESTEP*time; if (!rank) printf("time %d, ftime %g hour, TIMESTEP %g\n",time,ftime/3600,dt); ierr = TSSetInitialTimeStep(ts,0.0,dt);CHKERRQ(ierr); ierr = TSSetDuration(ts,time,ftime);CHKERRQ(ierr); ierr = TSSetSolution(ts,T);CHKERRQ(ierr); ierr = TSSetDM(ts,da);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Set runtime options - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSSetFromOptions(ts);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Solve nonlinear system - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSSolve(ts,T);CHKERRQ(ierr); ierr = TSGetSolveTime(ts,&ftime);CHKERRQ(ierr); ierr = TSGetTimeStepNumber(ts,&steps);CHKERRQ(ierr); if (!rank) PetscPrintf(PETSC_COMM_WORLD,"Solution T after %g hours %d steps\n",ftime/3600,steps); if (matfdcoloring) {ierr = MatFDColoringDestroy(&matfdcoloring);CHKERRQ(ierr);} if (usermonitor.drawcontours) { ierr = PetscViewerDestroy(&usermonitor.drawviewer);CHKERRQ(ierr); } ierr = MatDestroy(&J);CHKERRQ(ierr); ierr = VecDestroy(&T);CHKERRQ(ierr); ierr = VecDestroy(&rhs);CHKERRQ(ierr); ierr = TSDestroy(&ts);CHKERRQ(ierr); ierr = DMDestroy(&da);CHKERRQ(ierr); PetscFinalize(); return 0; }
int main(int argc, char** argv) { cl_int error; cl_uint num_platforms; // Get the number of platforms error = clGetPlatformIDs(0, NULL, &num_platforms); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); // Get the list of platforms cl_platform_id* platforms = (cl_platform_id *) malloc(sizeof(cl_platform_id) * num_platforms); error = clGetPlatformIDs(num_platforms, platforms, NULL); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); // Print the chosen platform (if there are multiple platforms, choose the first one) cl_platform_id platform = platforms[0]; char pbuf[100]; error = clGetPlatformInfo(platform, CL_PLATFORM_VENDOR, sizeof(pbuf), pbuf, NULL); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); printf("Platform: %s\n", pbuf); // Create a GPU context cl_context_properties context_properties[3] = { CL_CONTEXT_PLATFORM, (cl_context_properties) platform, 0}; context = clCreateContextFromType(context_properties, CL_DEVICE_TYPE_GPU, NULL, NULL, &error); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); // Get and print the chosen device (if there are multiple devices, choose the first one) size_t devices_size; error = clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &devices_size); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); cl_device_id *devices = (cl_device_id *) malloc(devices_size); error = clGetContextInfo(context, CL_CONTEXT_DEVICES, devices_size, devices, NULL); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); device = devices[0]; error = clGetDeviceInfo(device, CL_DEVICE_NAME, sizeof(pbuf), pbuf, NULL); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); printf("Device: %s\n", pbuf); // Create a command queue command_queue = clCreateCommandQueue(context, device, 0, &error); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); int size; int grid_rows,grid_cols = 0; float *FilesavingTemp,*FilesavingPower; //,*MatrixOut; char *tfile, *pfile, *ofile; int total_iterations = 60; int pyramid_height = 1; // number of iterations if (argc < 7) usage(argc, argv); if((grid_rows = atoi(argv[1]))<=0|| (grid_cols = atoi(argv[1]))<=0|| (pyramid_height = atoi(argv[2]))<=0|| (total_iterations = atoi(argv[3]))<=0) usage(argc, argv); tfile=argv[4]; pfile=argv[5]; ofile=argv[6]; size=grid_rows*grid_cols; // --------------- pyramid parameters --------------- int borderCols = (pyramid_height)*EXPAND_RATE/2; int borderRows = (pyramid_height)*EXPAND_RATE/2; int smallBlockCol = BLOCK_SIZE-(pyramid_height)*EXPAND_RATE; int smallBlockRow = BLOCK_SIZE-(pyramid_height)*EXPAND_RATE; int blockCols = grid_cols/smallBlockCol+((grid_cols%smallBlockCol==0)?0:1); int blockRows = grid_rows/smallBlockRow+((grid_rows%smallBlockRow==0)?0:1); FilesavingTemp = (float *) malloc(size*sizeof(float)); FilesavingPower = (float *) malloc(size*sizeof(float)); // MatrixOut = (float *) calloc (size, sizeof(float)); if( !FilesavingPower || !FilesavingTemp) // || !MatrixOut) fatal("unable to allocate memory"); // Read input data from disk readinput(FilesavingTemp, grid_rows, grid_cols, tfile); readinput(FilesavingPower, grid_rows, grid_cols, pfile); // Load kernel source from file const char *source = load_kernel_source("hotspot_kernel.cl"); size_t sourceSize = strlen(source); // Compile the kernel cl_program program = clCreateProgramWithSource(context, 1, &source, &sourceSize, &error); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); // Create an executable from the kernel error = clBuildProgram(program, 1, &device, NULL, NULL, NULL); // Show compiler warnings/errors static char log[65536]; memset(log, 0, sizeof(log)); clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, sizeof(log)-1, log, NULL); if (strstr(log,"warning:") || strstr(log, "error:")) printf("<<<<\n%s\n>>>>\n", log); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); kernel = clCreateKernel(program, "hotspot", &error); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); long long start_time = get_time(); // Create two temperature matrices and copy the temperature input data cl_mem MatrixTemp[2]; // Create input memory buffers on device MatrixTemp[0] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, sizeof(float) * size, FilesavingTemp, &error); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); MatrixTemp[1] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, sizeof(float) * size, NULL, &error); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); // Copy the power input data cl_mem MatrixPower = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, sizeof(float) * size, FilesavingPower, &error); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); // Perform the computation int ret = compute_tran_temp(MatrixPower, MatrixTemp, grid_cols, grid_rows, total_iterations, pyramid_height, blockCols, blockRows, borderCols, borderRows, FilesavingTemp, FilesavingPower); // Copy final temperature data back cl_float *MatrixOut = (cl_float *) clEnqueueMapBuffer(command_queue, MatrixTemp[ret], CL_TRUE, CL_MAP_READ, 0, sizeof(float) * size, 0, NULL, NULL, &error); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); long long end_time = get_time(); printf("Total time: %.3f seconds\n", ((float) (end_time - start_time)) / (1000*1000)); // Write final output to output file writeoutput(MatrixOut, grid_rows, grid_cols, ofile); error = clEnqueueUnmapMemObject(command_queue, MatrixTemp[ret], (void *) MatrixOut, 0, NULL, NULL); if (error != CL_SUCCESS) fatal_CL(error, __LINE__); clReleaseMemObject(MatrixTemp[0]); clReleaseMemObject(MatrixTemp[1]); clReleaseMemObject(MatrixPower); return 0; }
int main() { srand(time(0)); readinput(); ga(); return 0; }
/* main */ main( int argc, char *argv[] ) { int natoms, nrgeoms; int *dist; struct geometry *refgeom, *ptr2, *tmp2; struct point *ptdata, *ptr1, *tmp1; /* process command line arguments */ if ( argc == 3 ) { /* argc should be 3 */ natoms = strtol( argv[1], NULL, 10 ); /* number of atoms */ nrgeoms = strtol( argv[2], NULL, 10 ); /* number of geoms */ } else { printf( "\n usage: %s [num. atoms] [num. geoms]\n", argv[0] ); exit(1); } /* allocate first node of refgeom */ refgeom = malloc( sizeof( struct geometry ) ); refgeom->atom = malloc( natoms * sizeof( struct xyz ) ); refgeom->next = 0; /* read in refgeom file, building refgeom array */ readinput( natoms, nrgeoms, refgeom ); /* allocate distances array */ dist = malloc( (5 * 2) * sizeof( int ) ); dist[0] = 1; dist[1] = 2; /* C-O bond distance */ dist[2] = 1; dist[3] = 5; /* O-H bond distance */ dist[4] = 2; dist[5] = 3; /* C-H1 bond distance */ dist[6] = 2; dist[7] = 4; /* C-H2 bond distance */ dist[8] = 2; dist[9] = 5; /* C-H3 bond distance */ /* allocate first node of data aray */ ptdata = malloc( sizeof( struct point ) ); /* 5 distances + 2 OOP angles */ ptdata->coord = malloc( (5 + 2) * sizeof( double ) ); ptdata->next = 0; /* compute distances */ computedist( dist, nrgeoms, refgeom, ptdata ); /* compute rms energy and gradient errors */ computerms( nrgeoms, ptdata ); /* print distances */ printoutput( nrgeoms, ptdata ); /* dellocate memory */ ptr1 = ptdata; while ( ptr1 != NULL ) { tmp1 = ptr1; ptr1 = ptr1->next; free( tmp1 ); } ptdata = NULL; ptr2 = refgeom; while (ptr2 != NULL ) { tmp2 = ptr2; ptr2 = ptr2->next; free( tmp2 ); } refgeom = NULL; }
void run(int argc, char** argv) { int size; int grid_rows,grid_cols; float *FilesavingTemp,*FilesavingPower,*MatrixOut; char *tfile, *pfile, *ofile; int total_iterations = 60; int pyramid_height = 1; // number of iterations if (argc != 7) usage(argc, argv); if((grid_rows = atoi(argv[1]))<=0|| (grid_cols = atoi(argv[1]))<=0|| (pyramid_height = atoi(argv[2]))<=0|| (total_iterations = atoi(argv[3]))<=0) usage(argc, argv); tfile=argv[4]; pfile=argv[5]; ofile=argv[6]; size=grid_rows*grid_cols; /* --------------- pyramid parameters --------------- */ # define EXPAND_RATE 2// add one iteration will extend the pyramid base by 2 per each borderline int borderCols = (pyramid_height)*EXPAND_RATE/2; int borderRows = (pyramid_height)*EXPAND_RATE/2; int smallBlockCol = BLOCK_SIZE-(pyramid_height)*EXPAND_RATE; int smallBlockRow = BLOCK_SIZE-(pyramid_height)*EXPAND_RATE; int blockCols = grid_cols/smallBlockCol+((grid_cols%smallBlockCol==0)?0:1); int blockRows = grid_rows/smallBlockRow+((grid_rows%smallBlockRow==0)?0:1); FilesavingTemp = (float *) malloc(size*sizeof(float)); FilesavingPower = (float *) malloc(size*sizeof(float)); MatrixOut = (float *) calloc (size, sizeof(float)); if( !FilesavingPower || !FilesavingTemp || !MatrixOut) fatal("unable to allocate memory"); printf("pyramidHeight: %d\ngridSize: [%d, %d]\nborder:[%d, %d]\nblockGrid:[%d, %d]\ntargetBlock:[%d, %d]\n", \ pyramid_height, grid_cols, grid_rows, borderCols, borderRows, blockCols, blockRows, smallBlockCol, smallBlockRow); readinput(FilesavingTemp, grid_rows, grid_cols, tfile); readinput(FilesavingPower, grid_rows, grid_cols, pfile); struct timeval tv; CUdeviceptr MatrixTemp[2], MatrixPower; CUcontext ctx; CUmodule mod; CUresult res; int ret; /* * call our common CUDA initialization utility function. */ res = cuda_driver_api_init(&ctx, &mod, "./hotspot.cubin"); if (res != CUDA_SUCCESS) { printf("cuda_driver_api_init failed: res = %u\n", res); return; } res = cuMemAlloc(&MatrixTemp[0], sizeof(float) * size); if (res != CUDA_SUCCESS) { printf("cuMemAlloc failed: res = %u\n", res); return; } res = cuMemAlloc(&MatrixTemp[1], sizeof(float) * size); if (res != CUDA_SUCCESS) { printf("cuMemAlloc failed: res = %u\n", res); return; } res = cuMemAlloc(&MatrixPower, sizeof(float) * size); if (res != CUDA_SUCCESS) { printf("cuMemAlloc failed: res = %u\n", res); return; } /* * measurement start! */ time_measure_start(&tv); res = cuMemcpyHtoD(MatrixTemp[0], FilesavingTemp, sizeof(float) * size); if (res != CUDA_SUCCESS) { printf("cuMemcpyHtoD failed: res = %u\n", res); return; } res = cuMemcpyHtoD(MatrixPower, FilesavingPower, sizeof(float) * size); if (res != CUDA_SUCCESS) { printf("cuMemcpyHtoD failed: res = %u\n", res); return; } ret = compute_tran_temp(mod, MatrixPower, MatrixTemp, grid_cols, grid_rows, total_iterations, pyramid_height, blockCols, blockRows, borderCols, borderRows); res = cuMemcpyDtoH(MatrixOut, MatrixTemp[ret], sizeof(float) * size); if (res != CUDA_SUCCESS) { printf("cuMemcpyDtoH failed: res = %u\n", res); return; } /* * measurement end! will print out the time. */ time_measure_end(&tv); writeoutput(MatrixOut, grid_rows, grid_cols, ofile); cuMemFree(MatrixPower); cuMemFree(MatrixTemp[0]); cuMemFree(MatrixTemp[1]); free(MatrixOut); res = cuda_driver_api_exit(ctx, mod); if (res != CUDA_SUCCESS) { printf("cuda_driver_api_exit faild: res = %u\n", res); return; } }