瀏覽代碼

Add a test that uses the void interface in order to protect a critical section
from concurrent accesses.

Cédric Augonnet 14 年之前
父節點
當前提交
40d5e40a24
共有 2 個文件被更改,包括 88 次插入0 次删除
  1. 6 0
      tests/Makefile.am
  2. 82 0
      tests/datawizard/critical_section_with_void_interface.c

+ 6 - 0
tests/Makefile.am

@@ -116,6 +116,7 @@ check_PROGRAMS += 				\
 	datawizard/sync_with_data_with_mem_non_blocking_implicit\
 	datawizard/mpi_like			\
 	datawizard/mpi_like_async		\
+	datawizard/critical_section_with_void_interface\
 	errorcheck/starpu_init_noworker		\
 	errorcheck/invalid_blocking_calls	\
 	errorcheck/invalid_tasks		\
@@ -334,6 +335,11 @@ testbin_PROGRAMS +=				\
 datawizard_mpi_like_async_SOURCES =		\
 	datawizard/mpi_like_async.c
 
+testbin_PROGRAMS +=				\
+	datawizard/critical_section_with_void_interface
+datawizard_critical_section_with_void_interface_SOURCES =	\
+	datawizard/critical_section_with_void_interface.c
+
 if STARPU_USE_CUDA
 datawizard_mpi_like_SOURCES +=			\
 	datawizard/cuda_codelet_unsigned_inc.cu

+ 82 - 0
tests/datawizard/critical_section_with_void_interface.c

@@ -0,0 +1,82 @@
+/*
+ * StarPU
+ * Copyright (C) Université Bordeaux 1, CNRS 2008-2010 (see AUTHORS file)
+ *
+ * This program 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.
+ *
+ * This program 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 <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <starpu.h>
+#include <stdlib.h>
+
+starpu_data_handle void_handle;
+
+int critical_var;
+
+static void critical_section(void *descr[], __attribute__ ((unused)) void *_args)
+{
+	/* We do not protect this variable because it is only accessed when the
+	 * "void_handle" piece of data is accessed. */
+	critical_var++;
+}
+
+static starpu_codelet cl = {
+	.where = STARPU_CPU|STARPU_CUDA|STARPU_OPENCL,
+	.cpu_func = critical_section,
+	.cuda_func = critical_section,
+	.opencl_func = critical_section,
+	.nbuffers = 1
+};
+
+int main(int argc, char **argv)
+{
+	int ntasks = 1000;
+	int ret;
+
+	starpu_init(NULL);
+
+	critical_var = 0;
+
+	/* Create a void data which will be used as an exclusion mechanism. */
+	starpu_void_data_register(&void_handle);
+
+	int i;
+	for (i = 0; i < ntasks; i++)
+	{
+		struct starpu_task *task = starpu_task_create();
+			task->cl = &cl;
+			task->buffers[0].handle = void_handle;
+			task->buffers[0].mode = STARPU_RW;
+	
+		ret = starpu_task_submit(task);
+		if (ret == -ENODEV)
+			goto enodev;
+	}
+
+	starpu_data_unregister(void_handle);
+
+	STARPU_ASSERT(critical_var == ntasks);
+
+	fprintf(stderr, "CRITICAL : %d\n", critical_var);
+
+	starpu_shutdown();
+
+	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 */
+	return 0;
+}