Browse Source

Add a trivial parallel kernel tester

Samuel Thibault 7 years ago
parent
commit
ce982da356
2 changed files with 134 additions and 1 deletions
  1. 2 1
      tests/Makefile.am
  2. 132 0
      tests/parallel_tasks/parallel_kernels_trivial.c

+ 2 - 1
tests/Makefile.am

@@ -1,7 +1,7 @@
 # StarPU --- Runtime system for heterogeneous multicore architectures.
 #
 # Copyright (C) 2010-2017                                Inria
-# Copyright (C) 2009-2017                                Université de Bordeaux
+# Copyright (C) 2009-2018                                Université de Bordeaux
 # Copyright (C) 2010-2017                                CNRS
 #
 # StarPU is free software; you can redistribute it and/or modify
@@ -343,6 +343,7 @@ myPROGRAMS +=				\
 	overlap/gpu_concurrency			\
 	parallel_tasks/explicit_combined_worker	\
 	parallel_tasks/parallel_kernels		\
+	parallel_tasks/parallel_kernels_trivial	\
 	parallel_tasks/parallel_kernels_spmd	\
 	parallel_tasks/spmd_peager		\
 	parallel_tasks/cuda_only		\

+ 132 - 0
tests/parallel_tasks/parallel_kernels_trivial.c

@@ -0,0 +1,132 @@
+/* StarPU --- Runtime system for heterogeneous multicore architectures.
+ *
+ * Copyright (C) 2012-2013                                Inria
+ * Copyright (C) 2010-2016,2018                           Université de Bordeaux
+ * Copyright (C) 2010-2013,2015,2017                      CNRS
+ * Copyright (C) 2013                                     Thibaut Lambert
+ *
+ * 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
+ * the Free Software Foundation; either version 2.1 of the License, or (at
+ * your option) any later version.
+ *
+ * StarPU is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License in COPYING.LGPL for more details.
+ */
+
+#include <starpu.h>
+#include <limits.h>
+#include <unistd.h>
+#include "../helper.h"
+
+/*
+ * Submit a simple testcase for parallel tasks.
+ */
+
+#define VECTORSIZE	1024
+
+void codelet_null(void *descr[], void *_args)
+{
+	(void)descr;
+	(void)_args;
+
+	STARPU_SKIP_IF_VALGRIND;
+
+	int worker_size = starpu_combined_worker_get_size();
+	STARPU_ASSERT(worker_size > 0);
+	usleep(1000/worker_size);
+#if 0
+	int id = starpu_worker_get_id();
+	int combined_id = starpu_combined_worker_get_id();
+	FPRINTF(stderr, "worker id %d - combined id %d - worker size %d\n", id, combined_id, worker_size);
+#endif
+}
+
+struct starpu_perfmodel model =
+{
+	.type = STARPU_HISTORY_BASED,
+	.symbol = "parallel_kernel_test"
+};
+
+static struct starpu_codelet cl =
+{
+	.type = STARPU_FORKJOIN,
+	.max_parallelism = INT_MAX,
+	.cpu_funcs = {codelet_null},
+	.cuda_funcs = {codelet_null},
+	.cpu_funcs_name = {"codelet_null"},
+        .opencl_funcs = {codelet_null},
+	.model = &model,
+	.nbuffers = 1,
+	.modes = {STARPU_R}
+};
+
+static struct starpu_codelet cl_seq =
+{
+	.cpu_funcs = {codelet_null},
+	.cuda_funcs = {codelet_null},
+	.cpu_funcs_name = {"codelet_null_seq"},
+        .opencl_funcs = {codelet_null},
+	.model = &model,
+	.nbuffers = 1,
+	.modes = {STARPU_R}
+};
+
+int main(void)
+{
+	int ret;
+	starpu_data_handle_t v_handle;
+	unsigned *v;
+
+        struct starpu_conf conf;
+	starpu_conf_init(&conf);
+	conf.ncpus = 2;
+	conf.sched_policy_name = "pheft";
+	conf.calibrate = 1;
+
+	ret = starpu_init(&conf);
+	if (ret == -ENODEV) return STARPU_TEST_SKIPPED;
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_init");
+
+	starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned));
+	starpu_vector_data_register(&v_handle, STARPU_MAIN_RAM, (uintptr_t)v, VECTORSIZE, sizeof(unsigned));
+
+	unsigned nworker = starpu_worker_get_count() + starpu_combined_worker_get_count();
+
+	/* First submit a sequential task */
+	ret = starpu_task_insert(&cl_seq, STARPU_R, v_handle, 0);
+	if (ret == -ENODEV) goto enodev;
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
+
+	/* Then a parallel task, which is not interesting to run in parallel when we have only two cpus */
+	ret = starpu_task_insert(&cl, STARPU_R, v_handle, 0);
+	if (ret == -ENODEV) goto enodev;
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
+
+        /* Then another parallel task, which is interesting to run in parallel
+        since the two cpus are now finishing at the same time. */
+	ret = starpu_task_insert(&cl, STARPU_R, v_handle, 0);
+	if (ret == -ENODEV) goto enodev;
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
+
+	ret = starpu_task_wait_for_all();
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all");
+
+	starpu_data_unregister(v_handle);
+	starpu_free(v);
+	starpu_shutdown();
+
+	STARPU_RETURN(EXIT_SUCCESS);
+
+enodev:
+	starpu_data_unregister(v_handle);
+	starpu_free(v);
+	fprintf(stderr, "WARNING: No one can execute this task\n");
+	/* yes, we do not perform the computation but we did detect that no one
+ 	 * could perform the kernel, so this is not an error from StarPU */
+	starpu_shutdown();
+	STARPU_RETURN(STARPU_TEST_SKIPPED);
+}