Browse Source

Add missing test

Samuel Thibault 12 years ago
parent
commit
67b1bdb3a4
1 changed files with 178 additions and 0 deletions
  1. 178 0
      tests/datawizard/commute.c

+ 178 - 0
tests/datawizard/commute.c

@@ -0,0 +1,178 @@
+/* StarPU --- Runtime system for heterogeneous multicore architectures.
+ *
+ * Copyright (C) 2013 Université de Bordeaux 1
+ *
+ * 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 <config.h>
+#include <starpu.h>
+#include "../helper.h"
+
+void begin(void *descr[], void *_args __attribute__((unused)))
+{
+	int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[0]);
+
+	*x = 0;
+}
+
+static struct starpu_codelet codelet_begin =
+{
+	.cpu_funcs = {begin, NULL},
+	.cpu_funcs_name = {"begin", NULL},
+	.nbuffers = 1,
+};
+
+
+
+void commute1(void *descr[], void *_args __attribute__((unused)))
+{
+	int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[0]);
+
+	*x = 1;
+}
+
+static struct starpu_codelet codelet_commute1 =
+{
+	.cpu_funcs = {commute1, NULL},
+	.cpu_funcs_name = {"commute1", NULL},
+	.nbuffers = 1,
+	.modes = {STARPU_RW | STARPU_COMMUTE}
+};
+
+
+
+void commute2(void *descr[], void *_args __attribute__((unused)))
+{
+	int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[0]);
+
+	*x = 2;
+}
+
+static struct starpu_codelet codelet_commute2 =
+{
+	.cpu_funcs = {commute2, NULL},
+	.cpu_funcs_name = {"commute2", NULL},
+	.nbuffers = 1,
+	.modes = {STARPU_W | STARPU_COMMUTE}
+};
+
+void commute3(void *descr[] __attribute__((unused)), void *_args __attribute__((unused)))
+{
+}
+
+static struct starpu_codelet codelet_commute3 =
+{
+	.cpu_funcs = {commute3, NULL},
+	.cpu_funcs_name = {"commute3", NULL},
+	.nbuffers = 1,
+	.modes = {STARPU_RW | STARPU_COMMUTE}
+};
+
+
+
+static struct starpu_codelet codelet_end;
+void end(void *descr[], void *_args __attribute__((unused)))
+{
+	int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[0]);
+
+	if (codelet_end.modes[0] & STARPU_W)
+		(*x)++;
+}
+
+static struct starpu_codelet codelet_end =
+{
+	.cpu_funcs = {end, NULL},
+	.cpu_funcs_name = {"end", NULL},
+	.nbuffers = 1,
+};
+
+static int x;
+static starpu_data_handle_t x_handle, f_handle;
+
+static void test(enum starpu_data_access_mode begin_mode, enum starpu_data_access_mode end_mode, int order)
+{
+	struct starpu_task *begin_t, *commute1_t, *commute2_t, *end_t;
+
+	codelet_begin.modes[0] = begin_mode;
+	codelet_end.modes[0] = end_mode;
+
+	begin_t = starpu_task_create();
+	begin_t->cl = &codelet_begin;
+	begin_t->handles[0] = x_handle;
+	begin_t->use_tag = 1;
+	begin_t->tag_id = 0;
+
+	commute1_t = starpu_task_create();
+	commute1_t->cl = &codelet_commute1;
+	commute1_t->handles[0] = x_handle;
+
+	commute2_t = starpu_task_create();
+	commute2_t->cl = &codelet_commute2;
+	commute2_t->handles[0] = x_handle;
+
+	if (order)
+		starpu_task_declare_deps_array(commute2_t, 1, &commute1_t);
+	else
+		starpu_task_declare_deps_array(commute1_t, 1, &commute2_t);
+
+	end_t = starpu_task_create();
+	end_t->cl = &codelet_end;
+	end_t->handles[0] = x_handle;
+	end_t->detach = 0;
+
+	if (starpu_task_submit(begin_t) == -ENODEV)
+		exit(STARPU_TEST_SKIPPED);
+	if (starpu_task_submit(commute1_t) == -ENODEV)
+		exit(STARPU_TEST_SKIPPED);
+	if (starpu_task_submit(commute2_t) == -ENODEV)
+		exit(STARPU_TEST_SKIPPED);
+	starpu_insert_task(&codelet_commute3, STARPU_RW|STARPU_COMMUTE, x_handle, 0);
+	if (starpu_task_submit(end_t) == -ENODEV)
+		exit(STARPU_TEST_SKIPPED);
+
+	starpu_task_wait(end_t);
+	starpu_data_acquire(x_handle, STARPU_R);
+	if (x != 1 + order + !!(end_mode & STARPU_W))
+		exit(EXIT_FAILURE);
+	starpu_data_release(x_handle);
+}
+
+int main(int argc, char **argv)
+{
+        int i, ret;
+
+	ret = starpu_initialize(NULL, &argc, &argv);
+	if (ret == -ENODEV) return STARPU_TEST_SKIPPED;
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_init");
+
+	/* Declare x */
+	starpu_variable_data_register(&x_handle, 0, (uintptr_t)&x, sizeof(x));
+
+	for (i = 0; i <= 1; i++)
+	{
+		test(STARPU_R, STARPU_R, i);
+		test(STARPU_W, STARPU_R, i);
+		test(STARPU_W, STARPU_RW, i);
+		test(STARPU_R, STARPU_RW, i);
+	}
+
+	starpu_shutdown();
+	STARPU_RETURN(0);
+
+enodev:
+	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();
+	return STARPU_TEST_SKIPPED;
+}