int main(int argc , char **argv) { #if PRINT_TIME double start, end; #endif extract_arguments(argc, argv); #if PRINT_TIME start = time_so_far(); #endif if(mr_init()) exit(EXIT_FAILURE); start_threads(); wait_threads(); if(mr_reduce()) exit(EXIT_FAILURE); #if PRINT_TIME /* Done here, to avoid counting the printing... */ end = time_so_far(); #endif if(mr_print()) exit(EXIT_FAILURE); if(mr_destroy()) exit(EXIT_FAILURE); #if PRINT_TIME printf("Done in %g msec\n", end-start); #endif exit(EXIT_SUCCESS); }
int main(int argc, char *argv[]) { final_data_kv_t final_vals; int fd; struct defsplitter_state ps; char *fdata; char *fname; struct stat finfo; int i; int nprocs = 0, map_tasks = 0, ndisp = 5, reduce_tasks = 0, quiet = 0; int c; // Make sure a filename is specified fname = argv[1]; if (argc < 2) { lr_usage(argv[0]); exit(EXIT_FAILURE); } while ((c = getopt(argc - 1, argv + 1, "p:l:m:r:q")) != -1) { switch (c) { case 'p': nprocs = atoi(optarg); break; case 'l': ndisp = atoi(optarg); break; case 'm': map_tasks = atoi(optarg); break; case 'r': reduce_tasks = atoi(optarg); break; case 'q': quiet = 1; break; default: lr_usage(argv[0]); exit(EXIT_FAILURE); break; } } // Read in the file assert((fd = open(fname, O_RDONLY)) >= 0); // Get the file info (for file length) assert(fstat(fd, &finfo) == 0); // Memory map the file assert((fdata = mmap(0, finfo.st_size + 1, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0)) != MAP_FAILED); // Setup scheduler args mr_param_t mr_param; memset(&mr_param, 0, sizeof(mr_param_t)); mr_param.nr_cpus = nprocs; mr_param.map_func = linear_regression_map; mr_param.app_arg.atype = atype_mapreduce; mr_param.app_arg.mapreduce.reduce_func = linear_regression_reduce; mr_param.app_arg.mapreduce.combiner = linear_regression_combine; memset(&final_vals, 0, sizeof(final_vals)); mr_param.app_arg.mapreduce.results = &final_vals; defsplitter_init(&ps, fdata, finfo.st_size - (finfo.st_size % sizeof(POINT_T)), map_tasks, sizeof(POINT_T)); mr_param.split_func = defsplitter; // Array splitter; mr_param.split_arg = &ps; // Array to regress mr_param.part_func = linear_regression_partition; mr_param.key_cmp = intkeycmp; //#define PREFETCH #ifdef PREFETCH int sum = 0; for (int i = 0; i < finfo.st_size; i += 4096) { sum += fdata[i]; } printf("ignore this %d\n", sum); #endif mr_print(!quiet, "Linear regression: running...\n"); assert(mr_run_scheduler(&mr_param) == 0); mr_print_stats(); long long n; double a, b, xbar, ybar, r2; long long SX_ll = 0, SY_ll = 0, SXX_ll = 0, SYY_ll = 0, SXY_ll = 0; // ADD UP RESULTS for (i = 0; i < final_vals.length; i++) { keyval_t *curr = &final_vals.data[i]; switch ((long int) curr->key) { case KEY_SX: SX_ll = (long long) curr->val; break; case KEY_SY: SY_ll = (long long) curr->val; break; case KEY_SXX: SXX_ll = (long long) curr->val; break; case KEY_SYY: SYY_ll = (long long) curr->val; break; case KEY_SXY: SXY_ll = (long long) curr->val; break; default: // INVALID KEY assert(0); break; } } double SX = (double) SX_ll; double SY = (double) SY_ll; double SXX = (double) SXX_ll; double SYY = (double) SYY_ll; double SXY = (double) SXY_ll; n = (long long) finfo.st_size / sizeof(POINT_T); b = (double) (n * SXY - SX * SY) / (n * SXX - SX * SX); a = (SY_ll - b * SX_ll) / n; xbar = (double) SX_ll / n; ybar = (double) SY_ll / n; r2 = (double) (n * SXY - SX * SY) * (n * SXY - SX * SY) / ((n * SXX - SX * SX) * (n * SYY - SY * SY)); if (!quiet) { printf("%2d Linear Regression Results:\n", nprocs); printf("\ta = %lf\n", a); printf("\tb = %lf\n", b); printf("\txbar = %lf\n", xbar); printf("\tybar = %lf\n", ybar); printf("\tr2 = %lf\n", r2); printf("\tSX = %lld\n", SX_ll); printf("\tSY = %lld\n", SY_ll); printf("\tSXX = %lld\n", SXX_ll); printf("\tSYY = %lld\n", SYY_ll); printf("\tSXY = %lld\n", SXY_ll); } free(final_vals.data); assert(munmap(fdata, finfo.st_size + 1) == 0); assert(close(fd) == 0); mr_finalize(); return 0; }