Browse Source

examples: deal with ENODEV errors

Nathalie Furmento 13 years ago
parent
commit
437affee48

+ 7 - 1
examples/axpy/axpy.c

@@ -152,11 +152,17 @@ int main(int argc, char **argv)
 		task->handles[1] = starpu_data_get_sub_data(handle_y, 1, b);
 
 		ret = starpu_task_submit(task);
+		if (ret == -ENODEV)
+		{
+		     ret = 77;
+		     goto enodev;
+		}
 		STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
 	}
 
 	starpu_task_wait_for_all();
 
+enodev:
 	starpu_data_unpartition(handle_x, 0);
 	starpu_data_unpartition(handle_y, 0);
 	starpu_data_unregister(handle_x);
@@ -176,5 +182,5 @@ int main(int argc, char **argv)
 	/* Stop StarPU */
 	starpu_shutdown();
 
-	return 0;
+	return ret;
 }

+ 25 - 15
examples/cholesky/cholesky_grain_tag.c

@@ -83,7 +83,7 @@ static struct starpu_codelet cl21 =
 	.model = &chol_model_21
 };
 
-static void create_task_21(starpu_data_handle_t dataA, unsigned k, unsigned j, unsigned reclevel)
+static int create_task_21(starpu_data_handle_t dataA, unsigned k, unsigned j, unsigned reclevel)
 {
 	int ret;
 
@@ -111,7 +111,8 @@ static void create_task_21(starpu_data_handle_t dataA, unsigned k, unsigned j, 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;
 }
 
 static struct starpu_codelet cl22 =
@@ -126,7 +127,7 @@ static struct starpu_codelet cl22 =
 	.model = &chol_model_22
 };
 
-static void create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, unsigned j, unsigned reclevel)
+static int create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, unsigned j, unsigned reclevel)
 {
 	int ret;
 
@@ -157,7 +158,8 @@ 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;
 }
 
 
@@ -167,7 +169,7 @@ static void create_task_22(starpu_data_handle_t dataA, unsigned k, unsigned i, u
  *	and construct the DAG
  */
 
-static void cholesky_grain_rec(float *matA, unsigned size, unsigned ld, unsigned nblocks, unsigned nbigblocks, unsigned reclevel)
+static int cholesky_grain_rec(float *matA, unsigned size, unsigned ld, unsigned nblocks, unsigned nbigblocks, unsigned reclevel)
 {
 	int ret;
 
@@ -210,17 +212,22 @@ static void cholesky_grain_rec(float *matA, unsigned size, unsigned ld, unsigned
 		else
 		{
 			ret = starpu_task_submit(task);
+			if (ret == -ENODEV) return 77;
 			STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
 		}
 
 		for (j = k+1; j<nblocks; j++)
 		{
-			create_task_21(dataA, k, j, reclevel);
+		     	ret = create_task_21(dataA, k, j, reclevel);
+			if (ret == -ENODEV) return 77;
 
 			for (i = k+1; i<nblocks; i++)
 			{
 				if (i <= j)
-					create_task_22(dataA, k, i, j, reclevel);
+				{
+				     ret = create_task_22(dataA, k, i, j, reclevel);
+				     if (ret == -ENODEV) return 77;
+				}
 			}
 		}
 	}
@@ -230,7 +237,7 @@ static void cholesky_grain_rec(float *matA, unsigned size, unsigned ld, unsigned
 	if (STARPU_UNLIKELY(ret == -ENODEV))
 	{
 		FPRINTF(stderr, "No worker may execute this task\n");
-		exit(-1);
+		return 77;
 	}
 
 	if (nblocks == nbigblocks)
@@ -239,7 +246,7 @@ static void cholesky_grain_rec(float *matA, unsigned size, unsigned ld, unsigned
 		starpu_tag_wait(TAG11_AUX(nblocks-1, reclevel));
 		starpu_data_unpartition(dataA, 0);
 		starpu_data_unregister(dataA);
-		return;
+		return 0;
 	}
 	else
 	{
@@ -266,7 +273,7 @@ static void cholesky_grain_rec(float *matA, unsigned size, unsigned ld, unsigned
 
 		float *newmatA = &matA[nbigblocks*(size/nblocks)*(ld+1)];
 
-		cholesky_grain_rec(newmatA, size/nblocks*(nblocks - nbigblocks), ld, (nblocks - nbigblocks)*2, (nblocks - nbigblocks)*2, reclevel+1);
+		return cholesky_grain_rec(newmatA, size/nblocks*(nblocks - nbigblocks), ld, (nblocks - nbigblocks)*2, (nblocks - nbigblocks)*2, reclevel+1);
 	}
 }
 
@@ -291,14 +298,15 @@ static void initialize_system(float **A, unsigned dim, unsigned pinned)
 	}
 }
 
-void cholesky_grain(float *matA, unsigned size, unsigned ld, unsigned nblocks, unsigned nbigblocks, unsigned pinned)
+int cholesky_grain(float *matA, unsigned size, unsigned ld, unsigned nblocks, unsigned nbigblocks, unsigned pinned)
 {
 	struct timeval start;
 	struct timeval end;
+	int ret;
 
 	gettimeofday(&start, NULL);
 
-	cholesky_grain_rec(matA, size, ld, nblocks, nbigblocks, 0);
+	ret = cholesky_grain_rec(matA, size, ld, nblocks, nbigblocks, 0);
 
 	gettimeofday(&end, NULL);
 
@@ -308,7 +316,7 @@ void cholesky_grain(float *matA, unsigned size, unsigned ld, unsigned nblocks, u
 
 	double flop = (1.0f*size*size*size)/3.0f;
 	FPRINTF(stderr, "Synthetic GFlops : %2.2f\n", (flop/timing/1000.0f));
-
+	return ret;
 }
 
 static void shutdown_system(float **matA, unsigned pinned)
@@ -333,6 +341,8 @@ int main(int argc, char **argv)
 	 *	Hilbert matrix : h(i,j) = 1/(i+j+1)
 	 * */
 
+     	int ret;
+
 	parse_args(argc, argv);
 
 	float *mat;
@@ -369,7 +379,7 @@ int main(int argc, char **argv)
 	}
 #endif
 
-	cholesky_grain(mat, size, size, nblocks, nbigblocks, pinned);
+	ret = cholesky_grain(mat, size, size, nblocks, nbigblocks, pinned);
 
 #ifdef CHECK_OUTPUT
 	FPRINTF(stdout, "Results :\n");
@@ -418,5 +428,5 @@ int main(int argc, char **argv)
 #endif
 
 	shutdown_system(&mat, pinned);
-	return 0;
+	return ret;
 }

