Ver código fonte

examples/lu: deal with ENODEV error

Nathalie Furmento 13 anos atrás
pai
commit
52e3aca240

+ 8 - 8
examples/lu/lu_example.c

@@ -262,7 +262,7 @@ static void check_result(void)
 	/* compute "LU - A" in L*/
 	CPU_AXPY(size*size, -1.0, A_saved, 1, L, 1);
 	display_matrix(L, size, size, "Residuals");
-	
+
 #ifdef COMPLEX_LU
 	double err = CPU_ASUM(size*size, L, 1);
 	int max = CPU_IAMAX(size*size, L, 1);
@@ -333,24 +333,24 @@ int main(int argc, char **argv)
 			A_blocks = malloc(nblocks*nblocks*sizeof(TYPE **));
 			copy_matrix_into_blocks();
 
-			STARPU_LU(lu_decomposition_pivot_no_stride)(A_blocks, ipiv, size, size, nblocks);
+			ret = STARPU_LU(lu_decomposition_pivot_no_stride)(A_blocks, ipiv, size, size, nblocks);
 
 			copy_blocks_into_matrix();
 			free(A_blocks);
 		}
-		else 
+		else
 		{
 			struct timeval start;
 			struct timeval end;
 
 			gettimeofday(&start, NULL);
 
-			STARPU_LU(lu_decomposition_pivot)(A, ipiv, size, size, nblocks);
-	
+			ret = STARPU_LU(lu_decomposition_pivot)(A, ipiv, size, size, nblocks);
+
 			gettimeofday(&end, NULL);
 
 			double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
-			
+
 			unsigned n = size;
 			double flop = (2.0f*n*n*n)/3.0f;
 			FPRINTF(stderr, "Synthetic GFlops (TOTAL) : \n");
@@ -359,7 +359,7 @@ int main(int argc, char **argv)
 	}
 	else
 	{
-		STARPU_LU(lu_decomposition)(A, size, size, nblocks);
+		ret = STARPU_LU(lu_decomposition)(A, size, size, nblocks);
 	}
 
 	if (profile)
@@ -415,5 +415,5 @@ int main(int argc, char **argv)
 
 	starpu_shutdown();
 
-	return 0;
+	if (ret == -ENODEV) return 77; else return 0;
 }

+ 34 - 28
examples/lu/xlu.c

@@ -72,19 +72,19 @@ static struct starpu_task *create_task_11(starpu_data_handle_t dataA, unsigned k
 	return task;
 }
 
-static void create_task_12(starpu_data_handle_t dataA, unsigned k, unsigned j)
+static int create_task_12(starpu_data_handle_t dataA, unsigned k, unsigned j)
 {
 	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;
 
 	/* which sub-data is manipulated ? */
-	task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); 
-	task->handles[1] = starpu_data_get_sub_data(dataA, 2, j, k); 
+	task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k);
+	task->handles[1] = starpu_data_get_sub_data(dataA, 2, j, k);
 
 	if (!no_prio && (j == k+1))
 	{
@@ -102,19 +102,20 @@ static void create_task_12(starpu_data_handle_t dataA, unsigned k, unsigned j)
 	}
 
 	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 dataA, unsigned k, unsigned i)
+static int create_task_21(starpu_data_handle_t dataA, unsigned k, unsigned i)
 {
 	int ret;
 	struct starpu_task *task = create_task(TAG21(k, i));
 
 	task->cl = &cl21;
-	
+
 	/* which sub-data is manipulated ? */
-	task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); 
-	task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, i); 
+	task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k);
+	task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, i);
 
 	if (!no_prio && (i == k+1))
 	{
@@ -132,10 +133,11 @@ static void create_task_21(starpu_data_handle_t dataA, unsigned k, unsigned 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 dataA, unsigned k, unsigned i, unsigned j)
+static int create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, unsigned j)
 {
 	int ret;
 
@@ -146,7 +148,7 @@ static void create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, u
 	task->cl = &cl22;
 
 	/* which sub-data is manipulated ? */
-	task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, i); /* produced by TAG21(k, i) */ 
+	task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, i); /* produced by TAG21(k, i) */
 	task->handles[1] = starpu_data_get_sub_data(dataA, 2, j, k); /* produced by TAG12(k, j) */
 	task->handles[2] = starpu_data_get_sub_data(dataA, 2, j, i); /* produced by TAG22(k-1, i, j) */
 
@@ -166,14 +168,15 @@ static void create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, u
 	}
 
 	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 void dw_codelet_facto_v3(starpu_data_handle_t dataA, unsigned nblocks)
