Browse Source

examples: add a basic c++ example

Nathalie Furmento 13 years ago
parent
commit
b87e0e4aad
2 changed files with 123 additions and 1 deletions
  1. 15 1
      examples/Makefile.am
  2. 108 0
      examples/cpp/incrementer_cpp.cpp

+ 15 - 1
examples/Makefile.am

@@ -17,6 +17,7 @@
 # See the GNU Lesser General Public License in COPYING.LGPL for more details.
 
 AM_CFLAGS = $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS)
+AM_CXXFLAGS = $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS)
 LIBS = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la $(MAGMA_LIBS) $(HWLOC_LIBS) @LIBS@
 AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/examples/ -I$(top_builddir)/include
 AM_LDFLAGS = $(STARPU_CUDA_LDFLAGS) $(STARPU_OPENCL_LDFLAGS)
@@ -158,6 +159,7 @@ examplebin_PROGRAMS +=				\
 	basic_examples/block			\
 	basic_examples/variable			\
 	basic_examples/multiformat              \
+	cpp/incrementer_cpp			\
 	filters/custom_mf/custom_mf_filter      \
 	filters/fvector				\
 	filters/fblock				\
@@ -220,6 +222,7 @@ STARPU_EXAMPLES +=				\
 	basic_examples/block			\
 	basic_examples/variable			\
 	basic_examples/multiformat              \
+	cpp/incrementer_cpp			\
 	filters/fvector				\
 	filters/fblock				\
 	filters/fmatrix				\
@@ -660,11 +663,22 @@ spmv_dw_block_spmv_LDADD =			\
 	$(STARPU_BLAS_LDFLAGS)
 endif
 
+###########################
+# C++ Incrementer example #
+###########################
+
+cpp_incrementer_cpp_SOURCES	=	\
+	cpp/incrementer_cpp.cpp
+
+#if STARPU_USE_CUDA
+#cpp_incrementer_cpp_SOURCES +=	\
+#	incrementer/incrementer_kernels.cu
+#endif
+
 #######################
 # Incrementer example #
 #######################
 
-
 incrementer_incrementer_SOURCES =	\
 	incrementer/incrementer.c
 if STARPU_USE_CUDA

+ 108 - 0
examples/cpp/incrementer_cpp.cpp

@@ -0,0 +1,108 @@
+/* StarPU --- Runtime system for heterogeneous multicore architectures.
+ *
+ * Copyright (C) 2009, 2010-2011  Université de Bordeaux 1
+ * Copyright (C) 2010, 2011, 2012  Centre National de la Recherche Scientifique
+ *
+ * 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 <pthread.h>
+#include <sys/time.h>
+
+static unsigned niter = 50;
+#define FPRINTF(ofile, fmt, args ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ##args); }} while(0)
+
+#warning todo: fix cuda and opencl
+//#ifdef STARPU_USE_CUDA
+//extern void cuda_codelet(void *descr[], __attribute__ ((unused)) void *_args);
+//#endif
+
+//#ifdef STARPU_USE_OPENCL
+//#include <starpu_opencl.h>
+//extern void opencl_codelet(void *descr[], __attribute__ ((unused)) void *_args);
+//struct starpu_opencl_program opencl_program;
+//#endif
+
+void cpu_codelet(void *descr[], __attribute__ ((unused)) void *_args)
+{
+	float *val = (float *)STARPU_VECTOR_GET_PTR(descr[0]);
+
+	val[0] += 1.0f; val[1] += 1.0f;
+}
+
+int main(int argc, char **argv)
+{
+	int ret = 0;
+
+	ret = starpu_init(NULL);
+	STARPU_CHECK_RETURN_VALUE(ret, "starpu_init");
+
+	float float_array[4] __attribute__ ((aligned (16))) = { 0.0f, 0.0f, 0.0f, 0.0f};
+
+	starpu_data_handle_t float_array_handle;
+	starpu_vector_data_register(&float_array_handle, 0 /* home node */,
+			(uintptr_t)&float_array, 4, sizeof(float));
+
+//#ifdef STARPU_USE_OPENCL
+//        ret = starpu_opencl_load_opencl_from_file("examples/incrementer/incrementer_kernels_opencl_kernel.cl", &opencl_program, NULL);
+//	STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file");
+//#endif
+
+        struct starpu_codelet cl;
+        starpu_codelet_init(&cl);
+        cl.where = STARPU_CPU;//|STARPU_CUDA;//|STARPU_OPENCL,
+        cl.cpu_funcs[0] = cpu_codelet;
+        cl.cpu_funcs[1] = NULL;
+//#ifdef STARPU_USE_CUDA
+//        cl.cuda_funcs[0] = cuda_codelet;
+//        cl.cuda_funcs[1] = NULL;
+//#endif
+//#ifdef STARPU_USE_OPENCL
+//		.opencl_funcs = {opencl_codelet, NULL},
+//#endif
+        cl.nbuffers = 1;
+        cl.modes[0] = STARPU_RW;
+
+	unsigned i;
+	for (i = 0; i < niter; i++)
+	{
+		struct starpu_task *task = starpu_task_create();
+                task->cl = &cl;
+                task->handles[0] = float_array_handle;
+
+                ret = starpu_task_submit(task);
+                if (STARPU_UNLIKELY(ret == -ENODEV))
+                {
+                    FPRINTF(stderr, "No worker may execute this task\n");
+                    exit(0);
+                }
+        }
+
+	starpu_task_wait_for_all();
+
+	/* update the array in RAM */
+	starpu_data_unregister(float_array_handle);
+
+	FPRINTF(stderr, "array -> %f, %f, %f, %f\n", float_array[0],
+                float_array[1], float_array[2], float_array[3]);
+
+	if (float_array[0] != niter || float_array[0] != float_array[1] + float_array[2] + float_array[3])
+	{
+		FPRINTF(stderr, "Incorrect result\n");
+		ret = 1;
+	}
+
+	starpu_shutdown();
+
+	return ret;
+}