static int dw_codelet_facto_pivot(starpu_data_handle_t *dataAp, struct piv_s *piv_description, unsigned nblocks, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned), double *timing) { double start; double end; int ret; /* create all the DAG nodes */ unsigned i,j,k; if (bound) starpu_bound_start(bounddeps, boundprio); start = starpu_timing_now(); for (k = 0; k < nblocks; k++) { ret = create_task_11_pivot(dataAp, nblocks, k, piv_description, get_block); if (ret == -ENODEV) return ret; for (i = 0; i < nblocks; i++) { if (i != k) { ret = create_task_pivot(dataAp, nblocks, piv_description, k, i, get_block); if (ret == -ENODEV) return ret; } } for (i = k+1; i<nblocks; i++) { ret = create_task_12(dataAp, nblocks, k, i, get_block); if (ret == -ENODEV) return ret; ret = create_task_21(dataAp, nblocks, k, i, get_block); if (ret == -ENODEV) return ret; } starpu_data_wont_use(get_block(dataAp, nblocks, k, k)); for (i = k+1; i<nblocks; i++) for (j = k+1; j<nblocks; j++) { ret = create_task_22(dataAp, nblocks, k, i, j, get_block); if (ret == -ENODEV) return ret; } for (i = k+1; i<nblocks; i++) { starpu_data_wont_use(get_block(dataAp, nblocks, k, i)); starpu_data_wont_use(get_block(dataAp, nblocks, i, k)); } } /* stall the application until the end of computations */ starpu_task_wait_for_all(); end = starpu_timing_now(); if (bound) starpu_bound_stop(); *timing = end - start; return 0; }
static double dw_codelet_facto_pivot(starpu_data_handle *dataAp, struct piv_s *piv_description, unsigned nblocks, starpu_data_handle (* get_block)(starpu_data_handle *, unsigned, unsigned, unsigned)) { struct timeval start; struct timeval end; /* create all the DAG nodes */ unsigned i,j,k; starpu_event first_event = starpu_event_create(); events = malloc(sizeof(starpu_event) * nblocks * nblocks); pivots = malloc(sizeof(starpu_event) * nblocks); EVENT(0,0) = first_event; starpu_event_retain(first_event); for (k = 0; k < nblocks; k++) { create_task_11_pivot(dataAp, nblocks, k, piv_description, get_block); for (i = 0; i < nblocks; i++) { if (i != k) create_task_pivot(dataAp, nblocks, piv_description, k, i, get_block); } for (i = k+1; i<nblocks; i++) { create_task_12(dataAp, nblocks, k, i, get_block); create_task_21(dataAp, nblocks, k, i, get_block); } for (i = k+1; i<nblocks; i++) { for (j = k+1; j<nblocks; j++) { create_task_22(dataAp, nblocks, k, i, j, get_block); } } for (i = 0; i < nblocks; i++) { if (i != k) starpu_event_release(PIVOT(i)); } } starpu_event last_event = EVENT(nblocks-1, nblocks-1); starpu_event_retain(last_event); for (i=0; i<nblocks; i++) for (j=0; j<nblocks && i<=j; j++) starpu_event_release(EVENT(i,j)); free(events); free(pivots); /*FIXME: we should wait for all the pivot tasks too */ /* schedule the codelet */ gettimeofday(&start, NULL); starpu_event_trigger(first_event); /* stall the application until the end of computations */ starpu_event_wait(last_event); gettimeofday(&end, NULL); double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec)); return timing; }