StarPU Internal Handbook
jobs.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2008-2022 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
4  * Copyright (C) 2011 Télécom-SudParis
5  * Copyright (C) 2013 Thibaut Lambert
6  *
7  * StarPU is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * StarPU is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
17  */
18 
19 #ifndef __JOBS_H__
20 #define __JOBS_H__
21 
24 #include <starpu.h>
25 #include <semaphore.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <stdint.h>
29 #include <string.h>
30 #include <stdarg.h>
31 #include <common/config.h>
32 #ifdef HAVE_UNISTD_H
33 #include <unistd.h>
34 #endif
35 #include <common/timing.h>
36 #include <common/list.h>
37 #include <common/fxt.h>
38 #include <core/dependencies/tags.h>
39 #include <datawizard/datawizard.h>
41 #include <core/errorcheck.h>
42 #include <common/barrier.h>
43 #include <common/utils.h>
44 #include <common/list.h>
45 
46 #pragma GCC visibility push(hidden)
47 
48 struct _starpu_worker;
49 
51 typedef void (*_starpu_cl_func_t)(void **, void *);
52 
53 #define _STARPU_MAY_PERFORM(j, arch) ((j)->task->where & STARPU_##arch)
54 
56 {
57  starpu_data_handle_t handle;
58  enum starpu_data_access_mode mode;
59  int node;
62  int index;
63 
64  int orderedindex;
67 };
68 
69 #ifdef STARPU_DEBUG
70 MULTILIST_CREATE_TYPE(_starpu_job, all_submitted)
71 #endif
74 {
76  unsigned long job_id;
77 
79  struct starpu_task *task;
80 
86 
89  starpu_pthread_mutex_t sync_mutex;
90  starpu_pthread_cond_t sync_cond;
91 
95  struct _starpu_data_descr ordered_buffers[STARPU_NMAXBUFS];
96  struct _starpu_task_wrapper_dlist dep_slots[STARPU_NMAXBUFS];
97  struct _starpu_data_descr *dyn_ordered_buffers;
98  struct _starpu_task_wrapper_dlist *dyn_dep_slots;
99 
102  struct _starpu_tag *tag;
103 
107 
109  struct starpu_task *end_rdep;
110 
114  starpu_data_handle_t implicit_dep_handle;
115  struct _starpu_task_wrapper_dlist implicit_dep_slot;
116 
123  unsigned submitted:2;
124 
130  unsigned terminated:2;
131 
132 #ifdef STARPU_OPENMP
134  unsigned continuation;
135 
140 
146  void (*continuation_callback_on_sleep)(void *arg);
147  void *continuation_callback_on_sleep_arg;
148 
149  void (*omp_cleanup_callback)(void *arg);
150  void *omp_cleanup_callback_arg;
151 
153  unsigned discontinuous;
154 
156  struct timespec cumulated_ts;
157 
160 #endif
161 
164  uint32_t footprint;
165  unsigned footprint_is_computed:1;
166 
169  unsigned exclude_from_dag:1;
170 
172  unsigned internal:1;
175 
180  unsigned reduction_task:1;
181 
183  unsigned nimpl;
184 
188 
190  int workerid;
191 
194 
198 
199  struct bound_task *bound_task;
200 
202  starpu_pthread_barrier_t before_work_barrier;
203  starpu_pthread_barrier_t after_work_barrier;
204  unsigned after_work_busy_barrier;
205 
206  struct _starpu_graph_node *graph_node;
207 
208 #ifdef STARPU_DEBUG
210  struct _starpu_job_multilist_all_submitted all_submitted;
211 #endif
212 
213 #ifdef STARPU_BUBBLE
214  int already_turned_into_bubble;
215  unsigned is_bubble:1;
216 #endif
217 };
218 
219 #ifdef STARPU_DEBUG
220 MULTILIST_CREATE_INLINES(struct _starpu_job, _starpu_job, all_submitted)
221 #endif
222 
223 void _starpu_job_init(void);
224 void _starpu_job_fini(void);
225 
227 struct _starpu_job* _starpu_job_create(struct starpu_task *task) STARPU_ATTRIBUTE_MALLOC;
228 
231 
234 
237 
238 #ifdef STARPU_OPENMP
241 
245  void (*continuation_callback_on_sleep)(void *arg), void *continuation_callback_on_sleep_arg);
246 void _starpu_job_prepare_for_continuation(struct _starpu_job *j);
247 void _starpu_job_set_omp_cleanup_callback(struct _starpu_job *j,
248  void (*omp_cleanup_callback)(void *arg), void *omp_cleanup_callback_arg);
249 #endif
250 
252 void _starpu_exclude_task_from_dag(struct starpu_task *task);
253 
256 unsigned _starpu_enforce_deps_starting_from_task(struct _starpu_job *j);
257 #ifdef STARPU_OPENMP
260 #endif
261 
262 unsigned _starpu_take_deps_and_schedule(struct _starpu_job *j);
263 void _starpu_enforce_deps_notify_job_ready_soon(struct _starpu_job *j, _starpu_notify_job_start_data *data, int tag);
264 
270 
272 size_t _starpu_job_get_data_size(struct starpu_perfmodel *model, struct starpu_perfmodel_arch* arch, unsigned nimpl, struct _starpu_job *j);
273 
276 struct starpu_task *_starpu_pop_local_task(struct _starpu_worker *worker);
277 
280 int _starpu_push_local_task(struct _starpu_worker *worker, struct starpu_task *task);
281 
282 #define _STARPU_JOB_GET_ORDERED_BUFFER_INDEX(job, i) ((job->dyn_ordered_buffers) ? job->dyn_ordered_buffers[i].index : job->ordered_buffers[i].index)
283 #define _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(job, i) ((job->dyn_ordered_buffers) ? job->dyn_ordered_buffers[i].handle : job->ordered_buffers[i].handle)
284 #define _STARPU_JOB_GET_ORDERED_BUFFER_MODE(job, i) ((job->dyn_ordered_buffers) ? job->dyn_ordered_buffers[i].mode : job->ordered_buffers[i].mode)
285 #define _STARPU_JOB_GET_ORDERED_BUFFER_NODE(job, i) ((job->dyn_ordered_buffers) ? job->dyn_ordered_buffers[i].node : job->ordered_buffers[i].node)
286 
287 #define _STARPU_JOB_SET_ORDERED_BUFFER_INDEX(job, __index, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i].index = (__index); else job->ordered_buffers[i].index = (__index);} while(0)
288 #define _STARPU_JOB_SET_ORDERED_BUFFER_HANDLE(job, __handle, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i].handle = (__handle); else job->ordered_buffers[i].handle = (__handle);} while(0)
289 #define _STARPU_JOB_SET_ORDERED_BUFFER_MODE(job, __mode, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i].mode = __mode; else job->ordered_buffers[i].mode = __mode;} while(0)
290 #define _STARPU_JOB_SET_ORDERED_BUFFER_NODE(job, __node, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i].node = __node; else job->ordered_buffers[i].node = __node;} while(0)
291 
292 #define _STARPU_JOB_SET_ORDERED_BUFFER(job, buffer, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i] = buffer; else job->ordered_buffers[i] = buffer;} while(0)
293 #define _STARPU_JOB_GET_ORDERED_BUFFERS(job) ((job->dyn_ordered_buffers) ? job->dyn_ordered_buffers : &job->ordered_buffers[0])
294 
295 #define _STARPU_JOB_GET_DEP_SLOTS(job) (((job)->dyn_dep_slots) ? (job)->dyn_dep_slots : (job)->dep_slots)
296 
297 #pragma GCC visibility pop
298 
299 #endif // __JOBS_H__
Definition: cg.h:45
Definition: coherency.h:133
Definition: graph.h:33
void _starpu_handle_job_submission(struct _starpu_job *j)
struct _starpu_job * _starpu_job_create(struct starpu_task *task) STARPU_ATTRIBUTE_MALLOC
void _starpu_job_prepare_for_continuation_ext(struct _starpu_job *j, unsigned continuation_resubmit, void(*continuation_callback_on_sleep)(void *arg), void *continuation_callback_on_sleep_arg)
int _starpu_test_job_termination(struct _starpu_job *j)
unsigned _starpu_reenforce_task_deps_and_schedule(struct _starpu_job *j)
void _starpu_job_destroy(struct _starpu_job *j)
int _starpu_job_finished(struct _starpu_job *j)
void _starpu_exclude_task_from_dag(struct starpu_task *task)
unsigned _starpu_enforce_deps_and_schedule(struct _starpu_job *j)
void _starpu_wait_job(struct _starpu_job *j)
struct starpu_task * _starpu_pop_local_task(struct _starpu_worker *worker)
int _starpu_push_local_task(struct _starpu_worker *worker, struct starpu_task *task)
int index
Definition: jobs.h:62
size_t _starpu_job_get_data_size(struct starpu_perfmodel *model, struct starpu_perfmodel_arch *arch, unsigned nimpl, struct _starpu_job *j)
void(* _starpu_cl_func_t)(void **, void *)
Definition: jobs.h:51
void _starpu_handle_job_termination(struct _starpu_job *j)
Definition: jobs.h:56
Definition: jobs.h:74
struct starpu_task * end_rdep
Definition: jobs.h:109
struct _starpu_cg_list job_successors
Definition: jobs.h:106
int workerid
Definition: jobs.h:190
double cumulated_energy_consumed
Definition: jobs.h:159
void(* continuation_callback_on_sleep)(void *arg)
Definition: jobs.h:146
uint32_t footprint
Definition: jobs.h:164
starpu_pthread_barrier_t before_work_barrier
Definition: jobs.h:202
struct timespec cumulated_ts
Definition: jobs.h:156
int combined_workerid
Definition: jobs.h:193
unsigned submitted
Definition: jobs.h:123
unsigned nimpl
Definition: jobs.h:183
unsigned continuation_resubmit
Definition: jobs.h:139
struct _starpu_data_descr ordered_buffers[STARPU_NMAXBUFS]
Definition: jobs.h:95
unsigned terminated
Definition: jobs.h:130
unsigned reduction_task
Definition: jobs.h:180
struct _starpu_job * quick_next
Definition: jobs.h:85
unsigned long job_id
Definition: jobs.h:76
struct _starpu_tag * tag
Definition: jobs.h:102
starpu_pthread_mutex_t sync_mutex
Definition: jobs.h:89
unsigned exclude_from_dag
Definition: jobs.h:169
starpu_data_handle_t implicit_dep_handle
Definition: jobs.h:114
int active_task_alias_count
Definition: jobs.h:197
unsigned sequential_consistency
Definition: jobs.h:174
struct starpu_task * task
Definition: jobs.h:79
int task_size
Definition: jobs.h:187
unsigned discontinuous
Definition: jobs.h:153
unsigned continuation
Definition: jobs.h:134
Definition: workers.h:155
Definition: tags.h:51