+static int dw_codelet_facto_v3(starpu_data_handle_t dataA, unsigned nblocks)
 {
 	int ret;
 	struct timeval start;
@@ -196,20 +199,24 @@ static void dw_codelet_facto_v3(starpu_data_handle_t dataA, unsigned nblocks)
 		else
 		{
 			ret = starpu_task_submit(task);
+			if (ret == -ENODEV) return ret;
 			STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
 		}
-		
+
 		for (i = k+1; i<nblocks; i++)
 		{
-			create_task_12(dataA, k, i);
-			create_task_21(dataA, k, i);
+			ret = create_task_12(dataA, k, i);
+			if (ret == -ENODEV) return ret;
+			ret = create_task_21(dataA, k, i);
+			if (ret == -ENODEV) return ret;
 		}
 
 		for (i = k+1; i<nblocks; i++)
 		{
 			for (j = k+1; j<nblocks; j++)
 			{
-				create_task_22(dataA, k, i, j);
+			     ret = create_task_22(dataA, k, i, j);
+			     if (ret == -ENODEV) return ret;
 			}
 		}
 	}
@@ -217,13 +224,8 @@ static void dw_codelet_facto_v3(starpu_data_handle_t dataA, unsigned nblocks)
 	/* 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) return ret;
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
 
 	/* stall the application until the end of computations */
 	starpu_tag_wait(TAG11(nblocks-1));
@@ -237,9 +239,11 @@ static void dw_codelet_facto_v3(starpu_data_handle_t dataA, unsigned nblocks)
 	unsigned n = starpu_matrix_get_nx(dataA);
 	double flop = (2.0f*n*n*n)/3.0f;
 	FPRINTF(stderr, "Synthetic GFlops : %2.2f\n", (flop/timing/1000.0f));
+
+	return 0;
 }
 
-void STARPU_LU(lu_decomposition)(TYPE *matA, unsigned size, unsigned ld, unsigned nblocks)
+int STARPU_LU(lu_decomposition)(TYPE *matA, unsigned size, unsigned ld, unsigned nblocks)
 {
 	starpu_data_handle_t dataA;
 
@@ -264,9 +268,11 @@ void STARPU_LU(lu_decomposition)(TYPE *matA, unsigned size, unsigned ld, unsigne
 
 	starpu_data_map_filters(dataA, 2, &f, &f2);
 
-	dw_codelet_facto_v3(dataA, nblocks);
+	int ret = dw_codelet_facto_v3(dataA, nblocks);
 
 	/* gather all the data */
 	starpu_data_unpartition(dataA, 0);
 	starpu_data_unregister(dataA);
+
+	return ret;
 }

+ 4 - 4
examples/lu/xlu.h

@@ -1,7 +1,7 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
  * Copyright (C) 2009, 2010-2011  Université de Bordeaux 1
- * Copyright (C) 2010, 2011  Centre National de la Recherche Scientifique
+ * Copyright (C) 2010, 2011, 2012  Centre National de la Recherche Scientifique
  *
  * StarPU is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by
@@ -113,8 +113,8 @@ struct piv_s
 	unsigned last; /* last element */
 };
 
-void STARPU_LU(lu_decomposition)(TYPE *matA, unsigned size, unsigned ld, unsigned nblocks);
-void STARPU_LU(lu_decomposition_pivot_no_stride)(TYPE **matA, unsigned *ipiv, unsigned size, unsigned ld, unsigned nblocks);
-void STARPU_LU(lu_decomposition_pivot)(TYPE *matA, unsigned *ipiv, unsigned size, unsigned ld, unsigned nblocks);
+int STARPU_LU(lu_decomposition)(TYPE *matA, unsigned size, unsigned ld, unsigned nblocks);
+int STARPU_LU(lu_decomposition_pivot_no_stride)(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);
 
 #endif /* __XLU_H__ */

+ 36 - 24
examples/lu/xlu_implicit.c

@@ -21,7 +21,7 @@
 
 static unsigned no_prio = 0;
 
-static void create_task_11(starpu_data_handle_t dataA, unsigned k)
+static int create_task_11(starpu_data_handle_t dataA, unsigned k)
 {
 	int ret;
 	struct starpu_task *task = starpu_task_create();
@@ -35,45 +35,48 @@ static void create_task_11(starpu_data_handle_t dataA, unsigned k)
 		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 dataA, unsigned k, unsigned j)
