Browse Source

starpufft: improve detection of ENODEV errors

   Update functions returning a struct starpu_task * to return an int and to pass the task as an out parameter
   This allows to return ENODEV when the task submission failed
Nathalie Furmento 13 years ago
parent
commit
31c427babb
5 changed files with 41 additions and 28 deletions
  1. 2 1
      starpufft/examples/testx.c
  2. 5 5
      starpufft/starpufft.h
  3. 19 13
      starpufft/starpufftx.c
  4. 7 4
      starpufft/starpufftx1d.c
  5. 8 5
      starpufft/starpufftx2d.c

+ 2 - 1
starpufft/examples/testx.c

@@ -222,7 +222,8 @@ int main(int argc, char *argv[])
 	printf("CUDA took %2.2f ms (%2.2f MB/s)\n\n", timing/1000, bytes/timing);
 #endif
 
-	STARPUFFT(execute)(plan, in, out);
+	ret = STARPUFFT(execute)(plan, in, out);
+	if (ret == -ENODEV) return 77;
 	STARPUFFT(showstats)(stdout);
 
 #ifdef STARPU_HAVE_FFTW

+ 5 - 5
starpufft/starpufft.h

@@ -1,7 +1,7 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
  * Copyright (C) 2009, 2011  Université de Bordeaux 1
- * Copyright (C) 2010  Centre National de la Recherche Scientifique
+ * Copyright (C) 2010, 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
@@ -39,11 +39,11 @@ starpufft(plan) starpufft(plan_dft_c2r_1d)(int n, unsigned flags); \
 void *starpufft(malloc)(size_t n); \
 void starpufft(free)(void *p); \
 \
-void starpufft(execute)(starpufft(plan) p, void *in, void *out); \
-struct starpu_task *starpufft(start)(starpufft(plan) p, void *in, void *out); \
+int starpufft(execute)(starpufft(plan) p, void *in, void *out); \
+int starpufft(start)(starpufft(plan) p, void *in, void *out, struct starpu_task **task); \
 \
-void starpufft(execute_handle)(starpufft(plan) p, starpu_data_handle_t in, starpu_data_handle_t out); \
-struct starpu_task *starpufft(start_handle)(starpufft(plan) p, starpu_data_handle_t in, starpu_data_handle_t out); \
+int starpufft(execute_handle)(starpufft(plan) p, starpu_data_handle_t in, starpu_data_handle_t out); \
+int starpufft(start_handle)(starpufft(plan) p, starpu_data_handle_t in, starpu_data_handle_t out, struct starpu_task **ptask); \
 \
 void starpufft(cleanup)(starpufft(plan) p); \
 void starpufft(destroy_plan)(starpufft(plan) p); \

+ 19 - 13
starpufft/starpufftx.c

@@ -200,10 +200,9 @@ static int can_execute(unsigned workerid, struct starpu_task *task, unsigned nim
 #include "starpufftx1d.c"
 #include "starpufftx2d.c"
 
-struct starpu_task *
-STARPUFFT(start)(STARPUFFT(plan) plan, void *_in, void *_out)
+int
+STARPUFFT(start)(STARPUFFT(plan) plan, void *_in, void *_out, struct starpu_task **task)
 {
-	struct starpu_task *task;
 	int z;
 
 	plan->in = _in;
@@ -224,7 +223,8 @@ STARPUFFT(start)(STARPUFFT(plan) plan, void *_in, void *_out)
 					for (z = 0; z < plan->totsize1; z++)
 						plan->twist1_tasks[z]->handles[0] = plan->in_handle;
 				}
-				task = STARPUFFT(start1dC2C)(plan, plan->in_handle, plan->out_handle);
+				int ret = STARPUFFT(start1dC2C)(plan, plan->in_handle, plan->out_handle, task);
+				if (ret == -ENODEV) return ret;
 				break;
 			default:
 				STARPU_ABORT();
@@ -241,13 +241,14 @@ STARPUFFT(start)(STARPUFFT(plan) plan, void *_in, void *_out)
 				for (z = 0; z < plan->totsize1; z++)
 					plan->twist1_tasks[z]->handles[0] = plan->in_handle;
 			}
-			task = STARPUFFT(start2dC2C)(plan, plan->in_handle, plan->out_handle);
+			int ret = STARPUFFT(start2dC2C)(plan, plan->in_handle, plan->out_handle, task);
+			if (ret == -ENODEV) return ret;
 			break;
 		default:
 			STARPU_ABORT();
 			break;
 	}
-	return task;
+	return 0;
 }
 
 void
