File: README.dev

package info (click to toggle)
starpu 1.4.10%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 39,388 kB
  • sloc: ansic: 325,221; sh: 7,196; makefile: 6,666; lisp: 6,056; xml: 5,031; f90: 4,994; python: 2,398; cpp: 1,353; java: 330; sed: 162; pascal: 57; fortran: 25
file content (228 lines) | stat: -rw-r--r-- 6,481 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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# StarPU --- Runtime system for heterogeneous multicore architectures.
#
# Copyright (C) 2009-2025   University of Bordeaux, CNRS (LaBRI UMR 5800), Inria
#
# 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.
#
Contents
========

- Directory structure
- Developer Warnings
- Naming Conventions
- Coding Style
- Error handling
- Makefile.am
- Writing a new driver

Directory structure
-------------------

The directory structure is as follows:
- src        : internal source for StarPU
- include    : public API
- tests      : unitary tests
- examples   : examples using StarPU
- doc        : documentation for StarPU
- tools      : tools for StarPU

StarPU extensions have their own directory (src/include/tests/examples) structure:

- mpi            : The MPI support
- socl           : the StarPU OpenCL-compatible interface
- sc_hypervisor  : The Scheduling Context Hypervisor
- starpufft      : The FFT support
- eclipse-plugin : The Eclipse Plugin
- starpupy       : The StarPU Python Interface
- starpurm       : The StarPU Resource Manager

Some directories contain only build system details:
- build-aux
- m4
- autom4te.cache



Developer Warnings
------------------

They are enabled only if the STARPU_DEVEL environment variable is
defined to a non-empty value, when calling configure.



Tests
-----

Please do try make check, at least with ./configure --enable-quick-check

If a test fails, you can run it specifically again with

make check TESTS=the_test

You can also re-run only the failing tests with

make recheck



Naming Conventions
------------------

* Prefix names of public objects (types, functions, etc.) with "starpu"

* Prefix names of internal objects (types, functions, etc.) with "_starpu"

* Names for qualified types (struct, union, enum) do not end with _t, _s or similar.
  Use _t only for typedef types, such as opaque public types, e.g
       typedef struct _starpu_data_state* starpu_data_handle_t;
  or
       typedef uint64_t starpu_tag_t;

* When a variable can only take a finite set of values, use an enum
  type instead of defining macros for each of the values.



Coding Style
------------

* Curly braces always go on a new line



Error handling
--------------
* Use STARPU_ABORT() for catastrophic errors, from which StarPU will never
  recover.

	switch (node_kind)
	{
		case STARPU_CPU_RAM:
			do_stg();
			break;
		...
		default:
			/* We cannot be here */
			STARPU_ABORT();
	}

* Use STARPU_ASSERT() to run checks that are very likely to succeed, but still
  are useful for debugging purposes. It should be OK to disable them with
  --enable-fast.

	STARPU_ASSERT(j->terminated != 0)

* Use STARPU_ASSERT_MSG() to run checks that might not succeed, and notably due
  to application programming error. The additional message parameter should
  guide the programmer into fixing their error.



Documentation
-------------

When adding a feature, we want four kinds of documentation:

* Announcing the feature in ChangeLog.

* At least one working example in examples/, or at least a working test in
  tests/. Ideally enough examples and tests to cover all the various features.

* A section in the Doxygen documentation, that explains in which case the
  feature is useful and how to use it, and points to the abovementioned
  example/test.

  It should cover all aspects of the feature, so programmers don't have to look
  into the .h file or reference documentation to discover features. It however
  does not need to dive into all details, that can be provided in the next
  documentation.

* Doxygen comments along the declarations in the .h file. These should document
  each macro, enum, function, function parameter, flag, etc. And refer to the
  abovementioned section so that somebody who finds some function/macro/etc. can
  easily know what that is all about.



Makefile.am
-----------

Dependency libraries are appended to LIBS.
Only real LDFLAGS such as -no-undefined go to LDFLAGS.

If a program foo needs more libraries, it can put then in foo_LDADD.

(No, AM_LDADD does not exist)

All install rules must use $(DESTDIR) so that

./configure --prefix=/usr && make && make install DESTDIR=/tmp/foobar

can properly work, as it is used by distributions. That can easily checked by
*not* running it as root.



Writing a new driver
--------------------

Writing a new driver is essentially:

- Creating an src/drivers/yourdriver/ and adding it to src/Makefile.am

  You can pick up src/drivers/cuda/driver_cuda0.c as an example of very basic driver which
  should be relatively easy to get working. Once you have it working you can
  try to get inspiration from src/drivers/cuda/driver_cuda1.c to implement
  asynchronous data and kernel execution.

- Adding fields in struct starpu_conf and struct starpu_codelet.

- Adding cases in src/core/task.c, look for _CUDA for an example.

- Adding initialization calls in src/core/topology.c, look for _CUDA for an example.

- Adding cases in src/core/worker.c, look for _CUDA for an example.

- Adding the case in src/datawizard/reduction.c, look for _CUDA for an example.

- There are a few "Driver porters" notes in the code.

- TODO: task & bus performance model

  For now the simplest is not to implement performance models. We'll rework the
  support to make it very generic.

- Other places can be extended to add features: asynchronous data transfers,
  energy measurement, multiformat, memory mapping



Adding a new FXT state
----------------------

This consists in:

- Adding a code number in src/common/fxt.h

- Adding the callable runtime macro in src/common/fxt.h

- Calling these macros in the wanted place in the runtime

- Adding a paje state in states_list src/debug/traces/starpu_fxt.c and in
  src/debug/traces/starpu_paje.c

- Adding the management of the code in _starpu_fxt_parse_new_file, usually
  calling a function that does the actual paje state addition (a push/pop pair
  or two state sets)

A simple example can be found in 28740e7a91a2 ("Add a Parallel sync state").