|
@@ -2,7 +2,7 @@
|
|
|
*
|
|
|
* Copyright (C) 2011-2017 Inria
|
|
|
* Copyright (C) 2008-2018 Université de Bordeaux
|
|
|
- * Copyright (C) 2010-2017 CNRS
|
|
|
+ * Copyright (C) 2010-2018 CNRS
|
|
|
* Copyright (C) 2013 Thibaut Lambert
|
|
|
* Copyright (C) 2016 Uppsala University
|
|
|
*
|
|
@@ -21,6 +21,9 @@
|
|
|
#ifndef __WORKERS_H__
|
|
|
#define __WORKERS_H__
|
|
|
|
|
|
+/** \addtogroup workers */
|
|
|
+/* @{ */
|
|
|
+
|
|
|
#include <limits.h>
|
|
|
|
|
|
#include <starpu.h>
|
|
@@ -68,31 +71,32 @@ enum initialization { UNINITIALIZED = 0, CHANGING, INITIALIZED };
|
|
|
|
|
|
struct _starpu_ctx_change_list;
|
|
|
|
|
|
-/* This is initialized from in _starpu_worker_init */
|
|
|
+/** This is initialized by _starpu_worker_init() */
|
|
|
LIST_TYPE(_starpu_worker,
|
|
|
struct _starpu_machine_config *config;
|
|
|
starpu_pthread_mutex_t mutex;
|
|
|
- enum starpu_worker_archtype arch; /* what is the type of worker ? */
|
|
|
- uint32_t worker_mask; /* what is the type of worker ? */
|
|
|
- struct starpu_perfmodel_arch perf_arch; /* in case there are different models of the same arch */
|
|
|
- starpu_pthread_t worker_thread; /* the thread which runs the worker */
|
|
|
- unsigned devid; /* which cpu/gpu/etc is controlled by the worker ? */
|
|
|
- unsigned subworkerid; /* which sub-worker this one is for the cpu/gpu */
|
|
|
- int bindid; /* which cpu is the driver bound to ? (logical index) */
|
|
|
- int workerid; /* uniquely identify the worker among all processing units types */
|
|
|
- int combined_workerid; /* combined worker currently using this worker */
|
|
|
- int current_rank; /* current rank in case the worker is used in a parallel fashion */
|
|
|
- int worker_size; /* size of the worker in case we use a combined worker */
|
|
|
- starpu_pthread_cond_t started_cond; /* indicate when the worker is ready */
|
|
|
- starpu_pthread_cond_t ready_cond; /* indicate when the worker is ready */
|
|
|
- unsigned memory_node; /* which memory node is the worker associated with ? */
|
|
|
- unsigned numa_memory_node; /* which numa memory node is the worker associated with? (logical index) */
|
|
|
- /* condition variable used for passive waiting operations on worker
|
|
|
- * STARPU_PTHREAD_COND_BROADCAST must be used instead of STARPU_PTHREAD_COND_SIGNAL,
|
|
|
- * since the condition is shared for multiple purpose */
|
|
|
+ enum starpu_worker_archtype arch; /**< what is the type of worker ? */
|
|
|
+ uint32_t worker_mask; /**< what is the type of worker ? */
|
|
|
+ struct starpu_perfmodel_arch perf_arch; /**< in case there are different models of the same arch */
|
|
|
+ starpu_pthread_t worker_thread; /**< the thread which runs the worker */
|
|
|
+ unsigned devid; /**< which cpu/gpu/etc is controlled by the worker ? */
|
|
|
+ unsigned subworkerid; /**< which sub-worker this one is for the cpu/gpu */
|
|
|
+ int bindid; /**< which cpu is the driver bound to ? (logical index) */
|
|
|
+ int workerid; /**< uniquely identify the worker among all processing units types */
|
|
|
+ int combined_workerid; /**< combined worker currently using this worker */
|
|
|
+ int current_rank; /**< current rank in case the worker is used in a parallel fashion */
|
|
|
+ int worker_size; /**< size of the worker in case we use a combined worker */
|
|
|
+ starpu_pthread_cond_t started_cond; /**< indicate when the worker is ready */
|
|
|
+ starpu_pthread_cond_t ready_cond; /**< indicate when the worker is ready */
|
|
|
+ unsigned memory_node; /**< which memory node is the worker associated with ? */
|
|
|
+ unsigned numa_memory_node; /**< which numa memory node is the worker associated with? (logical index) */
|
|
|
+ /**
|
|
|
+ * condition variable used for passive waiting operations on worker
|
|
|
+ * STARPU_PTHREAD_COND_BROADCAST must be used instead of STARPU_PTHREAD_COND_SIGNAL,
|
|
|
+ * since the condition is shared for multiple purpose */
|
|
|
starpu_pthread_cond_t sched_cond;
|
|
|
- starpu_pthread_mutex_t sched_mutex; /* mutex protecting sched_cond */
|
|
|
- unsigned state_relax_refcnt; /* mark scheduling sections where other workers can safely access the worker state */
|
|
|
+ starpu_pthread_mutex_t sched_mutex; /**< mutex protecting sched_cond */
|
|
|
+ unsigned state_relax_refcnt; /**< mark scheduling sections where other workers can safely access the worker state */
|
|
|
#ifdef STARPU_SPINLOCK_CHECK
|
|
|
const char *relax_on_file;
|
|
|
int relax_on_line;
|
|
@@ -101,88 +105,90 @@ LIST_TYPE(_starpu_worker,
|
|
|
int relax_off_line;
|
|
|
const char *relax_off_func;
|
|
|
#endif
|
|
|
- unsigned state_sched_op_pending; /* a task pop is ongoing even though sched_mutex may temporarily be unlocked */
|
|
|
- unsigned state_changing_ctx_waiting; /* a thread is waiting for operations such as pop to complete before acquiring sched_mutex and modifying the worker ctx*/
|
|
|
- unsigned state_changing_ctx_notice; /* the worker ctx is about to change or being changed, wait for flag to be cleared before starting new scheduling operations */
|
|
|
- unsigned state_blocked_in_parallel; /* worker is currently blocked on a parallel section */
|
|
|
- unsigned state_blocked_in_parallel_observed; /* the blocked state of the worker has been observed by another worker during a relaxed section */
|
|
|
- unsigned state_block_in_parallel_req; /* a request for state transition from unblocked to blocked is pending */
|
|
|
- unsigned state_block_in_parallel_ack; /* a block request has been honored */
|
|
|
- unsigned state_unblock_in_parallel_req; /* a request for state transition from blocked to unblocked is pending */
|
|
|
- unsigned state_unblock_in_parallel_ack; /* an unblock request has been honored */
|
|
|
- /* cumulative blocking depth
|
|
|
- * - =0 worker unblocked
|
|
|
- * - >0 worker blocked
|
|
|
- * - transition from 0 to 1 triggers a block_req
|
|
|
- * - transition from 1 to 0 triggers a unblock_req
|
|
|
- */
|
|
|
+ unsigned state_sched_op_pending; /**< a task pop is ongoing even though sched_mutex may temporarily be unlocked */
|
|
|
+ unsigned state_changing_ctx_waiting; /**< a thread is waiting for operations such as pop to complete before acquiring sched_mutex and modifying the worker ctx*/
|
|
|
+ unsigned state_changing_ctx_notice; /**< the worker ctx is about to change or being changed, wait for flag to be cleared before starting new scheduling operations */
|
|
|
+ unsigned state_blocked_in_parallel; /**< worker is currently blocked on a parallel section */
|
|
|
+ unsigned state_blocked_in_parallel_observed; /**< the blocked state of the worker has been observed by another worker during a relaxed section */
|
|
|
+ unsigned state_block_in_parallel_req; /**< a request for state transition from unblocked to blocked is pending */
|
|
|
+ unsigned state_block_in_parallel_ack; /**< a block request has been honored */
|
|
|
+ unsigned state_unblock_in_parallel_req; /**< a request for state transition from blocked to unblocked is pending */
|
|
|
+ unsigned state_unblock_in_parallel_ack; /**< an unblock request has been honored */
|
|
|
+ /**
|
|
|
+ * cumulative blocking depth
|
|
|
+ * - =0 worker unblocked
|
|
|
+ * - >0 worker blocked
|
|
|
+ * - transition from 0 to 1 triggers a block_req
|
|
|
+ * - transition from 1 to 0 triggers a unblock_req
|
|
|
+ */
|
|
|
unsigned block_in_parallel_ref_count;
|
|
|
- starpu_pthread_t thread_changing_ctx; /* thread currently changing a sched_ctx containing the worker */
|
|
|
- /* list of deferred context changes
|
|
|
- *
|
|
|
- * when the current thread is a worker, _and_ this worker is in a
|
|
|
- * scheduling operation, new ctx changes are queued to this list for
|
|
|
- * subsequent processing once worker completes the ongoing scheduling
|
|
|
- * operation */
|
|
|
+ starpu_pthread_t thread_changing_ctx; /**< thread currently changing a sched_ctx containing the worker */
|
|
|
+ /**
|
|
|
+ list of deferred context changes
|
|
|
+ *
|
|
|
+ * when the current thread is a worker, _and_ this worker is in a
|
|
|
+ * scheduling operation, new ctx changes are queued to this list for
|
|
|
+ * subsequent processing once worker completes the ongoing scheduling
|
|
|
+ * operation */
|
|
|
struct _starpu_ctx_change_list ctx_change_list;
|
|
|
- struct starpu_task_list local_tasks; /* this queue contains tasks that have been explicitely submitted to that queue */
|
|
|
- struct starpu_task **local_ordered_tasks; /* this queue contains tasks that have been explicitely submitted to that queue with an explicit order */
|
|
|
- unsigned local_ordered_tasks_size; /* this records the size of local_ordered_tasks */
|
|
|
- unsigned current_ordered_task; /* this records the index (within local_ordered_tasks) of the next ordered task to be executed */
|
|
|
- unsigned current_ordered_task_order; /* this records the order of the next ordered task to be executed */
|
|
|
- struct starpu_task *current_task; /* task currently executed by this worker (non-pipelined version) */
|
|
|
- struct starpu_task *current_tasks[STARPU_MAX_PIPELINE]; /* tasks currently executed by this worker (pipelined version) */
|
|
|
+ struct starpu_task_list local_tasks; /**< this queue contains tasks that have been explicitely submitted to that queue */
|
|
|
+ struct starpu_task **local_ordered_tasks; /**< this queue contains tasks that have been explicitely submitted to that queue with an explicit order */
|
|
|
+ unsigned local_ordered_tasks_size; /**< this records the size of local_ordered_tasks */
|
|
|
+ unsigned current_ordered_task; /**< this records the index (within local_ordered_tasks) of the next ordered task to be executed */
|
|
|
+ unsigned current_ordered_task_order; /**< this records the order of the next ordered task to be executed */
|
|
|
+ struct starpu_task *current_task; /**< task currently executed by this worker (non-pipelined version) */
|
|
|
+ struct starpu_task *current_tasks[STARPU_MAX_PIPELINE]; /**< tasks currently executed by this worker (pipelined version) */
|
|
|
#ifdef STARPU_SIMGRID
|
|
|
starpu_pthread_wait_t wait;
|
|
|
#endif
|
|
|
|
|
|
- struct timespec cl_start; /* Codelet start time of the task currently running */
|
|
|
- struct timespec cl_end; /* Codelet end time of the last task running */
|
|
|
- unsigned char first_task; /* Index of first task in the pipeline */
|
|
|
- unsigned char ntasks; /* number of tasks in the pipeline */
|
|
|
- unsigned char pipeline_length; /* number of tasks to be put in the pipeline */
|
|
|
- unsigned char pipeline_stuck; /* whether a task prevents us from pipelining */
|
|
|
- struct _starpu_worker_set *set; /* in case this worker belongs to a set */
|
|
|
+ struct timespec cl_start; /**< Codelet start time of the task currently running */
|
|
|
+ struct timespec cl_end; /**< Codelet end time of the last task running */
|
|
|
+ unsigned char first_task; /**< Index of first task in the pipeline */
|
|
|
+ unsigned char ntasks; /**< number of tasks in the pipeline */
|
|
|
+ unsigned char pipeline_length; /**< number of tasks to be put in the pipeline */
|
|
|
+ unsigned char pipeline_stuck; /**< whether a task prevents us from pipelining */
|
|
|
+ struct _starpu_worker_set *set; /**< in case this worker belongs to a set */
|
|
|
unsigned worker_is_running;
|
|
|
unsigned worker_is_initialized;
|
|
|
- enum _starpu_worker_status status; /* what is the worker doing now ? (eg. CALLBACK) */
|
|
|
- unsigned state_keep_awake; /* !0 if a task has been pushed to the worker and the task has not yet been seen by the worker, the worker should no go to sleep before processing this task*/
|
|
|
+ enum _starpu_worker_status status; /**< what is the worker doing now ? (eg. CALLBACK) */
|
|
|
+ unsigned state_keep_awake; /**< !0 if a task has been pushed to the worker and the task has not yet been seen by the worker, the worker should no go to sleep before processing this task*/
|
|
|
char name[64];
|
|
|
char short_name[32];
|
|
|
- unsigned run_by_starpu; /* Is this run by StarPU or directly by the application ? */
|
|
|
+ unsigned run_by_starpu; /**< Is this run by StarPU or directly by the application ? */
|
|
|
struct _starpu_driver_ops *driver_ops;
|
|
|
|
|
|
struct _starpu_sched_ctx_list *sched_ctx_list;
|
|
|
int tmp_sched_ctx;
|
|
|
- unsigned nsched_ctxs; /* the no of contexts a worker belongs to*/
|
|
|
- struct _starpu_barrier_counter tasks_barrier; /* wait for the tasks submitted */
|
|
|
+ unsigned nsched_ctxs; /**< the no of contexts a worker belongs to*/
|
|
|
+ struct _starpu_barrier_counter tasks_barrier; /**< wait for the tasks submitted */
|
|
|
|
|
|
- unsigned has_prev_init; /* had already been inited in another ctx */
|
|
|
+ unsigned has_prev_init; /**< had already been inited in another ctx */
|
|
|
|
|
|
unsigned removed_from_ctx[STARPU_NMAX_SCHED_CTXS+1];
|
|
|
|
|
|
- unsigned spinning_backoff ; /* number of cycles to pause when spinning */
|
|
|
+ unsigned spinning_backoff ; /**< number of cycles to pause when spinning */
|
|
|
|
|
|
- unsigned nb_buffers_transferred; /* number of piece of data already send to worker */
|
|
|
- unsigned nb_buffers_totransfer; /* number of piece of data already send to worker */
|
|
|
- struct starpu_task *task_transferring; /* The buffers of this task are being sent */
|
|
|
+ unsigned nb_buffers_transferred; /**< number of piece of data already send to worker */
|
|
|
+ unsigned nb_buffers_totransfer; /**< number of piece of data already send to worker */
|
|
|
+ struct starpu_task *task_transferring; /**< The buffers of this task are being sent */
|
|
|
|
|
|
- /* indicate whether the workers shares tasks lists with other workers*/
|
|
|
- /* in this case when removing him from a context it disapears instantly */
|
|
|
+ /**
|
|
|
+ * indicate whether the workers shares tasks lists with other workers
|
|
|
+ * in this case when removing him from a context it disapears instantly
|
|
|
+ */
|
|
|
unsigned shares_tasks_lists[STARPU_NMAX_SCHED_CTXS+1];
|
|
|
|
|
|
- /* boolean to chose the next ctx a worker will pop into */
|
|
|
- unsigned poped_in_ctx[STARPU_NMAX_SCHED_CTXS+1];
|
|
|
+ unsigned poped_in_ctx[STARPU_NMAX_SCHED_CTXS+1]; /**< boolean to chose the next ctx a worker will pop into */
|
|
|
|
|
|
- /* boolean indicating at which moment we checked all ctxs and change phase for the booleab poped_in_ctx*/
|
|
|
- /* one for each of the 2 priorities*/
|
|
|
+ /**
|
|
|
+ * boolean indicating at which moment we checked all ctxs and change phase for the booleab poped_in_ctx
|
|
|
+ * one for each of the 2 priorities
|
|
|
+ */
|
|
|
unsigned reverse_phase[2];
|
|
|
|
|
|
- /* indicate which priority of ctx is currently active: the values are 0 or 1*/
|
|
|
- unsigned pop_ctx_priority;
|
|
|
-
|
|
|
- /* bool to indicate if the worker is slave in a ctx */
|
|
|
- unsigned is_slave_somewhere;
|
|
|
+ unsigned pop_ctx_priority; /**< indicate which priority of ctx is currently active: the values are 0 or 1*/
|
|
|
+ unsigned is_slave_somewhere; /**< bool to indicate if the worker is slave in a ctx */
|
|
|
|
|
|
struct _starpu_sched_ctx *stream_ctx;
|
|
|
|
|
@@ -196,10 +202,10 @@ LIST_TYPE(_starpu_worker,
|
|
|
|
|
|
struct _starpu_combined_worker
|
|
|
{
|
|
|
- struct starpu_perfmodel_arch perf_arch; /* in case there are different models of the same arch */
|
|
|
- uint32_t worker_mask; /* what is the type of workers ? */
|
|
|
+ struct starpu_perfmodel_arch perf_arch; /**< in case there are different models of the same arch */
|
|
|
+ uint32_t worker_mask; /**< what is the type of workers ? */
|
|
|
int worker_size;
|
|
|
- unsigned memory_node; /* which memory node is associated that worker to ? */
|
|
|
+ unsigned memory_node; /**< which memory node is associated that worker to ? */
|
|
|
int combined_workerid[STARPU_NMAXWORKERS];
|
|
|
#ifdef STARPU_USE_MP
|
|
|
int count;
|
|
@@ -214,17 +220,19 @@ struct _starpu_combined_worker
|
|
|
#endif
|
|
|
};
|
|
|
|
|
|
-/* in case a single CPU worker may control multiple
|
|
|
- * accelerators (eg. Gordon for n SPUs) */
|
|
|
+/**
|
|
|
+ * in case a single CPU worker may control multiple
|
|
|
+ * accelerators (eg. Gordon for n SPUs)
|
|
|
+*/
|
|
|
struct _starpu_worker_set
|
|
|
{
|
|
|
starpu_pthread_mutex_t mutex;
|
|
|
- starpu_pthread_t worker_thread; /* the thread which runs the worker */
|
|
|
+ starpu_pthread_t worker_thread; /**< the thread which runs the worker */
|
|
|
unsigned nworkers;
|
|
|
- unsigned started; /* Only one thread for the whole set */
|
|
|
+ unsigned started; /**< Only one thread for the whole set */
|
|
|
void *retval;
|
|
|
struct _starpu_worker *workers;
|
|
|
- starpu_pthread_cond_t ready_cond; /* indicate when the set is ready */
|
|
|
+ starpu_pthread_cond_t ready_cond; /**< indicate when the set is ready */
|
|
|
unsigned set_is_initialized;
|
|
|
};
|
|
|
|
|
@@ -234,82 +242,82 @@ extern struct _starpu_worker_set mpi_worker_set[STARPU_MAXMPIDEVS];
|
|
|
|
|
|
struct _starpu_machine_topology
|
|
|
{
|
|
|
- /* Total number of workers. */
|
|
|
+ /** Total number of workers. */
|
|
|
unsigned nworkers;
|
|
|
|
|
|
- /* Total number of combined workers. */
|
|
|
+ /** Total number of combined workers. */
|
|
|
unsigned ncombinedworkers;
|
|
|
|
|
|
unsigned nsched_ctxs;
|
|
|
|
|
|
#ifdef STARPU_HAVE_HWLOC
|
|
|
- /* Topology as detected by hwloc. */
|
|
|
+ /** Topology as detected by hwloc. */
|
|
|
hwloc_topology_t hwtopology;
|
|
|
#endif
|
|
|
- /* custom hwloc tree*/
|
|
|
+ /** custom hwloc tree*/
|
|
|
struct starpu_tree *tree;
|
|
|
|
|
|
- /* Total number of CPU cores, as detected by the topology code. May
|
|
|
+ /** Total number of CPU cores, as detected by the topology code. May
|
|
|
* be different from the actual number of CPU workers.
|
|
|
*/
|
|
|
unsigned nhwcpus;
|
|
|
|
|
|
- /* Total number of PUs (i.e. threads), as detected by the topology code. May
|
|
|
+ /** Total number of PUs (i.e. threads), as detected by the topology code. May
|
|
|
* be different from the actual number of PU workers.
|
|
|
*/
|
|
|
unsigned nhwpus;
|
|
|
|
|
|
- /* Total number of CUDA devices, as detected. May be different
|
|
|
+ /** Total number of CUDA devices, as detected. May be different
|
|
|
* from the actual number of CUDA workers.
|
|
|
*/
|
|
|
unsigned nhwcudagpus;
|
|
|
|
|
|
- /* Total number of OpenCL devices, as detected. May be
|
|
|
+ /** Total number of OpenCL devices, as detected. May be
|
|
|
* different from the actual number of OpenCL workers.
|
|
|
*/
|
|
|
unsigned nhwopenclgpus;
|
|
|
|
|
|
- /* Total number of SCC cores, as detected. May be different
|
|
|
+ /** Total number of SCC cores, as detected. May be different
|
|
|
* from the actual number of core workers.
|
|
|
*/
|
|
|
unsigned nhwscc;
|
|
|
|
|
|
- /* Total number of MPI nodes, as detected. May be different
|
|
|
+ /** Total number of MPI nodes, as detected. May be different
|
|
|
* from the actual number of node workers.
|
|
|
*/
|
|
|
unsigned nhwmpi;
|
|
|
|
|
|
- /* Actual number of CPU workers used by StarPU. */
|
|
|
+ /** Actual number of CPU workers used by StarPU. */
|
|
|
unsigned ncpus;
|
|
|
|
|
|
- /* Actual number of CUDA GPUs used by StarPU. */
|
|
|
+ /** Actual number of CUDA GPUs used by StarPU. */
|
|
|
unsigned ncudagpus;
|
|
|
unsigned nworkerpercuda;
|
|
|
int cuda_th_per_stream;
|
|
|
int cuda_th_per_dev;
|
|
|
|
|
|
- /* Actual number of OpenCL workers used by StarPU. */
|
|
|
+ /** Actual number of OpenCL workers used by StarPU. */
|
|
|
unsigned nopenclgpus;
|
|
|
|
|
|
- /* Actual number of SCC workers used by StarPU. */
|
|
|
+ /** Actual number of SCC workers used by StarPU. */
|
|
|
unsigned nsccdevices;
|
|
|
|
|
|
- /* Actual number of MPI workers used by StarPU. */
|
|
|
+ /** Actual number of MPI workers used by StarPU. */
|
|
|
unsigned nmpidevices;
|
|
|
unsigned nhwmpidevices;
|
|
|
|
|
|
- unsigned nhwmpicores[STARPU_MAXMPIDEVS]; // Each MPI node has its set of cores.
|
|
|
+ unsigned nhwmpicores[STARPU_MAXMPIDEVS]; /**< Each MPI node has its set of cores. */
|
|
|
unsigned nmpicores[STARPU_MAXMPIDEVS];
|
|
|
|
|
|
- /* Topology of MP nodes (mainly MIC and SCC) as well as necessary
|
|
|
+ /** Topology of MP nodes (mainly MIC and SCC) as well as necessary
|
|
|
* objects to communicate with them. */
|
|
|
unsigned nhwmicdevices;
|
|
|
unsigned nmicdevices;
|
|
|
|
|
|
- unsigned nhwmiccores[STARPU_MAXMICDEVS]; // Each MIC node has its set of cores.
|
|
|
+ unsigned nhwmiccores[STARPU_MAXMICDEVS]; /**< Each MIC node has its set of cores. */
|
|
|
unsigned nmiccores[STARPU_MAXMICDEVS];
|
|
|
|
|
|
- /* Indicates the successive logical PU identifier that should be used
|
|
|
+ /** Indicates the successive logical PU identifier that should be used
|
|
|
* to bind the workers. It is either filled according to the
|
|
|
* user's explicit parameters (from starpu_conf) or according
|
|
|
* to the STARPU_WORKERS_CPUID env. variable. Otherwise, a
|
|
@@ -318,7 +326,7 @@ struct _starpu_machine_topology
|
|
|
*/
|
|
|
unsigned workers_bindid[STARPU_NMAXWORKERS];
|
|
|
|
|
|
- /* Indicates the successive CUDA identifier that should be
|
|
|
+ /** Indicates the successive CUDA identifier that should be
|
|
|
* used by the CUDA driver. It is either filled according to
|
|
|
* the user's explicit parameters (from starpu_conf) or
|
|
|
* according to the STARPU_WORKERS_CUDAID env. variable.
|
|
@@ -326,7 +334,7 @@ struct _starpu_machine_topology
|
|
|
*/
|
|
|
unsigned workers_cuda_gpuid[STARPU_NMAXWORKERS];
|
|
|
|
|
|
- /* Indicates the successive OpenCL identifier that should be
|
|
|
+ /** Indicates the successive OpenCL identifier that should be
|
|
|
* used by the OpenCL driver. It is either filled according
|
|
|
* to the user's explicit parameters (from starpu_conf) or
|
|
|
* according to the STARPU_WORKERS_OPENCLID env. variable.
|
|
@@ -334,16 +342,16 @@ struct _starpu_machine_topology
|
|
|
*/
|
|
|
unsigned workers_opencl_gpuid[STARPU_NMAXWORKERS];
|
|
|
|
|
|
- /** Indicates the successive MIC devices that should be used
|
|
|
+ /*** Indicates the successive MIC devices that should be used
|
|
|
* by the MIC driver. It is either filled according to the
|
|
|
* user's explicit parameters (from starpu_conf) or according
|
|
|
* to the STARPU_WORKERS_MICID env. variable. Otherwise, they
|
|
|
* are taken in ID order. */
|
|
|
- /* TODO */
|
|
|
- /* unsigned workers_mic_deviceid[STARPU_NMAXWORKERS]; */
|
|
|
+ /** TODO */
|
|
|
+ /** unsigned workers_mic_deviceid[STARPU_NMAXWORKERS]; */
|
|
|
|
|
|
- /* Which SCC(s) do we use ? */
|
|
|
- /* Indicates the successive SCC devices that should be used by
|
|
|
+ /** Which SCC(s) do we use ? */
|
|
|
+ /** Indicates the successive SCC devices that should be used by
|
|
|
* the SCC driver. It is either filled according to the
|
|
|
* user's explicit parameters (from starpu_conf) or according
|
|
|
* to the STARPU_WORKERS_SCCID env. variable. Otherwise, they
|
|
@@ -363,76 +371,76 @@ struct _starpu_machine_config
|
|
|
int pu_depth;
|
|
|
#endif
|
|
|
|
|
|
- /* Where to bind next worker ? */
|
|
|
+ /** Where to bind next worker ? */
|
|
|
int current_bindid;
|
|
|
char currently_bound[STARPU_NMAXWORKERS];
|
|
|
char currently_shared[STARPU_NMAXWORKERS];
|
|
|
|
|
|
- /* Which GPU(s) do we use for CUDA ? */
|
|
|
+ /** Which GPU(s) do we use for CUDA ? */
|
|
|
int current_cuda_gpuid;
|
|
|
|
|
|
- /* Which GPU(s) do we use for OpenCL ? */
|
|
|
+ /** Which GPU(s) do we use for OpenCL ? */
|
|
|
int current_opencl_gpuid;
|
|
|
|
|
|
- /* Which MIC do we use? */
|
|
|
+ /** Which MIC do we use? */
|
|
|
int current_mic_deviceid;
|
|
|
|
|
|
- /* Which SCC do we use? */
|
|
|
+ /** Which SCC do we use? */
|
|
|
int current_scc_deviceid;
|
|
|
|
|
|
- /* Which MPI do we use? */
|
|
|
+ /** Which MPI do we use? */
|
|
|
int current_mpi_deviceid;
|
|
|
|
|
|
- /* Memory node for cpus, if only one */
|
|
|
+ /** Memory node for cpus, if only one */
|
|
|
int cpus_nodeid;
|
|
|
- /* Memory node for CUDA, if only one */
|
|
|
+ /** Memory node for CUDA, if only one */
|
|
|
int cuda_nodeid;
|
|
|
- /* Memory node for OpenCL, if only one */
|
|
|
+ /** Memory node for OpenCL, if only one */
|
|
|
int opencl_nodeid;
|
|
|
- /* Memory node for MIC, if only one */
|
|
|
+ /** Memory node for MIC, if only one */
|
|
|
int mic_nodeid;
|
|
|
- /* Memory node for SCC, if only one */
|
|
|
+ /** Memory node for SCC, if only one */
|
|
|
int scc_nodeid;
|
|
|
- /* Memory node for MPI, if only one */
|
|
|
+ /** Memory node for MPI, if only one */
|
|
|
int mpi_nodeid;
|
|
|
|
|
|
- /* Basic workers : each of this worker is running its own driver and
|
|
|
+ /** Basic workers : each of this worker is running its own driver and
|
|
|
* can be combined with other basic workers. */
|
|
|
struct _starpu_worker workers[STARPU_NMAXWORKERS];
|
|
|
|
|
|
- /* Combined workers: these worker are a combination of basic workers
|
|
|
+ /** Combined workers: these worker are a combination of basic workers
|
|
|
* that can run parallel tasks together. */
|
|
|
struct _starpu_combined_worker combined_workers[STARPU_NMAX_COMBINEDWORKERS];
|
|
|
|
|
|
- /* Translation table from bindid to worker IDs */
|
|
|
+ /** Translation table from bindid to worker IDs */
|
|
|
struct
|
|
|
{
|
|
|
int *workerids;
|
|
|
- unsigned nworkers; /* size of workerids */
|
|
|
+ unsigned nworkers; /**< size of workerids */
|
|
|
} *bindid_workers;
|
|
|
- unsigned nbindid; /* size of bindid_workers */
|
|
|
+ unsigned nbindid; /**< size of bindid_workers */
|
|
|
|
|
|
- /* This bitmask indicates which kinds of worker are available. For
|
|
|
+ /** This bitmask indicates which kinds of worker are available. For
|
|
|
* instance it is possible to test if there is a CUDA worker with
|
|
|
* the result of (worker_mask & STARPU_CUDA). */
|
|
|
uint32_t worker_mask;
|
|
|
|
|
|
- /* either the user given configuration passed to starpu_init or a default configuration */
|
|
|
+ /** either the user given configuration passed to starpu_init or a default configuration */
|
|
|
struct starpu_conf conf;
|
|
|
|
|
|
- /* this flag is set until the runtime is stopped */
|
|
|
+ /** this flag is set until the runtime is stopped */
|
|
|
unsigned running;
|
|
|
|
|
|
int disable_kernels;
|
|
|
|
|
|
- /* Number of calls to starpu_pause() - calls to starpu_resume(). When >0,
|
|
|
+ /** Number of calls to starpu_pause() - calls to starpu_resume(). When >0,
|
|
|
* StarPU should pause. */
|
|
|
int pause_depth;
|
|
|
|
|
|
- /* all the sched ctx of the current instance of starpu */
|
|
|
+ /** all the sched ctx of the current instance of starpu */
|
|
|
struct _starpu_sched_ctx sched_ctxs[STARPU_NMAX_SCHED_CTXS+1];
|
|
|
|
|
|
- /* this flag is set until the application is finished submitting tasks */
|
|
|
+ /** this flag is set until the application is finished submitting tasks */
|
|
|
unsigned submitting;
|
|
|
|
|
|
int watchdog_ok;
|
|
@@ -447,18 +455,18 @@ extern int _starpu_keys_initialized STARPU_ATTRIBUTE_INTERNAL;
|
|
|
extern starpu_pthread_key_t _starpu_worker_key STARPU_ATTRIBUTE_INTERNAL;
|
|
|
extern starpu_pthread_key_t _starpu_worker_set_key STARPU_ATTRIBUTE_INTERNAL;
|
|
|
|
|
|
-/* Three functions to manage argv, argc */
|
|
|
+/** Three functions to manage argv, argc */
|
|
|
void _starpu_set_argc_argv(int *argc, char ***argv);
|
|
|
int *_starpu_get_argc();
|
|
|
char ***_starpu_get_argv();
|
|
|
|
|
|
-/* Fill conf with environment variables */
|
|
|
+/** Fill conf with environment variables */
|
|
|
void _starpu_conf_check_environment(struct starpu_conf *conf);
|
|
|
|
|
|
-/* Called by the driver when it is ready to pause */
|
|
|
+/** Called by the driver when it is ready to pause */
|
|
|
void _starpu_may_pause(void);
|
|
|
|
|
|
-/* Has starpu_shutdown already been called ? */
|
|
|
+/** Has starpu_shutdown already been called ? */
|
|
|
static inline unsigned _starpu_machine_is_running(void)
|
|
|
{
|
|
|
unsigned ret;
|
|
@@ -472,33 +480,36 @@ static inline unsigned _starpu_machine_is_running(void)
|
|
|
}
|
|
|
|
|
|
|
|
|
-/* Check if there is a worker that may execute the task. */
|
|
|
+/** initialise a worker */
|
|
|
+void _starpu_worker_init(struct _starpu_worker *workerarg, struct _starpu_machine_config *pconfig);
|
|
|
+
|
|
|
+/** Check if there is a worker that may execute the task. */
|
|
|
uint32_t _starpu_worker_exists(struct starpu_task *);
|
|
|
|
|
|
-/* Is there a worker that can execute CUDA code ? */
|
|
|
+/** Is there a worker that can execute CUDA code ? */
|
|
|
uint32_t _starpu_can_submit_cuda_task(void);
|
|
|
|
|
|
-/* Is there a worker that can execute CPU code ? */
|
|
|
+/** Is there a worker that can execute CPU code ? */
|
|
|
uint32_t _starpu_can_submit_cpu_task(void);
|
|
|
|
|
|
-/* Is there a worker that can execute OpenCL code ? */
|
|
|
+/** Is there a worker that can execute OpenCL code ? */
|
|
|
uint32_t _starpu_can_submit_opencl_task(void);
|
|
|
|
|
|
-/* Is there a worker that can execute OpenCL code ? */
|
|
|
+/** Is there a worker that can execute OpenCL code ? */
|
|
|
uint32_t _starpu_can_submit_scc_task(void);
|
|
|
|
|
|
-/* Check whether there is anything that the worker should do instead of
|
|
|
+/** Check whether there is anything that the worker should do instead of
|
|
|
* sleeping (waiting on something to happen). */
|
|
|
unsigned _starpu_worker_can_block(unsigned memnode, struct _starpu_worker *worker);
|
|
|
|
|
|
-/* This function must be called to block a worker. It puts the worker in a
|
|
|
+/** This function must be called to block a worker. It puts the worker in a
|
|
|
* sleeping state until there is some event that forces the worker to wake up.
|
|
|
* */
|
|
|
void _starpu_block_worker(int workerid, starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex);
|
|
|
|
|
|
-/* This function initializes the current driver for the given worker */
|
|
|
+/** This function initializes the current driver for the given worker */
|
|
|
void _starpu_driver_start(struct _starpu_worker *worker, unsigned fut_key, unsigned sync);
|
|
|
-/* This function initializes the current thread for the given worker */
|
|
|
+/** This function initializes the current thread for the given worker */
|
|
|
void _starpu_worker_start(struct _starpu_worker *worker, unsigned fut_key, unsigned sync);
|
|
|
|
|
|
static inline unsigned _starpu_worker_get_count(void)
|
|
@@ -507,7 +518,7 @@ static inline unsigned _starpu_worker_get_count(void)
|
|
|
}
|
|
|
#define starpu_worker_get_count _starpu_worker_get_count
|
|
|
|
|
|
-/* The _starpu_worker structure describes all the state of a StarPU worker.
|
|
|
+/** The _starpu_worker structure describes all the state of a StarPU worker.
|
|
|
* This function sets the pthread key which stores a pointer to this structure.
|
|
|
* */
|
|
|
static inline void _starpu_set_local_worker_key(struct _starpu_worker *worker)
|
|
@@ -516,7 +527,7 @@ static inline void _starpu_set_local_worker_key(struct _starpu_worker *worker)
|
|
|
STARPU_PTHREAD_SETSPECIFIC(_starpu_worker_key, worker);
|
|
|
}
|
|
|
|
|
|
-/* Returns the _starpu_worker structure that describes the state of the
|
|
|
+/** Returns the _starpu_worker structure that describes the state of the
|
|
|
* current worker. */
|
|
|
static inline struct _starpu_worker *_starpu_get_local_worker_key(void)
|
|
|
{
|
|
@@ -525,7 +536,7 @@ static inline struct _starpu_worker *_starpu_get_local_worker_key(void)
|
|
|
return (struct _starpu_worker *) STARPU_PTHREAD_GETSPECIFIC(_starpu_worker_key);
|
|
|
}
|
|
|
|
|
|
-/* The _starpu_worker_set structure describes all the state of a StarPU worker_set.
|
|
|
+/** The _starpu_worker_set structure describes all the state of a StarPU worker_set.
|
|
|
* This function sets the pthread key which stores a pointer to this structure.
|
|
|
* */
|
|
|
static inline void _starpu_set_local_worker_set_key(struct _starpu_worker_set *worker)
|
|
@@ -534,7 +545,7 @@ static inline void _starpu_set_local_worker_set_key(struct _starpu_worker_set *w
|
|
|
STARPU_PTHREAD_SETSPECIFIC(_starpu_worker_set_key, worker);
|
|
|
}
|
|
|
|
|
|
-/* Returns the _starpu_worker_set structure that describes the state of the
|
|
|
+/** Returns the _starpu_worker_set structure that describes the state of the
|
|
|
* current worker_set. */
|
|
|
static inline struct _starpu_worker_set *_starpu_get_local_worker_set_key(void)
|
|
|
{
|
|
@@ -543,7 +554,7 @@ static inline struct _starpu_worker_set *_starpu_get_local_worker_set_key(void)
|
|
|
return (struct _starpu_worker_set *) STARPU_PTHREAD_GETSPECIFIC(_starpu_worker_set_key);
|
|
|
}
|
|
|
|
|
|
-/* Returns the _starpu_worker structure that describes the state of the
|
|
|
+/** Returns the _starpu_worker structure that describes the state of the
|
|
|
* specified worker. */
|
|
|
static inline struct _starpu_worker *_starpu_get_worker_struct(unsigned id)
|
|
|
{
|
|
@@ -551,7 +562,7 @@ static inline struct _starpu_worker *_starpu_get_worker_struct(unsigned id)
|
|
|
return &_starpu_config.workers[id];
|
|
|
}
|
|
|
|
|
|
-/* Returns the starpu_sched_ctx structure that describes the state of the
|
|
|
+/** Returns the starpu_sched_ctx structure that describes the state of the
|
|
|
* specified ctx */
|
|
|
static inline struct _starpu_sched_ctx *_starpu_get_sched_ctx_struct(unsigned id)
|
|
|
{
|
|
@@ -560,33 +571,33 @@ static inline struct _starpu_sched_ctx *_starpu_get_sched_ctx_struct(unsigned id
|
|
|
|
|
|
struct _starpu_combined_worker *_starpu_get_combined_worker_struct(unsigned id);
|
|
|
|
|
|
-/* Returns the structure that describes the overall machine configuration (eg.
|
|
|
+/** Returns the structure that describes the overall machine configuration (eg.
|
|
|
* all workers and topology). */
|
|
|
static inline struct _starpu_machine_config *_starpu_get_machine_config(void)
|
|
|
{
|
|
|
return &_starpu_config;
|
|
|
}
|
|
|
|
|
|
-/* Return whether kernels should be run (<=0) or not (>0) */
|
|
|
+/** Return whether kernels should be run (<=0) or not (>0) */
|
|
|
static inline int _starpu_get_disable_kernels(void)
|
|
|
{
|
|
|
return _starpu_config.disable_kernels;
|
|
|
}
|
|
|
|
|
|
-/* Retrieve the status which indicates what the worker is currently doing. */
|
|
|
+/** Retrieve the status which indicates what the worker is currently doing. */
|
|
|
static inline enum _starpu_worker_status _starpu_worker_get_status(int workerid)
|
|
|
{
|
|
|
return _starpu_config.workers[workerid].status;
|
|
|
}
|
|
|
|
|
|
-/* Change the status of the worker which indicates what the worker is currently
|
|
|
+/** Change the status of the worker which indicates what the worker is currently
|
|
|
* doing (eg. executing a callback). */
|
|
|
static inline void _starpu_worker_set_status(int workerid, enum _starpu_worker_status status)
|
|
|
{
|
|
|
_starpu_config.workers[workerid].status = status;
|
|
|
}
|
|
|
|
|
|
-/* We keep an initial sched ctx which might be used in case no other ctx is available */
|
|
|
+/** We keep an initial sched ctx which might be used in case no other ctx is available */
|
|
|
static inline struct _starpu_sched_ctx* _starpu_get_initial_sched_ctx(void)
|
|
|
{
|
|
|
return &_starpu_config.sched_ctxs[STARPU_GLOBAL_SCHED_CTX];
|
|
@@ -594,7 +605,7 @@ static inline struct _starpu_sched_ctx* _starpu_get_initial_sched_ctx(void)
|
|
|
|
|
|
int starpu_worker_get_nids_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize);
|
|
|
|
|
|
-/* returns workers not belonging to any context, be careful no mutex is used,
|
|
|
+/** returns workers not belonging to any context, be careful no mutex is used,
|
|
|
the list might not be updated */
|
|
|
int starpu_worker_get_nids_ctx_free_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize);
|
|
|
|
|
@@ -609,7 +620,7 @@ static inline int _starpu_worker_get_nsched_ctxs(int workerid)
|
|
|
return _starpu_config.workers[workerid].nsched_ctxs;
|
|
|
}
|
|
|
|
|
|
-/* Get the total number of sched_ctxs created till now */
|
|
|
+/** Get the total number of sched_ctxs created till now */
|
|
|
static inline unsigned _starpu_get_nsched_ctxs(void)
|
|
|
{
|
|
|
/* topology.nsched_ctxs may be increased asynchronously in sched_ctx_create */
|
|
@@ -617,7 +628,7 @@ static inline unsigned _starpu_get_nsched_ctxs(void)
|
|
|
return _starpu_config.topology.nsched_ctxs;
|
|
|
}
|
|
|
|
|
|
-/* Inlined version when building the core. */
|
|
|
+/** Inlined version when building the core. */
|
|
|
static inline int _starpu_worker_get_id(void)
|
|
|
{
|
|
|
struct _starpu_worker * worker;
|
|
@@ -636,8 +647,8 @@ static inline int _starpu_worker_get_id(void)
|
|
|
}
|
|
|
#define starpu_worker_get_id _starpu_worker_get_id
|
|
|
|
|
|
-/* Similar behaviour to starpu_worker_get_id() but fails when called from outside a worker */
|
|
|
-/* This returns an unsigned object on purpose, so that the caller is sure to get a positive value */
|
|
|
+/** Similar behaviour to starpu_worker_get_id() but fails when called from outside a worker */
|
|
|
+/** This returns an unsigned object on purpose, so that the caller is sure to get a positive value */
|
|
|
static inline unsigned __starpu_worker_get_id_check(const char *f, int l)
|
|
|
{
|
|
|
(void) l;
|
|
@@ -652,7 +663,7 @@ void _starpu_worker_set_stream_ctx(unsigned workerid, struct _starpu_sched_ctx *
|
|
|
|
|
|
struct _starpu_sched_ctx* _starpu_worker_get_ctx_stream(unsigned stream_workerid);
|
|
|
|
|
|
-/* Send a request to the worker to block, before a parallel task is about to
|
|
|
+/** Send a request to the worker to block, before a parallel task is about to
|
|
|
* begin.
|
|
|
*
|
|
|
* Must be called with worker's sched_mutex held.
|
|
@@ -702,7 +713,7 @@ static inline void _starpu_worker_request_blocking_in_parallel(struct _starpu_wo
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* Send a request to the worker to unblock, after a parallel task is complete.
|
|
|
+/** Send a request to the worker to unblock, after a parallel task is complete.
|
|
|
*
|
|
|
* Must be called with worker's sched_mutex held.
|
|
|
*/
|
|
@@ -750,7 +761,7 @@ static inline void _starpu_worker_request_unblocking_in_parallel(struct _starpu_
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* Called by the the worker to process incoming requests to block or unblock on
|
|
|
+/** Called by the the worker to process incoming requests to block or unblock on
|
|
|
* parallel task boundaries.
|
|
|
*
|
|
|
* Must be called with worker's sched_mutex held.
|
|
@@ -791,7 +802,7 @@ static inline void _starpu_worker_process_block_in_parallel_requests(struct _sta
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* Mark the beginning of a scheduling operation by the worker. No worker
|
|
|
+/** Mark the beginning of a scheduling operation by the worker. No worker
|
|
|
* blocking operations on parallel tasks and no scheduling context change
|
|
|
* operations must be performed on contexts containing the worker, on
|
|
|
* contexts about to add the worker and on contexts about to remove the
|
|
@@ -856,7 +867,7 @@ static inline void _starpu_worker_enter_sched_op(struct _starpu_worker * const w
|
|
|
#define _starpu_worker_enter_sched_op(worker) __starpu_worker_enter_sched_op((worker), __FILE__, __LINE__, __starpu_func__)
|
|
|
#endif
|
|
|
|
|
|
-/* Mark the end of a scheduling operation by the worker.
|
|
|
+/** Mark the end of a scheduling operation by the worker.
|
|
|
*
|
|
|
* Must be called with worker's sched_mutex held.
|
|
|
*/
|
|
@@ -892,7 +903,7 @@ static inline int _starpu_worker_sched_op_pending(void)
|
|
|
return worker->state_sched_op_pending;
|
|
|
}
|
|
|
|
|
|
-/* Must be called before altering a context related to the worker
|
|
|
+/** Must be called before altering a context related to the worker
|
|
|
* whether about adding the worker to a context, removing it from a
|
|
|
* context or modifying the set of workers of a context of which the
|
|
|
* worker is a member, to mark the beginning of a context change
|
|
@@ -939,7 +950,7 @@ static inline void _starpu_worker_enter_changing_ctx_op(struct _starpu_worker *
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* Mark the end of a context change operation.
|
|
|
+/** Mark the end of a context change operation.
|
|
|
*
|
|
|
* Must be called with worker's sched_mutex held.
|
|
|
*/
|
|
@@ -950,7 +961,7 @@ static inline void _starpu_worker_leave_changing_ctx_op(struct _starpu_worker *
|
|
|
STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond);
|
|
|
}
|
|
|
|
|
|
-/* Temporarily allow other worker to access current worker state, when still scheduling,
|
|
|
+/** Temporarily allow other worker to access current worker state, when still scheduling,
|
|
|
* but the scheduling has not yet been made or is already done */
|
|
|
#ifdef STARPU_SPINLOCK_CHECK
|
|
|
static inline void __starpu_worker_relax_on(const char*file, int line, const char* func)
|
|
@@ -983,7 +994,7 @@ static inline void _starpu_worker_relax_on(void)
|
|
|
#endif
|
|
|
#define starpu_worker_relax_on _starpu_worker_relax_on
|
|
|
|
|
|
-/* Same, but with current worker mutex already held */
|
|
|
+/** Same, but with current worker mutex already held */
|
|
|
#ifdef STARPU_SPINLOCK_CHECK
|
|
|
static inline void __starpu_worker_relax_on_locked(struct _starpu_worker *worker, const char*file, int line, const char* func)
|
|
|
#else
|
|
@@ -1081,7 +1092,7 @@ static inline int _starpu_worker_get_relax_state(void)
|
|
|
}
|
|
|
#define starpu_worker_get_relax_state _starpu_worker_get_relax_state
|
|
|
|
|
|
-/* lock a worker for observing contents
|
|
|
+/** lock a worker for observing contents
|
|
|
*
|
|
|
* notes:
|
|
|
* - if the observed worker is not in state_relax_refcnt, the function block until the state is reached */
|
|
@@ -1174,8 +1185,12 @@ static inline int _starpu_wake_worker_relax(int workerid)
|
|
|
|
|
|
int starpu_wake_worker_relax_light(int workerid);
|
|
|
|
|
|
-/* Allow a worker pulling a task it cannot execute to properly refuse it and
|
|
|
- * send it back to the scheduler.
|
|
|
+/**
|
|
|
+ * Allow a worker pulling a task it cannot execute to properly refuse it and
|
|
|
+ * send it back to the scheduler.
|
|
|
*/
|
|
|
void _starpu_worker_refuse_task(struct _starpu_worker *worker, struct starpu_task *task);
|
|
|
+
|
|
|
+/* @}*/
|
|
|
+
|
|
|
#endif // __WORKERS_H__
|