Browse Source

merge fix

Andra Hugo 13 years ago
parent
commit
4c98591124
1 changed files with 52 additions and 39 deletions
  1. 52 39
      examples/lu/xlu_pivot.c

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