@@ -262,13 +263,13 @@ STARPUFFT(cleanup)(STARPUFFT(plan) plan)
 	}
 }
 
-struct starpu_task *
-STARPUFFT(start_handle)(STARPUFFT(plan) plan, starpu_data_handle_t in, starpu_data_handle_t out)
+int
+STARPUFFT(start_handle)(STARPUFFT(plan) plan, starpu_data_handle_t in, starpu_data_handle_t out, struct starpu_task **ptask)
 {
-	return STARPUFFT(start1dC2C)(plan, in, out);
+     return STARPUFFT(start1dC2C)(plan, in, out, ptask);
 }
 
-void
+int
 STARPUFFT(execute)(STARPUFFT(plan) plan, void *in, void *out)
 {
 	int ret;
@@ -278,7 +279,9 @@ STARPUFFT(execute)(STARPUFFT(plan) plan, void *in, void *out)
 
 	gettimeofday(&start, NULL);
 
-	struct starpu_task *task = STARPUFFT(start)(plan, in, out);
+	struct starpu_task *task;
+	ret = STARPUFFT(start)(plan, in, out, &task);
+	if (ret == -ENODEV) return ret;
 	gettimeofday(&submit_tasks, NULL);
 	ret = starpu_task_wait(task);
 	STARPU_ASSERT(ret == 0);
@@ -288,14 +291,17 @@ STARPUFFT(execute)(STARPUFFT(plan) plan, void *in, void *out)
 	gettimeofday(&end, NULL);
 }
 
-void
+int
 STARPUFFT(execute_handle)(STARPUFFT(plan) plan, starpu_data_handle_t in, starpu_data_handle_t out)
 {
 	int ret;
 
-	struct starpu_task *task = STARPUFFT(start_handle)(plan, in, out);
+	struct starpu_task *task;
+	ret = STARPUFFT(start_handle)(plan, in, out, &task);
+	if (ret == -ENODEV) return ret;
 	ret = starpu_task_wait(task);
 	STARPU_ASSERT(ret == 0);
+	return 0;
 }
 
 /* Destroy FFTW plans, unregister and free buffers, and free tags */

+ 7 - 4
starpufft/starpufftx1d.c

@@ -772,8 +772,8 @@ if (PARALLEL) {
 }
 
 /* Actually submit all the tasks. */
-static struct starpu_task *
-STARPUFFT(start1dC2C)(STARPUFFT(plan) plan, starpu_data_handle_t in, starpu_data_handle_t out)
+static int
+STARPUFFT(start1dC2C)(STARPUFFT(plan) plan, starpu_data_handle_t in, starpu_data_handle_t out, struct starpu_task **ptask)
 {
 	STARPU_ASSERT(plan->type == C2C);
 	int z;
@@ -802,7 +802,8 @@ if (PARALLEL) {
 	ret = starpu_task_submit(plan->end_task);
 	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
 
-	return plan->end_task;
+	*ptask = plan->end_task;
+	return 0;
 } else /* !PARALLEL */ {
 	struct starpu_task *task;
 
@@ -815,8 +816,10 @@ if (PARALLEL) {
 	task->cl_arg = plan;
 
 	ret = starpu_task_submit(task);
+	if (ret == -ENODEV) return ret;
 	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
-	return task;
+	*ptask = task;
+	return 0;
 }
 }
 

+ 8 - 5
starpufft/starpufftx2d.c

@@ -770,8 +770,8 @@ if (PARALLEL) {
 }
 
 /* Actually submit all the tasks. */
-static struct starpu_task *
-STARPUFFT(start2dC2C)(STARPUFFT(plan) plan, starpu_data_handle_t in, starpu_data_handle_t out)
+static int
+STARPUFFT(start2dC2C)(STARPUFFT(plan) plan, starpu_data_handle_t in, starpu_data_handle_t out, struct starpu_task **ptask)
 {
 	STARPU_ASSERT(plan->type == C2C);
 	int z;
@@ -798,9 +798,10 @@ if (PARALLEL) {
 	}
 
 	ret = starpu_task_submit(plan->end_task);
+	if (ret == -ENODEV) return ret;
 	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
-
-	return plan->end_task;
+	*ptask = plan->end_task;
+	return 0;
 } else /* !PARALLEL */ {
 	struct starpu_task *task;
 
@@ -813,8 +814,10 @@ if (PARALLEL) {
 	task->cl_arg = plan;
 
 	ret = starpu_task_submit(task);
+	if (ret == -ENODEV) return ret;
 	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
-	return task;
+	*ptask = task;
+	return 0;
 }
 }