+ 12 - 7
examples/cholesky/cholesky_implicit.c

@@ -72,7 +72,7 @@ static void callback_turn_spmd_on(void *arg __attribute__ ((unused)))
 	cl22.type = STARPU_SPMD;
 }
 
-static void _cholesky(starpu_data_handle_t dataA, unsigned nblocks)
+static int _cholesky(starpu_data_handle_t dataA, unsigned nblocks)
 {
 	int ret;
 	struct timeval start;
@@ -96,6 +96,7 @@ static void _cholesky(starpu_data_handle_t dataA, unsigned nblocks)
 					 STARPU_RW, sdatakk,
 					 STARPU_CALLBACK, (k == 3*nblocks/4)?callback_turn_spmd_on:NULL,
 					 0);
+		if (ret == -ENODEV) return 77;
 		STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task");
 
 		for (j = k+1; j<nblocks; j++)
@@ -107,6 +108,7 @@ static void _cholesky(starpu_data_handle_t dataA, unsigned nblocks)
 						 STARPU_R, sdatakk,
 						 STARPU_RW, sdatakj,
 						 0);
+			if (ret == -ENODEV) return 77;
 			STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task");
 
 			for (i = k+1; i<nblocks; i++)
@@ -122,6 +124,7 @@ static void _cholesky(starpu_data_handle_t dataA, unsigned nblocks)
 								 STARPU_R, sdatakj,
 								 STARPU_RW, sdataij,
 								 0);
+					if (ret == -ENODEV) return 77;
 					STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task");
                                 }
 			}
@@ -132,8 +135,6 @@ static void _cholesky(starpu_data_handle_t dataA, unsigned nblocks)
 	if (bound)
 		starpu_bound_stop();
 
-	starpu_data_unpartition(dataA, 0);
-
 	gettimeofday(&end, NULL);
 
 	double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
@@ -150,9 +151,10 @@ static void _cholesky(starpu_data_handle_t dataA, unsigned nblocks)
 		starpu_bound_compute(&res, NULL, 0);
 		FPRINTF(stderr, "Theoretical GFlops: %2.2f\n", (flop/res/1000000.0f));
 	}
+	return 0;
 }
 
-static void cholesky(float *matA, unsigned size, unsigned ld, unsigned nblocks)
+static int cholesky(float *matA, unsigned size, unsigned ld, unsigned nblocks)
 {
 	starpu_data_handle_t dataA;
 
@@ -174,9 +176,12 @@ static void cholesky(float *matA, unsigned size, unsigned ld, unsigned nblocks)
 
 	starpu_data_map_filters(dataA, 2, &f, &f2);
 
-	_cholesky(dataA, nblocks);
+	int ret = _cholesky(dataA, nblocks);
 
+	starpu_data_unpartition(dataA, 0);
 	starpu_data_unregister(dataA);
+
+	return ret;
 }
 
 int main(int argc, char **argv)
