|
@@ -46,7 +46,7 @@ static struct starpu_task *create_task(starpu_tag_t id)
|
|
|
return task;
|
|
|
}
|
|
|
|
|
|
-static void create_task_pivot(starpu_data_handle_t *dataAp, unsigned nblocks,
|
|
|
+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))
|
|
@@ -80,7 +80,7 @@ static void create_task_pivot(starpu_data_handle_t *dataAp, unsigned nblocks,
|
|
|
else
|
|
|
{
|
|
|
starpu_tag_t *tags = malloc((nblocks - k)*sizeof(starpu_tag_t));
|
|
|
-
|
|
|
+
|
|
|
tags[0] = TAG11(k);
|
|
|
unsigned ind, ind2;
|
|
|
for (ind = k + 1, ind2 = 0; ind < nblocks; ind++, ind2++)
|
|
@@ -95,7 +95,8 @@ static void create_task_pivot(starpu_data_handle_t *dataAp, unsigned nblocks,
|
|
|
}
|
|
|
|
|
|
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 struct starpu_task *create_task_11_pivot(starpu_data_handle_t *dataAp, unsigned nblocks,
|
|
@@ -124,15 +125,15 @@ static struct starpu_task *create_task_11_pivot(starpu_data_handle_t *dataAp, un
|
|
|
return task;
|
|
|
}
|
|
|
|
|
|
-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;
|
|
|
|
|
|
/* printf("task 12 k,i = %d,%d TAG = %llx\n", k,i, TAG12(k,i)); */
|
|
|
|
|
|
struct starpu_task *task = create_task(TAG12(k, j));
|
|
|
-
|
|
|
+
|
|
|
task->cl = &cl12;
|
|
|
|
|
|
task->cl_arg = (void *)(task->tag_id);
|
|
@@ -160,21 +161,22 @@ static void create_task_12(starpu_data_handle_t *dataAp, unsigned nblocks, unsig
|
|
|
}
|
|
|
|
|
|
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 = create_task(TAG21(k, i));
|
|
|
|
|
|
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))
|
|
|
{
|
|
@@ -187,11 +189,12 @@ static void create_task_21(starpu_data_handle_t *dataAp, unsigned nblocks, unsig
|
|
|
starpu_tag_declare_deps(TAG21(k, i), 1, PIVOT(k, i));
|
|
|
|
|
|
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;
|
|
|
|
|
@@ -205,7 +208,7 @@ static void create_task_22(starpu_data_handle_t *dataAp, unsigned nblocks, unsig
|
|
|
|
|
|
/* which sub-data is manipulated ? */
|
|
|
task->handles[0] = get_block(dataAp, nblocks, k, i); /* produced by TAG21(k, i) */
|
|
|
- task->handles[1] = get_block(dataAp, nblocks, j, k); /* produced by TAG12(k, j) */
|
|
|
+ task->handles[1] = get_block(dataAp, nblocks, j, k); /* produced by TAG12(k, j) */
|
|
|
task->handles[2] = get_block(dataAp, nblocks, j, i); /* produced by TAG22(k-1, i, j) */
|
|
|
|
|
|
if (!no_prio && (i == k + 1) && (j == k +1) )
|
|
@@ -224,17 +227,19 @@ static void create_task_22(starpu_data_handle_t *dataAp, unsigned nblocks, unsig
|
|
|
}
|
|
|
|
|
|
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)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
@@ -258,26 +263,33 @@ static double dw_codelet_facto_pivot(starpu_data_handle_t *dataAp,
|
|
|
else
|
|
|
{
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
+ ret = create_task_22(dataAp, nblocks, k, i, j, get_block);
|
|
|
+ if (ret == -ENODEV) return ret;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -299,11 +311,8 @@ static double dw_codelet_facto_pivot(starpu_data_handle_t *dataAp,
|
|
|
/* schedule the codelet */
|
|
|
gettimeofday(&start, NULL);
|
|
|
ret = starpu_task_submit(entry_task);
|
|
|
- if (STARPU_UNLIKELY(ret == -ENODEV))
|
|
|
- {
|
|
|
- FPRINTF(stderr, "No worker may execute this task\n");
|
|
|
- exit(-1);
|
|
|
- }
|
|
|
+ if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
|
|
|
+ return ret;
|
|
|
|
|
|
/* stall the application until the end of computations */
|
|
|
starpu_tag_wait_array(ndeps, tags);
|
|
@@ -312,8 +321,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,
|
|
@@ -324,7 +333,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;
|
|
|
|
|
@@ -372,7 +381,7 @@ void STARPU_LU(lu_decomposition_pivot)(TYPE *matA, unsigned *ipiv, unsigned size
|
|
|
#endif
|
|
|
|
|
|
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);
|
|
@@ -384,6 +393,8 @@ void STARPU_LU(lu_decomposition_pivot)(TYPE *matA, unsigned *ipiv, unsigned size
|
|
|
/* gather all the data */
|
|
|
starpu_data_unpartition(dataA, 0);
|
|
|
free(piv_description);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -393,7 +404,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));
|
|
|
|
|
@@ -425,7 +436,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);
|
|
@@ -440,4 +451,6 @@ void STARPU_LU(lu_decomposition_pivot_no_stride)(TYPE **matA, unsigned *ipiv, un
|
|
|
starpu_data_unregister(dataAp[bi+nblocks*bj]);
|
|
|
}
|
|
|
free(dataAp);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|