File: base.c

package info (click to toggle)
starpu-contrib 1.0.1%2Bdfsg-1
  • links: PTS, VCS
  • area: contrib
  • in suites: wheezy
  • size: 13,836 kB
  • sloc: ansic: 77,357; cpp: 23,334; sh: 12,088; makefile: 2,086; lisp: 758; yacc: 185; sed: 126; fortran: 13
file content (154 lines) | stat: -rw-r--r-- 3,727 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/* GCC-StarPU
   Copyright (C) 2011, 2012 Institut National de Recherche en Informatique et Automatique

   GCC-StarPU is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   GCC-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 General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with GCC-StarPU.  If not, see <http://www.gnu.org/licenses/>.  */

#undef NDEBUG

#include <mocks.h>


/* The task under test.  */

static void my_scalar_task (int x, unsigned char y, int z) __attribute__ ((task));

static void my_scalar_task_cpu (int, unsigned char, int)
  __attribute__ ((task_implementation ("cpu", my_scalar_task)));
static void my_scalar_task_opencl (int, unsigned char, int)
  __attribute__ ((task_implementation ("opencl", my_scalar_task)));

static void
my_scalar_task_cpu (int x, unsigned char y, int z)
{
  printf ("%s: x = %i, y = %i, z = %i\n", __func__, x, (int) y, z);
}

static void
my_scalar_task_opencl (int x, unsigned char y, int z)
{
  printf ("%s: x = %i, y = %i, z = %i\n", __func__, x, (int) y, z);
}


/* Another task, where task implementation declarations are interleaved with
   task definitions.  */

static void my_other_task (int x) __attribute__ ((task));

static void my_other_task_cpu (int)
  __attribute__ ((task_implementation ("cpu", my_other_task)));
static void my_other_task_cpu_bis (int)
  __attribute__ ((task_implementation ("cpu", my_other_task)));

static void
my_other_task_cpu (int x)
{
  printf ("cpu\n");
}

static void
my_other_task_cpu_bis (int x)
{
  printf ("second cpu implementation\n");
}

static void my_other_task_opencl (int)
  __attribute__ ((task_implementation ("opencl", my_other_task)));

static void
my_other_task_opencl (int x)
{
  printf ("opencl\n");
}


/* Task with a body.  */

static void my_task_with_body (int x) __attribute__ ((task));

static void
my_task_with_body (int x)
{
  /* This body is implicitly the "cpu" implementation of the task.  */
  int y = x + 2;
  printf ("body: %i\n", y - 2);
}

static void my_task_with_body_opencl (int x)
  __attribute__ ((task_implementation ("opencl", my_task_with_body)));

static void
my_task_with_body_opencl (int x)
{
}


int
main (int argc, char *argv[])
{
#pragma starpu initialize
  assert (initialized == 1);

#pragma starpu hello

  int x = 42, z = 99;
  unsigned char y = 77;
  long y_as_long_int = 77;

  struct insert_task_argument expected[] =
    {
      { STARPU_VALUE, &x, sizeof x },
      { STARPU_VALUE, &y, sizeof y },
      { STARPU_VALUE, &z, sizeof z },
      { 0, 0, 0 }
    };

  expected_insert_task_arguments = expected;

  /* Invoke the task, which should make sure it gets called with
     EXPECTED.  */
  my_scalar_task (x, y, z);

  /* Invoke the task using literal constants instead of variables.  */
  my_scalar_task (42, y, z);
  my_scalar_task (x, 77, z);
  my_scalar_task (x, y, 99);

  my_scalar_task (42, 77, z);
  my_scalar_task (x, 77, 99);
  my_scalar_task (42, y, 99);

  my_scalar_task (42, 77, 99);

  my_scalar_task (42, y_as_long_int, 99);

  struct insert_task_argument expected2[] =
    {
      { STARPU_VALUE, &x, sizeof x },
      { 0, 0, 0 }
    };

  expected_insert_task_arguments = expected2;

  my_other_task (42);

  my_task_with_body (42);

  assert (tasks_submitted == 11);

#pragma starpu shutdown
  assert (initialized == 0);

  return EXIT_SUCCESS;
}