@@ -231,7 +236,7 @@ int main(int argc, char **argv)
 	}
 #endif
 
-	cholesky(mat, size, size, nblocks);
+	ret = cholesky(mat, size, size, nblocks);
 
 #ifdef PRINT_OUTPUT
 	FPRINTF(stdout, "Results :\n");
@@ -314,5 +319,5 @@ int main(int argc, char **argv)
 	starpu_free(mat);
 	starpu_shutdown();
 
-	return 0;
+	return ret;
 }

+ 18 - 11
examples/cholesky/cholesky_tile_tag.c

@@ -100,7 +100,7 @@ static struct starpu_codelet cl21 =
 	.model = &chol_model_21
 };
 
-static void create_task_21(unsigned k, unsigned j)
+static int create_task_21(unsigned k, unsigned j)
 {
 	int ret;
 
@@ -128,7 +128,8 @@ static void create_task_21(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 struct starpu_codelet cl22 =
@@ -150,7 +151,7 @@ static struct starpu_codelet cl22 =
 	.model = &chol_model_22
 };
 
-static void create_task_22(unsigned k, unsigned i, unsigned j)
+static int create_task_22(unsigned k, unsigned i, unsigned j)
 {
 	int ret;
 
@@ -181,17 +182,16 @@ static void create_task_22(unsigned k, unsigned i, 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;
 }
 
-
-
 /*
  *	code to bootstrap the factorization 
  *	and construct the DAG
  */
 
-static void cholesky_no_stride(void)
+static int cholesky_no_stride(void)
 {
 	int ret;
 
@@ -219,12 +219,16 @@ static void cholesky_no_stride(void)
 		
 		for (j = k+1; j<nblocks; j++)
 		{
-			create_task_21(k, j);
+			ret = create_task_21(k, j);
+			if (ret == -ENODEV) return 77;
 
 			for (i = k+1; i<nblocks; i++)
 			{
 				if (i <= j)
-					create_task_22(k, i, j);
+				{
+				     ret = create_task_22(k, i, j);
+				     if (ret == -ENODEV) return 77;
+				}
 			}
 		}
 	}
@@ -232,6 +236,7 @@ static void cholesky_no_stride(void)
 	/* schedule the codelet */
 	gettimeofday(&start, NULL);
 	ret = starpu_task_submit(entry_task);
+	if (ret == -ENODEV) return 77;
 	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
 
 	/* stall the application until the end of computations */
@@ -245,6 +250,8 @@ static void cholesky_no_stride(void)
 
 	double flop = (1.0f*size*size*size)/3.0f;
 	FPRINTF(stderr, "Synthetic GFlops : %2.2f\n", (flop/timing/1000.0f));
+
+	return 0;
 }
 
 int main(int argc, char **argv)
@@ -312,7 +319,7 @@ int main(int argc, char **argv)
 		}
 	}
 
-	cholesky_no_stride();
+	ret = cholesky_no_stride();
 
 	for (y = 0; y < nblocks; y++)
 	for (x = 0; x < nblocks; x++)
@@ -327,7 +334,7 @@ int main(int argc, char **argv)
 	starpu_helper_cublas_shutdown();
 
 	starpu_shutdown();
-	return 0;
+	return ret;
 }
 
 

+ 8 - 2
examples/mult/xgemm.c

@@ -306,7 +306,12 @@ int main(int argc, char **argv)
 			task->handles[2] = starpu_data_get_sub_data(C_handle, 2, x, y);
 
 			int ret = starpu_task_submit(task);
-			STARPU_ASSERT(!ret);
+			if (ret == -ENODEV)
+			{
+			     ret = 77;
+			     goto enodev;
+			}
+			STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
 		}
 
 		starpu_task_wait_for_all();
@@ -322,6 +327,7 @@ int main(int argc, char **argv)
 				*((unsigned long)ydim)*((unsigned long)zdim);
 	FPRINTF(stderr, "GFlop/s: %.2f\n", flops/timing/1000.0);
 
+enodev:
 	starpu_data_unpartition(C_handle, 0);
 	starpu_data_unpartition(B_handle, 0);
 	starpu_data_unpartition(A_handle, 0);
@@ -340,5 +346,5 @@ int main(int argc, char **argv)
 	starpu_helper_cublas_shutdown();
 	starpu_shutdown();
 
-	return 0;
+	return ret;
 }

+ 1 - 1
examples/tag_example/tag_example4.c

@@ -147,5 +147,5 @@ enodev:
 
 	FPRINTF(stderr, "TEST DONE ...\n");
 
-	return ret;
+	if (ret == -ENODEV) return 77; else return 0;
 }