|
@@ -25,10 +25,10 @@ static unsigned no_prio = 0;
|
|
|
* Construct the DAG
|
|
|
*/
|
|
|
|
|
|
-static void 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))
|
|
|
+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;
|
|
|
|
|
@@ -46,12 +46,13 @@ static void create_task_pivot(starpu_data_handle_t *dataAp, unsigned nblocks,
|
|
|
task->priority = STARPU_MAX_PRIO;
|
|
|
|
|
|
ret = starpu_task_submit(task);
|
|
|
- STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
|
|
|
+ if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
-static void create_task_11_pivot(starpu_data_handle_t *dataAp, unsigned nblocks,
|
|
|
- unsigned k, struct piv_s *piv_description,
|
|
|
- starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned))
|
|
|
+static int create_task_11_pivot(starpu_data_handle_t *dataAp, unsigned nblocks,
|
|
|
+ unsigned k, struct piv_s *piv_description,
|
|
|
+ starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned))
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
@@ -69,11 +70,12 @@ static void create_task_11_pivot(starpu_data_handle_t *dataAp, unsigned nblocks,
|
|
|
task->priority = STARPU_MAX_PRIO;
|
|
|
|
|
|
ret = starpu_task_submit(task);
|
|
|
- STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
|
|
|
+ if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
-static void create_task_12(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, unsigned j,
|
|
|
- starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned))
|
|
|
+static int create_task_12(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, unsigned j,
|
|
|
+ starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned))
|
|
|
{
|
|
|
int ret;
|
|
|
struct starpu_task *task = starpu_task_create();
|
|
@@ -88,30 +90,32 @@ static void create_task_12(starpu_data_handle_t *dataAp, unsigned nblocks, unsig
|
|
|
task->priority = STARPU_MAX_PRIO;
|
|
|
|
|
|
ret = starpu_task_submit(task);
|
|
|
- STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
|
|
|
+ if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
-static void create_task_21(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, unsigned i,
|
|
|
- starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned))
|
|
|
+static int create_task_21(starpu_data_handle_t *dataAp, unsigned nblocks, 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 = &cl21;
|
|
|
-
|
|
|
+
|
|
|
/* which sub-data is manipulated ? */
|
|
|
- task->handles[0] = get_block(dataAp, nblocks, k, k);
|
|
|
- task->handles[1] = get_block(dataAp, nblocks, k, i);
|
|
|
+ task->handles[0] = get_block(dataAp, nblocks, k, k);
|
|
|
+ task->handles[1] = get_block(dataAp, nblocks, k, i);
|
|
|
|
|
|
if (!no_prio && (i == k+1))
|
|
|
task->priority = STARPU_MAX_PRIO;
|
|
|
|
|
|
ret = starpu_task_submit(task);
|
|
|
- STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
|
|
|
+ if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
-static void create_task_22(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, unsigned i, unsigned j,
|
|
|
- starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned))
|
|
|
+static int create_task_22(starpu_data_handle_t *dataAp, unsigned nblocks, unsigned k, unsigned i, unsigned j,
|
|
|
+ starpu_data_handle_t (* get_block)(starpu_data_handle_t *, unsigned, unsigned, unsigned))
|
|
|
{
|
|
|
int ret;
|
|
|
struct starpu_task *task = starpu_task_create();
|
|
@@ -127,20 +131,23 @@ static void create_task_22(starpu_data_handle_t *dataAp, unsigned nblocks, unsig
|
|
|
task->priority = STARPU_MAX_PRIO;
|
|
|
|
|
|
ret = starpu_task_submit(task);
|
|
|
- STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
|
|
|
+ if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * code to bootstrap the factorization
|
|
|
+ * code to bootstrap the factorization
|
|
|
*/
|
|
|
|
|
|
-static double 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))
|
|
|
+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)
|
|
|
{
|
|
|
struct timeval start;
|
|
|
struct timeval end;
|
|
|
+ int ret;
|
|
|
|
|
|
gettimeofday(&start, NULL);
|
|
|
|
|
@@ -148,23 +155,32 @@ static double dw_codelet_facto_pivot(starpu_data_handle_t *dataAp,
|
|
|
unsigned i,j,k;
|
|
|
for (k = 0; k < nblocks; k++)
|
|
|
{
|
|
|
- create_task_11_pivot(dataAp, nblocks, k, piv_description, get_block);
|
|
|
+ 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)
|
|
|
- create_task_pivot(dataAp, nblocks, piv_description, k, i, get_block);
|
|
|
+ {
|
|
|
+ ret = create_task_pivot(dataAp, nblocks, piv_description, k, i, get_block);
|
|
|
+ if (ret == -ENODEV) return ret;
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
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);
|
|
|
+ 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;
|
|
|
}
|
|
|
|
|
|
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 (j = k+1; j<nblocks; j++)
|
|
|
+ {
|
|
|
+ ret = create_task_22(dataAp, nblocks, k, i, j, get_block);
|
|
|
+ if (ret == -ENODEV) return ret;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* stall the application until the end of computations */
|
|
@@ -172,8 +188,8 @@ static double dw_codelet_facto_pivot(starpu_data_handle_t *dataAp,
|
|
|
|
|
|
gettimeofday(&end, NULL);
|
|
|
|
|
|
- double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
|
|
|
- return timing;
|
|
|
+ *timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
starpu_data_handle_t get_block_with_striding(starpu_data_handle_t *dataAp,
|
|
@@ -184,7 +200,7 @@ starpu_data_handle_t get_block_with_striding(starpu_data_handle_t *dataAp,
|
|
|
}
|
|
|
|
|
|
|
|
|
-void STARPU_LU(lu_decomposition_pivot)(TYPE *matA, unsigned *ipiv, unsigned size, unsigned ld, unsigned nblocks)
|
|
|
+int STARPU_LU(lu_decomposition_pivot)(TYPE *matA, unsigned *ipiv, unsigned size, unsigned ld, unsigned nblocks)
|
|
|
{
|
|
|
starpu_data_handle_t dataA;
|
|
|
|
|
@@ -220,7 +236,7 @@ void STARPU_LU(lu_decomposition_pivot)(TYPE *matA, unsigned *ipiv, unsigned size
|
|
|
}
|
|
|
|
|
|
double timing;
|
|
|
- timing = dw_codelet_facto_pivot(&dataA, piv_description, nblocks, get_block_with_striding);
|
|
|
+ int ret = dw_codelet_facto_pivot(&dataA, piv_description, nblocks, get_block_with_striding, &timing);
|
|
|
|
|
|
FPRINTF(stderr, "Computation took (in ms)\n");
|
|
|
FPRINTF(stderr, "%2.2f\n", timing/1000);
|
|
@@ -234,6 +250,7 @@ void STARPU_LU(lu_decomposition_pivot)(TYPE *matA, unsigned *ipiv, unsigned size
|
|
|
starpu_data_unregister(dataA);
|
|
|
|
|
|
free(piv_description);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -243,7 +260,7 @@ starpu_data_handle_t get_block_with_no_striding(starpu_data_handle_t *dataAp, un
|
|
|
return dataAp[i+j*nblocks];
|
|
|
}
|
|
|
|
|
|
-void STARPU_LU(lu_decomposition_pivot_no_stride)(TYPE **matA, unsigned *ipiv, unsigned size, unsigned ld, unsigned nblocks)
|
|
|
+int STARPU_LU(lu_decomposition_pivot_no_stride)(TYPE **matA, unsigned *ipiv, unsigned size, unsigned ld, unsigned nblocks)
|
|
|
{
|
|
|
starpu_data_handle_t *dataAp = malloc(nblocks*nblocks*sizeof(starpu_data_handle_t));
|
|
|
|
|
@@ -272,7 +289,7 @@ void STARPU_LU(lu_decomposition_pivot_no_stride)(TYPE **matA, unsigned *ipiv, un
|
|
|
}
|
|
|
|
|
|
double timing;
|
|
|
- timing = dw_codelet_facto_pivot(dataAp, piv_description, nblocks, get_block_with_no_striding);
|
|
|
+ int ret = dw_codelet_facto_pivot(dataAp, piv_description, nblocks, get_block_with_no_striding, &timing);
|
|
|
|
|
|
FPRINTF(stderr, "Computation took (in ms)\n");
|
|
|
FPRINTF(stderr, "%2.2f\n", timing/1000);
|
|
@@ -287,4 +304,5 @@ void STARPU_LU(lu_decomposition_pivot_no_stride)(TYPE **matA, unsigned *ipiv, un
|
|
|
starpu_data_unregister(dataAp[bi+nblocks*bj]);
|
|
|
}
|
|
|
free(dataAp);
|
|
|
+ return ret;
|
|
|
}
|