Преглед на файлове

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 години
родител
ревизия
31c427babb
променени са 5 файла, в които са добавени 41 реда и са изтрити 28 реда
  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;
 }
 }