浏览代码

Add a test for the new driver interface.

Cyril Roelandt 13 年之前
父节点
当前提交
7cfe201d97
共有 2 个文件被更改,包括 240 次插入0 次删除
  1. 1 0
      tests/Makefile.am
  2. 239 0
      tests/main/driver_api/init_run_deinit.c

+ 1 - 0
tests/Makefile.am

@@ -115,6 +115,7 @@ noinst_PROGRAMS =				\
 	starpu_machine_display			\
 	main/deprecated_func			\
 	main/deprecated_buffer			\
+	main/driver_api/init_run_deinit         \
 	main/restart				\
 	main/execute_on_a_specific_worker	\
 	main/insert_task			\

+ 239 - 0
tests/main/driver_api/init_run_deinit.c

@@ -0,0 +1,239 @@
+#include <starpu.h>
+#include <starpu_opencl.h>
+
+#include "../../helper.h"
+
+#define NTASKS 8
+
+#if defined(STARPU_USE_CPU) || defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL)
+static void
+dummy(void *buffers[], void *args)
+{
+	(void) buffers;
+	(*(int *)args)++;
+}
+
+static struct starpu_codelet cl =
+{
+	.cpu_funcs    = { dummy, NULL },
+	.cuda_funcs   = { dummy, NULL },
+	.opencl_funcs = { dummy, NULL },
+	.nbuffers     = 0
+};
+
+static void
+init_driver(struct starpu_driver *d)
+{
+	int ret;
+	ret = starpu_driver_init(d);
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_init");
+}
+
+static void
+run(struct starpu_task *task, struct starpu_driver *d)
+{
+	int ret;
+	ret = starpu_task_submit(task);
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
+	ret = starpu_driver_run_once(d);
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_run_once");
+}
+
+static void
+deinit_driver(struct starpu_driver *d)
+{
+	int ret; 
+	ret = starpu_driver_deinit(d);
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_deinit");
+}
+#endif /* STARPU_USE_CPU || STARPU_USE_CUDA || STARPU_USE_OPENCL */
+
+#ifdef STARPU_USE_CPU
+static int
+test_cpu(void)
+{
+	int var = 0, ret;
+	struct starpu_conf conf;
+
+	ret = starpu_conf_init(&conf);
+	if (ret == -EINVAL)
+		return 1;
+	
+
+	struct starpu_driver d =
+	{
+		.type = STARPU_CPU_WORKER,
+		.id.cpu_id = 0
+	};
+
+	conf.not_launched_drivers = &d;
+	conf.n_not_launched_drivers = 1;
+
+	ret = starpu_init(&conf);
+	if (ret == -ENODEV)
+		return STARPU_TEST_SKIPPED;
+
+	init_driver(&d);
+	int i;	
+	for (i = 0; i < NTASKS; i++)
+	{
+		struct starpu_task *task;
+		task = starpu_task_create();
+		cl.where = STARPU_CPU;
+		task->cl = &cl;
+		task->cl_arg = &var;
+
+		run(task, &d);
+	}
+	deinit_driver(&d);
+
+	starpu_task_wait_for_all();
+	starpu_shutdown();
+
+	fprintf(stderr, "[CPU] Var is %d\n", var);
+	return !!(var != NTASKS);
+}
+#endif /* STARPU_USE_CPU */
+
+#ifdef STARPU_USE_CUDA
+static int
+test_cuda(void)
+{
+	int var = 0, ret;
+	struct starpu_conf conf;
+
+	ret = starpu_conf_init(&conf);
+	if (ret == -EINVAL)
+		return 1;
+	
+
+	struct starpu_driver d =
+	{
+		.type = STARPU_CUDA_WORKER,
+		.id.cuda_id = 0
+	};
+
+	conf.ncuda = 1;
+	conf.nopencl = 0;
+	conf.not_launched_drivers = &d;
+	conf.n_not_launched_drivers = 1;
+
+	ret = starpu_init(&conf);
+	if (ret == -ENODEV)
+		return STARPU_TEST_SKIPPED;
+
+
+	init_driver(&d);
+	int i;	
+	for (i = 0; i < NTASKS; i++)
+	{
+		struct starpu_task *task;
+		task = starpu_task_create();
+		cl.where = STARPU_CUDA;
+		task->cl = &cl;
+		task->cl_arg = &var;
+
+		run(task, &d);
+	}
+	deinit_driver(&d);
+
+	starpu_task_wait_for_all();
+	starpu_shutdown();
+
+	fprintf(stderr, "[CUDA] Var is %d\n", var);
+	return !!(var != NTASKS);
+}
+#endif /* STARPU_USE_CUDA */
+
+#ifdef STARPU_USE_OPENCL
+static int
+test_opencl(void)
+{
+        cl_int err;
+        cl_platform_id platform;
+        cl_uint dummy;
+
+        err = clGetPlatformIDs(1, &platform, &dummy);
+        if (err != CL_SUCCESS)
+        {   
+                fprintf(stderr, "%s:%d\n", __func__, __LINE__);
+		return 1;
+	}
+
+	cl_device_id device_id;
+        err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL);
+        if (err != CL_SUCCESS)
+        {   
+                fprintf(stderr, "%s:%d\n", __func__, __LINE__);
+		return 1;
+	}
+
+	int var = 0, ret;
+	struct starpu_conf conf;
+
+	ret = starpu_conf_init(&conf);
+	if (ret == -EINVAL)
+		return 1;
+	
+	struct starpu_driver d =
+	{
+		.type = STARPU_OPENCL_WORKER,
+		.id.opencl_id = device_id
+	};
+
+	conf.ncuda = 0;
+	conf.nopencl = 1;
+	conf.not_launched_drivers = &d;
+	conf.n_not_launched_drivers = 1;
+
+	ret = starpu_init(&conf);
+	if (ret == -ENODEV)
+		return STARPU_TEST_SKIPPED;
+
+
+	init_driver(&d);
+	int i;	
+	for (i = 0; i < NTASKS; i++)
+	{
+		struct starpu_task *task;
+		task = starpu_task_create();
+		cl.where = STARPU_OPENCL;
+		task->cl = &cl;
+		task->cl_arg = &var;
+
+		run(task, &d);
+	}
+	deinit_driver(&d);
+
+
+	starpu_task_wait_for_all();
+	starpu_shutdown();
+
+	FPRINTF(stderr, "[OpenCL] Var is %d\n", var);
+	return !!(var != NTASKS);
+}
+#endif /* STARPU_USE_OPENCL */
+
+int
+main(void)
+{
+	int ret = STARPU_TEST_SKIPPED;
+
+#ifdef STARPU_USE_CPU
+	ret = test_cpu();
+	if (ret == 1)
+		return ret;
+#endif
+#ifdef STARPU_USE_CUDA
+	ret = test_cuda();
+	if (ret == 1)
+		return ret;
+#endif
+#ifdef STARPU_USE_OPENCL
+	ret = test_opencl();
+	if (ret == 1)
+		return ret;
+#endif
+
+	return ret;
+}