Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}