Pārlūkot izejas kodu

doc: add texi files for source code (these files should normally be generated automatically, but i do not know how to tell Makefile.am to do so ...)

Nathalie Furmento 15 gadi atpakaļ
vecāks
revīzija
20c1c3d41f
2 mainītis faili ar 188 papildinājumiem un 0 dzēšanām
  1. 143 0
      doc/vector_scal_c.texi
  2. 45 0
      doc/vector_scal_cuda.texi

+ 143 - 0
doc/vector_scal_c.texi

@@ -0,0 +1,143 @@
+/*
+ * StarPU
+ * Copyright (C) INRIA 2008-2009 (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 <stdio.h>
+#include <stdint.h>
+#include <starpu.h>
+
+#define    NX	2048
+
+/* This kernel takes a buffer and scales it by a constant factor */
+static void scal_cpu_func(void *buffers[], void *cl_arg)
+@{
+    unsigned i;
+    float *factor = cl_arg;
+
+    /* 
+     * The "buffers" array matches the task->buffers array: for instance
+     * task->buffers[0].handle is a handle that corresponds to a data with
+     * vector "interface", so that the first entry of the array in the
+     * codelet  is a pointer to a structure describing such a vector (ie.
+     * struct starpu_vector_interface_s *). Here, we therefore manipulate
+     * the buffers[0] element as a vector: nx gives the number of elements
+     * in the array, ptr gives the location of the array (that was possibly
+     * migrated/replicated), and elemsize gives the size of each elements.
+     */
+
+    starpu_vector_interface_t *vector = buffers[0];
+
+    /* length of the vector */
+    unsigned n = STARPU_GET_VECTOR_NX(vector);
+
+    /* get a pointer to the local copy of the vector : note that we have to
+     * cast it in (float *) since a vector could contain any type of
+     * elements so that the .ptr field is actually a uintptr_t */
+    float *val = (float *)STARPU_GET_VECTOR_PTR(vector);
+
+    /* scale the vector */
+    for (i = 0; i < n; i++)
+    	val[i] *= *factor;
+@}
+
+extern void scal_cuda_func(void *buffers[], void *_args);
+
+static starpu_codelet cl = @{
+    .where = STARPU_CPU
+#ifdef STARPU_USE_CUDA
+    	| STARPU_CUDA
+#endif
+    	,
+    /* 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
+    .nbuffers = 1
+@};
+
+int main(int argc, char **argv)
+@{
+    /* We consider a vector of float that is initialized just as any of C
+      * data */
+    float vector[NX];
+    unsigned i;
+    for (i = 0; i < NX; i++)
+    	vector[i] = 1.0f;
+
+    fprintf(stderr, "BEFORE : First element was %f\n", vector[0]);
+
+    /* Initialize StarPU with default configuration */
+    starpu_init(NULL);
+
+    /* 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(float));
+
+    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(float);
+
+    /* 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);
+
+    /* terminate StarPU, no task can be submitted after */
+    starpu_shutdown();
+
+    fprintf(stderr, "AFTER First element is %f\n", vector[0]);
+
+    return 0;
+@}

+ 45 - 0
doc/vector_scal_cuda.texi

@@ -0,0 +1,45 @@
+/*
+ * StarPU
+ * Copyright (C) INRIA 2008-2009 (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 complements vector_scale.c: here we implement a CUDA version.
+ */
+
+#include <starpu.h>
+
+static __global__ void vector_mult_cuda(float *val, unsigned n,
+                                        float factor)
+@{
+        unsigned i;
+        for(i = 0 ; i < n ; i++)
+               val[i] *= factor;
+@}
+
+extern "C" void scal_cuda_func(void *buffers[], void *_args)
+@{
+        float *factor = (float *)_args;
+        struct starpu_vector_interface_s *vector = (struct starpu_vector_interface_s *) buffers[0];
+
+        /* length of the vector */
+        unsigned n = STARPU_GET_VECTOR_NX(vector);
+        /* local copy of the vector pointer */
+        float *val = (float *)STARPU_GET_VECTOR_PTR(vector);
+
+        /* TODO: use more blocks and threads in blocks */
+        vector_mult_cuda<<<1,1>>>(val, n, *factor);
+
+    cudaThreadSynchronize();
+@}