Browse Source

basic_examples: add fortran version for vector scal example (thanks to Francois Tessier)

Nathalie Furmento 14 years ago
parent
commit
4c89b868ab

+ 9 - 2
examples/Makefile.am

@@ -20,7 +20,6 @@ AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/examples/ -I$(top_builddi
 
 TESTS	=	$(check_PROGRAMS) \
 		coverage/coverage.sh
-		
 
 SUBDIRS = stencil
 
@@ -142,7 +141,13 @@ basic_examples_hello_world_SOURCES =		\
 	basic_examples/hello_world.c
 
 examplebin_PROGRAMS +=				\
-	basic_examples/vector_scal
+	basic_examples/vector_scal		\
+	basic_examples/vector_scal_fortran
+
+basic_examples_vector_scal_fortran_SOURCES =	\
+	basic_examples/vector_scal_fortran.F	\
+	basic_examples/vector_scal_c.c		\
+	basic_examples/vector_scal_cpu.c
 
 basic_examples_vector_scal_SOURCES =		\
 	basic_examples/vector_scal.c		\
@@ -151,6 +156,8 @@ basic_examples_vector_scal_SOURCES =		\
 if STARPU_USE_CUDA
 basic_examples_vector_scal_SOURCES +=		\
 	basic_examples/vector_scal_cuda.cu
+basic_examples_vector_scal_fortran_SOURCES +=	\
+	basic_examples/vector_scal_cuda.cu
 endif
 
 if STARPU_USE_OPENCL

+ 115 - 0
examples/basic_examples/vector_scal_c.c

@@ -0,0 +1,115 @@
+/*
+ * 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.
+ */
+
+/*
+ * This example demonstrates how to use StarPU to scale an array by a factor.
+ * It shows how to manipulate data with StarPU's data management library.
+ *  1- how to declare a piece of data to StarPU (starpu_vector_data_register)
+ *  2- how to describe which data are accessed by a task (task->buffers[0])
+ *  3- how a kernel can manipulate the data (buffers[0].vector.ptr)
+ */
+
+#include "f77.h"
+#include <starpu.h>
+#include <starpu_opencl.h>
+#include <stdio.h>
+
+//#define	NX	2048
+
+extern void scal_cpu_func(void *buffers[], void *_args);
+extern void scal_cuda_func(void *buffers[], void *_args);
+//extern void scal_opencl_func(void *buffers[], void *_args);
+
+static starpu_codelet cl = {
+	.where = STARPU_CPU | STARPU_CUDA | STARPU_OPENCL,
+	/* CPU implementation of the codelet */
+	.cpu_func = scal_cpu_func,
+#ifdef STARPU_USE_CUDA
+	/* CUDA implementation of the codelet */
+	.cuda_func = scal_cuda_func,
+#endif
+	//#ifdef STARPU_USE_OPENCL
+	/* OpenCL implementation of the codelet */
+	//.opencl_func = scal_opencl_func,
+	//#endif
+	.nbuffers = 1
+};
+
+//#ifdef STARPU_USE_OPENCL
+//struct starpu_opencl_program codelet;
+//#endif
+
+F77_SUBROUTINE(compute)(INTEGER(F_NX), REAL(vector))
+{
+        int NX = *INTEGER_ARG(F_NX);
+	
+	/* Initialize StarPU with default configuration */
+	starpu_init(NULL);
+
+	//#ifdef STARPU_USE_OPENCL
+        //starpu_opencl_load_opencl_from_file("examples/basic_examples/vector_scal_opencl_codelet.cl",
+	//				    &codelet);
+	//#endif
+
+	/* Tell StaPU to associate the "vector" vector with the "vector_handle"
+	 * identifier. When a task needs to access a piece of data, it should
+	 * refer to the handle that is associated to it.
+	 * In the case of the "vector" data interface:
+	 *  - the first argument of the registration method is a pointer to the
+	 *    handle that should describe the data
+	 *  - the second argument is the memory node where the data (ie. "vector")
+	 *    resides initially: 0 stands for an address in main memory, as
+	 *    opposed to an adress on a GPU for instance.
+	 *  - the third argument is the adress of the vector in RAM
+	 *  - the fourth argument is the number of elements in the vector
+	 *  - the fifth argument is the size of each element.
+	 */
+	starpu_data_handle vector_handle;
+	starpu_vector_data_register(&vector_handle, 0, (uintptr_t)vector, NX, sizeof(vector[0]));
+
+	float factor = 3.14;
+
+	/* create a synchronous task: any call to starpu_task_submit will block
+ 	 * until it is terminated */
+	struct starpu_task *task = starpu_task_create();
+	task->synchronous = 1;
+
+	task->cl = &cl;
+
+	/* the codelet manipulates one buffer in RW mode */
+	task->buffers[0].handle = vector_handle;
+	task->buffers[0].mode = STARPU_RW;
+
+	/* an argument is passed to the codelet, beware that this is a
+	 * READ-ONLY buffer and that the codelet may be given a pointer to a
+	 * COPY of the argument */
+	task->cl_arg = &factor;
+	task->cl_arg_size = sizeof(factor);
+
+	/* execute the task on any eligible computational ressource */
+	starpu_task_submit(task);
+
+	/* StarPU does not need to manipulate the array anymore so we can stop
+ 	 * monitoring it */
+	starpu_data_unregister(vector_handle);
+
+	//#ifdef STARPU_USE_OPENCL
+        //starpu_opencl_unload_opencl(&codelet);
+	//#endif
+
+	/* terminate StarPU, no task can be submitted after */
+	starpu_shutdown();
+}

+ 18 - 0
examples/basic_examples/vector_scal_fortran.F

@@ -0,0 +1,18 @@
+      PROGRAM VECTOR_SCAL
+      INTEGER,PARAMETER :: F_NX=2048
+      REAL,DIMENSION(F_NX) :: VECTOR
+
+      INTEGER :: I
+      DO I=1,F_NX,1
+         VECTOR(I)=1.0
+      ENDDO
+
+      WRITE (*,*) ' BEFORE : First element was ', VECTOR(1)
+      WRITE (*,*) ' BEFORE : Last element was ', VECTOR(F_NX)
+
+      CALL COMPUTE(F_NX, VECTOR)
+
+      WRITE (*,*) ' AFTER : First element is ', VECTOR(1)
+      WRITE (*,*) ' AFTER : Last element is ', VECTOR(F_NX)
+
+      END PROGRAM