int main(int argc, char **argv) { struct timeval start; struct timeval stop; unsigned long elapsed; double result; double *B = malloc(size*sizeof(double)); tareador_ON (); int i; tareador_start_task("init_A"); for (i=0; i< size; i++) A[i]=i; tareador_end_task(); tareador_start_task("init_B"); for (i=0; i< size; i++) B[i]=2*i; tareador_end_task(); gettimeofday(&start,NULL); dot_product (size, A, B, &result); tareador_OFF (); gettimeofday(&stop,NULL); elapsed = 1000000 * (stop.tv_sec - start.tv_sec); elapsed += stop.tv_usec - start.tv_usec; printf("Result of Dot product i= %le\n", result); printf("Execution time (us): %lu \n", elapsed); return 0; }
void multisort(long n, T data[n], T tmp[n]) { if (n >= MIN_SORT_SIZE*4L) { // Recursive decomposition tareador_start_task("RecursiveMultisort"); multisort(n/4L, &data[0], &tmp[0]); multisort(n/4L, &data[n/4L], &tmp[n/4L]); multisort(n/4L, &data[n/2L], &tmp[n/2L]); multisort(n/4L, &data[3L*n/4L], &tmp[3L*n/4L]); merge(n/4L, &data[0], &data[n/4L], &tmp[0], 0, n/2L); merge(n/4L, &data[n/2L], &data[3L*n/4L], &tmp[n/2L], 0, n/2L); merge(n/2L, &tmp[0], &tmp[n/2L], &data[0], 0, n); tareador_end_task("RecursiveMultisort");; } else { // Base case tareador_start_task("BaseCaseMultisort"); basicsort(n, data); tareador_end_task("BaseCaseMultisort"); } }
void merge(long n, T left[n], T right[n], T result[n*2], long start, long length) { if (length < MIN_MERGE_SIZE*2L) { // Una tasca de tareador por cada llamada // Base case #if _EXTRAE_ Extrae_event(PROGRAM, MERGE); #endif #if _TAREADOR_ tareador_start_task("basemerge"); #endif basicmerge(n, left, right, result, start, length); #if _TAREADOR_ tareador_end_task(); #endif #if _EXTRAE_ Extrae_event(PROGRAM, END); #endif } else { // Recursive decomposition #if _TAREADOR_ tareador_start_task("mergeinside1"); #endif merge(n, left, right, result, start, length/2); #if _TAREADOR_ tareador_end_task(); tareador_start_task("mergeinside2"); #endif merge(n, left, right, result, start + length/2, length/2); #if _TAREADOR_ tareador_end_task(); #endif } }
void merge(long n, T left[n], T right[n], T result[n*2], long start, long length) { if (length < MIN_MERGE_SIZE*2L) { // Base case tareador_start_task("BaseCaseMerge"); basicmerge(n, left, right, result, start, length); tareador_end_task("BaseCaseMerge"); } else { // Recursive decomposition tareador_start_task("RecursiveMerge"); merge(n, left, right, result, start, length/2); merge(n, left, right, result, start + length/2, length/2); tareador_end_task("RecursiveMerge"); } }
void dot_product (long N, double A[N], double B[N], double *acc){ double prod; *acc=0.0; int i; for (i=0; i<N; i++) { tareador_start_task("dot_product"); prod = my_func(A[i], B[i]); tareador_disable_object(acc); *acc += prod; tareador_enable_object(acc); tareador_end_task(); } }
int main( int argc, char *argv[] ) { unsigned iter; FILE *infile, *resfile; char *resfilename; // algorithmic parameters algoparam_t param; int np; double runtime, flop; double residual=0.0; // check arguments if( argc < 2 ) { usage( argv[0] ); return 1; } // check input file if( !(infile=fopen(argv[1], "r")) ) { fprintf(stderr, "\nError: Cannot open \"%s\" for reading.\n\n", argv[1]); usage(argv[0]); return 1; } // check result file resfilename= (argc>=3) ? argv[2]:"heat.ppm"; if( !(resfile=fopen(resfilename, "w")) ) { fprintf(stderr, "\nError: Cannot open \"%s\" for writing.\n\n", resfilename); usage(argv[0]); return 1; } // check input if( !read_input(infile, ¶m) ) { fprintf(stderr, "\nError: Error parsing input file.\n\n"); usage(argv[0]); return 1; } print_params(¶m); if( !initialize(¶m) ) { fprintf(stderr, "Error in Solver initialization.\n\n"); usage(argv[0]); return 1; } // full size (param.resolution are only the inner points) np = param.resolution + 2; tareador_ON(); // starting time runtime = wtime(); iter = 0; while(1) { switch( param.algorithm ) { case 0: // JACOBI residual = relax_jacobi(param.u, param.uhelp, np, np); // Copy uhelp into u int j; char msg[256]; sprintf(msg, "Copyto[i=%d]", 0); tareador_start_task(msg); for (int i=0; i<np; i++) { //tareador_disable_object(&j); for (j=0; j<np; j++) param.u[ i*np+j ] = param.uhelp[ i*np+j ]; //tareador_enable_object(&j); } tareador_end_task(); break; case 1: // RED-BLACK residual = relax_redblack(param.u, np, np); break; case 2: // GAUSS residual = relax_gauss(param.u, np, np); break; } iter++; // solution good enough ? // if (residual < 0.00005) break; // max. iteration reached ? (no limit with maxiter=0) if (param.maxiter>0 && iter>=param.maxiter) break; } // Flop count after iter iterations flop = iter * 11.0 * param.resolution * param.resolution; // stopping time runtime = wtime() - runtime; tareador_OFF(); fprintf(stdout, "Time: %04.3f ", runtime); fprintf(stdout, "(%3.3f GFlop => %6.2f MFlop/s)\n", flop/1000000000.0, flop/runtime/1000000); fprintf(stdout, "Convergence to residual=%f: %d iterations\n", residual, iter); // for plot... coarsen( param.u, np, np, param.uvis, param.visres+2, param.visres+2 ); write_image( resfile, param.uvis, param.visres+2, param.visres+2 ); finalize( ¶m ); return 0; }
void multisort(long n, T data[n], T tmp[n]) { if (n >= MIN_SORT_SIZE*4L) { // Recursive decomposition // Una tasca de tareador por cada llamada #if _TAREADOR_ tareador_start_task("multisort1"); #endif multisort(n/4L, &data[0], &tmp[0]); #if _TAREADOR_ tareador_end_task(); tareador_start_task("multisort2"); #endif multisort(n/4L, &data[n/4L], &tmp[n/4L]); #if _TAREADOR_ tareador_end_task(); tareador_start_task("multisort3"); #endif multisort(n/4L, &data[n/2L], &tmp[n/2L]); #if _TAREADOR_ tareador_end_task(); tareador_start_task("multisort4"); #endif multisort(n/4L, &data[3L*n/4L], &tmp[3L*n/4L]); #if _TAREADOR_ tareador_end_task(); tareador_start_task("merge1"); #endif merge(n/4L, &data[0], &data[n/4L], &tmp[0], 0, n/2L); #if _TAREADOR_ tareador_end_task(); tareador_start_task("merge2"); #endif merge(n/4L, &data[n/2L], &data[3L*n/4L], &tmp[n/2L], 0, n/2L); #if _TAREADOR_ tareador_end_task(); tareador_start_task("merge3"); #endif merge(n/2L, &tmp[0], &tmp[n/2L], &data[0], 0, n); #if _TAREADOR_ tareador_end_task(); #endif } else { // Base case #if _EXTRAE_ Extrae_event(PROGRAM, SORT); #endif #if _TAREADOR_ tareador_start_task("basesort"); #endif basicsort(n, data); #if _TAREADOR_ tareador_end_task(); #endif #if _EXTRAE_ Extrae_event(PROGRAM, END); #endif } }