static int create_task_pivot(starpu_data_handle_t *dataAp, unsigned nblocks, struct piv_s *piv_description, unsigned k, unsigned i, starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned)) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &cl_pivot; /* which sub-data is manipulated ? */ task->handles[0] = get_block(dataAp, nblocks, k, i); task->tag_id = PIVOT(k, i); task->cl_arg = &piv_description[k]; /* this is an important task */ if (!no_prio && (i == k+1)) task->priority = STARPU_MAX_PRIO; ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); return ret; }
static void create_task_12(starpu_data_handle *dataAp, unsigned nblocks, unsigned k, unsigned j, starpu_data_handle (* get_block)(starpu_data_handle *, unsigned, unsigned, unsigned)) { // printf("task 12 k,i = %d,%d TAG = %llx\n", k,i, TAG12(k,i)); struct starpu_task *task = create_task(); task->cl = &cl12; task->cl_arg = NULL; /* which sub-data is manipulated ? */ task->buffers[0].handle = get_block(dataAp, nblocks, k, k); task->buffers[0].mode = STARPU_R; task->buffers[1].handle = get_block(dataAp, nblocks, j, k); task->buffers[1].mode = STARPU_RW; if (!no_prio && (j == k+1)) { task->priority = STARPU_MAX_PRIO; } /* enforce dependencies ... */ #if 0 starpu_tag_declare_deps(TAG12(k, i), 1, PIVOT(k, i)); #endif if (k > 0) { starpu_task_declare_deps_array(task, 1, &EVENT(k,k)); starpu_task_declare_deps_array(task, 1, &EVENT(k,j)); } else { starpu_task_declare_deps_array(task, 1, &EVENT(k,k)); } starpu_task_submit(task, NULL); }
static void create_task_pivot(starpu_data_handle *dataAp, unsigned nblocks, struct piv_s *piv_description, unsigned k, unsigned i, starpu_data_handle (* get_block)(starpu_data_handle *, unsigned, unsigned, unsigned)) { struct starpu_task *task = create_task(); task->cl = &cl_pivot; /* which sub-data is manipulated ? */ task->buffers[0].handle = get_block(dataAp, nblocks, k, i); task->buffers[0].mode = STARPU_RW; task->cl_arg = &piv_description[k]; /* this is an important task */ if (!no_prio && (i == k+1)) task->priority = STARPU_MAX_PRIO; /* enforce dependencies ... */ if (k == 0) { starpu_task_declare_deps_array(task, 1, &EVENT(k,k)); } else { if (i > k) { starpu_event deps[] = {EVENT(k,k), EVENT(i,k)}; starpu_task_declare_deps_array(task, 2, deps); } else { starpu_task_declare_deps_array(task, 1, &EVENT(k,k)); unsigned ind; for (ind = k + 1; ind < nblocks; ind++) starpu_task_declare_deps_array(task, 1, &EVENT(ind,k)); } } starpu_task_submit(task, &PIVOT(i)); }
static void create_task_21(starpu_data_handle *dataAp, unsigned nblocks, unsigned k, unsigned i, starpu_data_handle (* get_block)(starpu_data_handle *, unsigned, unsigned, unsigned)) { struct starpu_task *task = create_task(); task->cl = &cl21; /* which sub-data is manipulated ? */ task->buffers[0].handle = get_block(dataAp, nblocks, k, k); task->buffers[0].mode = STARPU_R; task->buffers[1].handle = get_block(dataAp, nblocks, k, i); task->buffers[1].mode = STARPU_RW; if (!no_prio && (i == k+1)) { task->priority = STARPU_MAX_PRIO; } task->cl_arg = NULL; /* enforce dependencies ... */ starpu_task_submit_ex(task, 1, &PIVOT(i), &EVENT(i,k)); }
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; }