+static int create_task_12(starpu_data_handle_t dataA, unsigned k, unsigned j)
 {
 	int ret;
 	struct starpu_task *task = starpu_task_create();
 	task->cl = &cl12;
 
 	/* which sub-data is manipulated ? */
-	task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); 
-	task->handles[1] = starpu_data_get_sub_data(dataA, 2, j, k); 
+	task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k);
+	task->handles[1] = starpu_data_get_sub_data(dataA, 2, j, k);
 
 	if (!no_prio && (j == 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_21(starpu_data_handle_t dataA, unsigned k, unsigned i)
+static int create_task_21(starpu_data_handle_t dataA, unsigned k, unsigned i)
 {
 	int ret;
 	struct starpu_task *task = starpu_task_create();
 
 	task->cl = &cl21;
-	
+
 	/* which sub-data is manipulated ? */
-	task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k); 
-	task->handles[1] = starpu_data_get_sub_data(dataA, 2, k, i); 
+	task->handles[0] = starpu_data_get_sub_data(dataA, 2, k, k);
+	task->handles[1] = starpu_data_get_sub_data(dataA, 2, 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 dataA, unsigned k, unsigned i, unsigned j)
+static int create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, unsigned j)
 {
 	int ret;
 	struct starpu_task *task = starpu_task_create();
@@ -89,17 +92,19 @@ static void create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, u
 		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 void dw_codelet_facto_v3(starpu_data_handle_t dataA, unsigned nblocks)
+static int dw_codelet_facto_v3(starpu_data_handle_t dataA, unsigned nblocks)
 {
 	struct timeval start;
 	struct timeval end;
+	int ret;
 
 	/* create all the DAG nodes */
 	unsigned i,j,k;
@@ -108,17 +113,22 @@ static void dw_codelet_facto_v3(starpu_data_handle_t dataA, unsigned nblocks)
 
 	for (k = 0; k < nblocks; k++)
 	{
-		create_task_11(dataA, k);
-		
+		ret = create_task_11(dataA, k);
+		if (ret == -ENODEV) return ret;
+
 		for (i = k+1; i<nblocks; i++)
 		{
-			create_task_12(dataA, k, i);
-			create_task_21(dataA, k, i);
+		     ret = create_task_12(dataA, k, i);
+		     if (ret == -ENODEV) return ret;
+		     ret = create_task_21(dataA, k, i);
+		     if (ret == -ENODEV) return ret;
 		}
 
 		for (i = k+1; i<nblocks; i++)
-		for (j = k+1; j<nblocks; j++)
-				create_task_22(dataA, k, i, j);
+		     for (j = k+1; j<nblocks; j++) {
+			  ret = create_task_22(dataA, k, i, j);
+			  if (ret == -ENODEV) return ret;
+		     }
 	}
 
 	/* stall the application until the end of computations */
@@ -133,16 +143,17 @@ static void dw_codelet_facto_v3(starpu_data_handle_t dataA, unsigned nblocks)
 	unsigned n = starpu_matrix_get_nx(dataA);
 	double flop = (2.0f*n*n*n)/3.0f;
 	FPRINTF(stderr, "Synthetic GFlops : %2.2f\n", (flop/timing/1000.0f));
+	return 0;
 }
 
-void STARPU_LU(lu_decomposition)(TYPE *matA, unsigned size, unsigned ld, unsigned nblocks)
+int STARPU_LU(lu_decomposition)(TYPE *matA, unsigned size, unsigned ld, unsigned nblocks)
 {
 	starpu_data_handle_t dataA;
 
 	/* monitor and partition the A matrix into blocks :
 	 * one block is now determined by 2 unsigned (i,j) */
 	starpu_matrix_data_register(&dataA, 0, (uintptr_t)matA, ld, size, size, sizeof(TYPE));
-	
+
 	struct starpu_data_filter f =
 	{
 		.filter_func = starpu_vertical_block_filter_func,
@@ -157,9 +168,10 @@ void STARPU_LU(lu_decomposition)(TYPE *matA, unsigned size, unsigned ld, unsigne
 
 	starpu_data_map_filters(dataA, 2, &f, &f2);
 
-	dw_codelet_facto_v3(dataA, nblocks);
+	int ret = dw_codelet_facto_v3(dataA, nblocks);
 
 	/* gather all the data */
 	starpu_data_unpartition(dataA, 0);
 	starpu_data_unregister(dataA);
+	return ret;
 }

+ 57 - 39
examples/lu/xlu_implicit_pivot.c

@@ -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;
 }

+ 52 - 39
examples/lu/xlu_pivot.c

@@ -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;
 }