소스 검색

port r11504 from 1.1: Make run_driver cover the case when the task is not finished when we call starpu_drivers_request_termination. This is actually not working any more in the trunk, and needs fixing

Samuel Thibault 12 년 전
부모
커밋
dc2959f5f2
2개의 변경된 파일32개의 추가작업 그리고 9개의 파일을 삭제
  1. 10 0
      src/core/sched_ctx.c
  2. 22 9
      tests/main/driver_api/run_driver.c

+ 10 - 0
src/core/sched_ctx.c

@@ -847,6 +847,16 @@ void _starpu_decrement_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id)
 			return;
 		}
 		STARPU_PTHREAD_MUTEX_UNLOCK(&finished_submit_mutex);
+		/* FIXME: */
+		/* We also need to check for config->submitting = 0 (i.e. the
+		 * user calle starpu_drivers_request_termination()), in which
+		 * case we need to set config->running to 0 and wake workers,
+		 * so they can terminate, just like
+		 * starpu_drivers_request_termination() does.
+		 *
+		 * Set FIXME to 1 in tests/main/driver_api/run_driver.c to
+		 * check it is actually fixed.
+		 */
 	}
 
 	return;

+ 22 - 9
tests/main/driver_api/run_driver.c

@@ -15,6 +15,7 @@
  */
 
 #include <starpu.h>
+#include <unistd.h>
 
 #include "../../helper.h"
 
@@ -31,12 +32,18 @@
  * - STARPU_TEST_SKIPPED (non-critical errors)
  */
 
+/* See FIXME in src/core/sched_ctx.c about starpu_drivers_request_termination.
+ * This test should really use non-synchronous tasks, to properly cover all
+ * needed cases. */
+#define FIXME 0
+
 #if defined(STARPU_USE_CPU) || defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL)
 static void
 dummy(void *buffers[], void *args)
 {
 	(void) buffers;
 	(*(int *)args)++;
+	usleep(1000000);
 }
 
 static struct starpu_codelet cl =
@@ -93,7 +100,9 @@ test_cpu(void)
 	cl.where = STARPU_CPU;
 	task->cl = &cl;
 	task->cl_arg = &var;
+#if !FIXME
 	task->synchronous = 1;
+#endif
 	ret = starpu_task_submit(task);
 	if (ret == -ENODEV)
 	{
@@ -102,14 +111,14 @@ test_cpu(void)
 		goto out;
 	}
 
-	FPRINTF(stderr, "[CPU] Var = %d (expected value: 1)\n", var);
-	ret = !!(var != 1);
-
 out:
 	starpu_drivers_request_termination();
 	if (starpu_pthread_join(driver_thread, NULL) != 0)
 		return 1;
 	starpu_shutdown();
+
+	FPRINTF(stderr, "[CPU] Var = %d (expected value: 1)\n", var);
+	ret = !!(var != 1);
 	return ret;
 }
 #endif /* STARPU_USE_CPU */
@@ -150,7 +159,9 @@ test_cuda(void)
 	cl.where = STARPU_CUDA;
 	task->cl = &cl;
 	task->cl_arg = &var;
+#if !FIXME
 	task->synchronous = 1;
+#endif
 	ret = starpu_task_submit(task);
 	if (ret == -ENODEV)
 	{
@@ -159,14 +170,14 @@ test_cuda(void)
 		goto out;
 	}
 
-	FPRINTF(stderr, "[CUDA] Var = %d (expected value: 1)\n", var);
-	ret = !!(var != 1);
-
 out:
 	starpu_drivers_request_termination();
 	if (starpu_pthread_join(driver_thread, NULL) != 0)
 		return 1;
 	starpu_shutdown();
+
+	FPRINTF(stderr, "[CUDA] Var = %d (expected value: 1)\n", var);
+	ret = !!(var != 1);
 	return ret;
 }
 #endif /* STARPU_USE_CUDA */
@@ -233,7 +244,9 @@ test_opencl(void)
 	cl.where = STARPU_OPENCL;
 	task->cl = &cl;
 	task->cl_arg = &var;
+#if !FIXME
 	task->synchronous = 1;
+#endif
 	ret = starpu_task_submit(task);
 	if (ret == -ENODEV)
 	{
@@ -242,14 +255,14 @@ test_opencl(void)
 		goto out;
 	}
 
-	FPRINTF(stderr, "[OpenCL] Var = %d (expected value: 1)\n", var);
-	ret = !!(var != 1);
-
 out:
 	starpu_drivers_request_termination();
 	if (starpu_pthread_join(driver_thread, NULL) != 0)
 		return 1;
 	starpu_shutdown();
+
+	FPRINTF(stderr, "[OpenCL] Var = %d (expected value: 1)\n", var);
+	ret = !!(var != 1);
 	return ret;
 }
 #endif /* STARPU_USE_OPENCL */