123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787 |
- @c -*-texinfo-*-
- @c This file is part of the StarPU Handbook.
- @c Copyright (C) 2009--2011 Universit@'e de Bordeaux 1
- @c Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique
- @c Copyright (C) 2011, 2012 Institut National de Recherche en Informatique et Automatique
- @c See the file starpu.texi for copying conditions.
- @menu
- * Defining a new data interface::
- * Multiformat Data Interface::
- * Task Bundles::
- * Task Lists::
- * Using Parallel Tasks::
- * Defining a new scheduling policy::
- * Running drivers::
- * Expert mode::
- @end menu
- @node Defining a new data interface
- @section Defining a new data interface
- @menu
- * Data Interface API:: Data Interface API
- * An example of data interface:: An example of data interface
- @end menu
- @node Data Interface API
- @subsection Data Interface API
- @deftp {Data Type} {struct starpu_data_interface_ops}
- @anchor{struct starpu_data_interface_ops}
- Per-interface data transfer methods.
- @table @asis
- @item @code{void (*register_data_handle)(starpu_data_handle_t handle, uint32_t home_node, void *data_interface)}
- Register an existing interface into a data handle.
- @item @code{starpu_ssize_t (*allocate_data_on_node)(void *data_interface, uint32_t node)}
- Allocate data for the interface on a given node.
- @item @code{ void (*free_data_on_node)(void *data_interface, uint32_t node)}
- Free data of the interface on a given node.
- @item @code{ const struct starpu_data_copy_methods *copy_methods}
- ram/cuda/spu/opencl synchronous and asynchronous transfer methods.
- @item @code{ void * (*handle_to_pointer)(starpu_data_handle_t handle, uint32_t node)}
- Return the current pointer (if any) for the handle on the given node.
- @item @code{ size_t (*get_size)(starpu_data_handle_t handle)}
- Return an estimation of the size of data, for performance models.
- @item @code{ uint32_t (*footprint)(starpu_data_handle_t handle)}
- Return a 32bit footprint which characterizes the data size.
- @item @code{ int (*compare)(void *data_interface_a, void *data_interface_b)}
- Compare the data size of two interfaces.
- @item @code{ void (*display)(starpu_data_handle_t handle, FILE *f)}
- Dump the sizes of a handle to a file.
- @item @code{enum starpu_data_interface_id interfaceid}
- An identifier that is unique to each interface.
- @item @code{size_t interface_size}
- The size of the interface data descriptor.
- @item @code{int is_multiformat}
- todo
- @item @code{struct starpu_multiformat_data_interface_ops* (*get_mf_ops)(void *data_interface)}
- todo
- @item @code{int (*pack_data)(starpu_data_handle_t handle, uint32_t node, void **ptr, size_t *count)}
- Pack the data handle into a contiguous buffer at the address @code{ptr} and set the size of the newly created buffer in @code{count}
- @item @code{int (*unpack_data)(starpu_data_handle_t handle, uint32_t node, void *ptr, size_t count)}
- Unpack the data handle from the contiguous buffer at the address @code{ptr} of size @var{count}
- @end table
- @end deftp
- @deftp {Data Type} {struct starpu_data_copy_methods}
- Defines the per-interface methods.
- @table @asis
- @item @code{int @{ram,cuda,opencl,spu@}_to_@{ram,cuda,opencl,spu@}(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node)}
- These 16 functions define how to copy data from the @var{src_interface}
- interface on the @var{src_node} node to the @var{dst_interface} interface
- on the @var{dst_node} node. They return 0 on success.
- @item @code{int (*ram_to_cuda_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream)}
- Define how to copy data from the @var{src_interface} interface on the
- @var{src_node} node (in RAM) to the @var{dst_interface} interface on the
- @var{dst_node} node (on a CUDA device), using the given @var{stream}. Return 0
- on success.
- @item @code{int (*cuda_to_ram_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream)}
- Define how to copy data from the @var{src_interface} interface on the
- @var{src_node} node (on a CUDA device) to the @var{dst_interface} interface on the
- @var{dst_node} node (in RAM), using the given @var{stream}. Return 0
- on success.
- @item @code{int (*cuda_to_cuda_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream)}
- Define how to copy data from the @var{src_interface} interface on the
- @var{src_node} node (on a CUDA device) to the @var{dst_interface} interface on
- the @var{dst_node} node (on another CUDA device), using the given @var{stream}.
- Return 0 on success.
- @item @code{int (*ram_to_opencl_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, /* cl_event * */ void *event)}
- Define how to copy data from the @var{src_interface} interface on the
- @var{src_node} node (in RAM) to the @var{dst_interface} interface on the
- @var{dst_node} node (on an OpenCL device), using @var{event}, a pointer to a
- cl_event. Return 0 on success.
- @item @code{int (*opencl_to_ram_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, /* cl_event * */ void *event)}
- Define how to copy data from the @var{src_interface} interface on the
- @var{src_node} node (on an OpenCL device) to the @var{dst_interface} interface
- on the @var{dst_node} node (in RAM), using the given @var{event}, a pointer to
- a cl_event. Return 0 on success.
- @item @code{int (*opencl_to_opencl_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, /* cl_event * */ void *event)}
- Define how to copy data from the @var{src_interface} interface on the
- @var{src_node} node (on an OpenCL device) to the @var{dst_interface} interface
- on the @var{dst_node} node (on another OpenCL device), using the given
- @var{event}, a pointer to a cl_event. Return 0 on success.
- @end table
- @end deftp
- @deftypefun uint32_t starpu_crc32_be_n ({void *}@var{input}, size_t @var{n}, uint32_t @var{inputcrc})
- Compute the CRC of a byte buffer seeded by the inputcrc "current
- state". The return value should be considered as the new "current
- state" for future CRC computation. This is used for computing data size
- footprint.
- @end deftypefun
- @deftypefun uint32_t starpu_crc32_be (uint32_t @var{input}, uint32_t @var{inputcrc})
- Compute the CRC of a 32bit number seeded by the inputcrc "current
- state". The return value should be considered as the new "current
- state" for future CRC computation. This is used for computing data size
- footprint.
- @end deftypefun
- @deftypefun uint32_t starpu_crc32_string ({char *}@var{str}, uint32_t @var{inputcrc})
- Compute the CRC of a string seeded by the inputcrc "current state".
- The return value should be considered as the new "current state" for
- future CRC computation. This is used for computing data size footprint.
- @end deftypefun
- @node An example of data interface
- @subsection An example of data interface
- @deftypefun int starpu_data_interface_get_next_id (void)
- Returns the next available id for a newly created data interface.
- @end deftypefun
- Let's define a new data interface to manage complex numbers.
- @cartouche
- @smallexample
- /* interface for complex numbers */
- struct starpu_complex_interface
- @{
- double *real;
- double *imaginary;
- int nx;
- @};
- @end smallexample
- @end cartouche
- Registering such a data to StarPU is easily done using the function
- @code{starpu_data_register} (@pxref{Basic Data Management API}). The last
- parameter of the function, @code{interface_complex_ops}, will be
- described below.
- @cartouche
- @smallexample
- void starpu_complex_data_register(starpu_data_handle_t *handle,
- uint32_t home_node, double *real, double *imaginary, int nx)
- @{
- struct starpu_complex_interface complex =
- @{
- .real = real,
- .imaginary = imaginary,
- .nx = nx
- @};
- if (interface_complex_ops.interfaceid == -1)
- @{
- interface_complex_ops.interfaceid = starpu_data_interface_get_next_id();
- @}
- starpu_data_register(handleptr, home_node, &complex, &interface_complex_ops);
- @}
- @end smallexample
- @end cartouche
- Different operations need to be defined for a data interface through
- the type @code{struct starpu_data_interface_ops} (@pxref{Data
- Interface API}). We only define here the basic operations needed to
- run simple applications. The source code for the different functions
- can be found in the file
- @code{examples/interface/complex_interface.c}.
- @cartouche
- @smallexample
- static struct starpu_data_interface_ops interface_complex_ops =
- @{
- .register_data_handle = complex_register_data_handle,
- .allocate_data_on_node = complex_allocate_data_on_node,
- .copy_methods = &complex_copy_methods,
- .get_size = complex_get_size,
- .footprint = complex_footprint,
- .interfaceid = -1,
- .interface_size = sizeof(struct starpu_complex_interface),
- @};
- @end smallexample
- @end cartouche
- Functions need to be defined to access the different fields of the
- complex interface from a StarPU data handle.
- @cartouche
- @smallexample
- double *starpu_complex_get_real(starpu_data_handle_t handle)
- @{
- struct starpu_complex_interface *complex_interface =
- (struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, 0);
- return complex_interface->real;
- @}
- double *starpu_complex_get_imaginary(starpu_data_handle_t handle);
- int starpu_complex_get_nx(starpu_data_handle_t handle);
- @end smallexample
- @end cartouche
- Similar functions need to be defined to access the different fields of the
- complex interface from a @code{void *} pointer to be used within codelet
- implemetations.
- @cartouche
- @smallexample
- #define STARPU_COMPLEX_GET_REAL(interface) \
- (((struct starpu_complex_interface *)(interface))->real)
- #define STARPU_COMPLEX_GET_IMAGINARY(interface) \
- (((struct starpu_complex_interface *)(interface))->imaginary)
- #define STARPU_COMPLEX_GET_NX(interface) \
- (((struct starpu_complex_interface *)(interface))->nx)
- @end smallexample
- @end cartouche
- Complex data interfaces can then be registered to StarPU.
- @cartouche
- @smallexample
- double real = 45.0;
- double imaginary = 12.0;
- starpu_complex_data_register(&handle1, 0, &real, &imaginary, 1);
- starpu_insert_task(&cl_display, STARPU_R, handle1, 0);
- @end smallexample
- @end cartouche
- and used by codelets.
- @cartouche
- @smallexample
- void display_complex_codelet(void *descr[], __attribute__ ((unused)) void *_args)
- @{
- int nx = STARPU_COMPLEX_GET_NX(descr[0]);
- double *real = STARPU_COMPLEX_GET_REAL(descr[0]);
- double *imaginary = STARPU_COMPLEX_GET_IMAGINARY(descr[0]);
- int i;
- for(i=0 ; i<nx ; i++)
- @{
- fprintf(stderr, "Complex[%d] = %3.2f + %3.2f i\n", i, real[i], imaginary[i]);
- @}
- @}
- @end smallexample
- @end cartouche
- The whole code for this complex data interface is available in the
- directory @code{examples/interface/}.
- @node Multiformat Data Interface
- @section Multiformat Data Interface
- @deftp {Data Type} {struct starpu_multiformat_data_interface_ops}
- The different fields are:
- @table @asis
- @item @code{size_t cpu_elemsize}
- the size of each element on CPUs,
- @item @code{size_t opencl_elemsize}
- the size of each element on OpenCL devices,
- @item @code{struct starpu_codelet *cpu_to_opencl_cl}
- pointer to a codelet which converts from CPU to OpenCL
- @item @code{struct starpu_codelet *opencl_to_cpu_cl}
- pointer to a codelet which converts from OpenCL to CPU
- @item @code{size_t cuda_elemsize}
- the size of each element on CUDA devices,
- @item @code{struct starpu_codelet *cpu_to_cuda_cl}
- pointer to a codelet which converts from CPU to CUDA
- @item @code{struct starpu_codelet *cuda_to_cpu_cl}
- pointer to a codelet which converts from CUDA to CPU
- @end table
- @end deftp
- @deftypefun void starpu_multiformat_data_register (starpu_data_handle_t *@var{handle}, uint32_t @var{home_node}, void *@var{ptr}, uint32_t @var{nobjects}, struct starpu_multiformat_data_interface_ops *@var{format_ops})
- Register a piece of data that can be represented in different ways, depending upon
- the processing unit that manipulates it. It allows the programmer, for instance, to
- use an array of structures when working on a CPU, and a structure of arrays when
- working on a GPU.
- @var{nobjects} is the number of elements in the data. @var{format_ops} describes
- the format.
- @end deftypefun
- @defmac STARPU_MULTIFORMAT_GET_CPU_PTR ({void *}@var{interface})
- returns the local pointer to the data with CPU format.
- @end defmac
- @defmac STARPU_MULTIFORMAT_GET_CUDA_PTR ({void *}@var{interface})
- returns the local pointer to the data with CUDA format.
- @end defmac
- @defmac STARPU_MULTIFORMAT_GET_OPENCL_PTR ({void *}@var{interface})
- returns the local pointer to the data with OpenCL format.
- @end defmac
- @defmac STARPU_MULTIFORMAT_GET_NX ({void *}@var{interface})
- returns the number of elements in the data.
- @end defmac
- @node Task Bundles
- @section Task Bundles
- @deftp {Data Type} {starpu_task_bundle_t}
- Opaque structure describing a list of tasks that should be scheduled
- on the same worker whenever it's possible. It must be considered as a
- hint given to the scheduler as there is no guarantee that they will be
- executed on the same worker.
- @end deftp
- @deftypefun void starpu_task_bundle_create ({starpu_task_bundle_t *}@var{bundle})
- Factory function creating and initializing @var{bundle}, when the call returns, memory needed is allocated and @var{bundle} is ready to use.
- @end deftypefun
- @deftypefun int starpu_task_bundle_insert (starpu_task_bundle_t @var{bundle}, {struct starpu_task *}@var{task})
- Insert @var{task} in @var{bundle}. Until @var{task} is removed from @var{bundle} its expected length and data transfer time will be considered along those of the other tasks of @var{bundle}.
- This function mustn't be called if @var{bundle} is already closed and/or @var{task} is already submitted.
- @end deftypefun
- @deftypefun int starpu_task_bundle_remove (starpu_task_bundle_t @var{bundle}, {struct starpu_task *}@var{task})
- Remove @var{task} from @var{bundle}.
- Of course @var{task} must have been previously inserted @var{bundle}.
- This function mustn't be called if @var{bundle} is already closed and/or @var{task} is already submitted. Doing so would result in undefined behaviour.
- @end deftypefun
- @deftypefun void starpu_task_bundle_close (starpu_task_bundle_t @var{bundle})
- Inform the runtime that the user won't modify @var{bundle} anymore, it means no more inserting or removing task. Thus the runtime can destroy it when possible.
- @end deftypefun
- @deftypefun double starpu_task_bundle_expected_length (starpu_task_bundle_t @var{bundle}, {enum starpu_perf_archtype} @var{arch}, unsigned @var{nimpl})
- Return the expected duration of the entire task bundle in µs.
- @end deftypefun
- @deftypefun double starpu_task_bundle_expected_power (starpu_task_bundle_t @var{bundle}, enum starpu_perf_archtype @var{arch}, unsigned @var{nimpl})
- Return the expected power consumption of the entire task bundle in J.
- @end deftypefun
- @deftypefun double starpu_task_bundle_expected_data_transfer_time (starpu_task_bundle_t @var{bundle}, unsigned @var{memory_node})
- Return the time (in µs) expected to transfer all data used within the bundle.
- @end deftypefun
- @node Task Lists
- @section Task Lists
- @deftp {Data Type} {struct starpu_task_list}
- Stores a double-chained list of tasks
- @end deftp
- @deftypefun void starpu_task_list_init ({struct starpu_task_list *}@var{list})
- Initialize a list structure
- @end deftypefun
- @deftypefun void starpu_task_list_push_front ({struct starpu_task_list *}@var{list}, {struct starpu_task *}@var{task})
- Push a task at the front of a list
- @end deftypefun
- @deftypefun void starpu_task_list_push_back ({struct starpu_task_list *}@var{list}, {struct starpu_task *}@var{task})
- Push a task at the back of a list
- @end deftypefun
- @deftypefun {struct starpu_task *} starpu_task_list_front ({struct starpu_task_list *}@var{list})
- Get the front of the list (without removing it)
- @end deftypefun
- @deftypefun {struct starpu_task *} starpu_task_list_back ({struct starpu_task_list *}@var{list})
- Get the back of the list (without removing it)
- @end deftypefun
- @deftypefun int starpu_task_list_empty ({struct starpu_task_list *}@var{list})
- Test if a list is empty
- @end deftypefun
- @deftypefun void starpu_task_list_erase ({struct starpu_task_list *}@var{list}, {struct starpu_task *}@var{task})
- Remove an element from the list
- @end deftypefun
- @deftypefun {struct starpu_task *} starpu_task_list_pop_front ({struct starpu_task_list *}@var{list})
- Remove the element at the front of the list
- @end deftypefun
- @deftypefun {struct starpu_task *} starpu_task_list_pop_back ({struct starpu_task_list *}@var{list})
- Remove the element at the back of the list
- @end deftypefun
- @deftypefun {struct starpu_task *} starpu_task_list_begin ({struct starpu_task_list *}@var{list})
- Get the first task of the list.
- @end deftypefun
- @deftypefun {struct starpu_task *} starpu_task_list_end ({struct starpu_task_list *}@var{list})
- Get the end of the list.
- @end deftypefun
- @deftypefun {struct starpu_task *} starpu_task_list_next ({struct starpu_task *}@var{task})
- Get the next task of the list. This is not erase-safe.
- @end deftypefun
- @node Using Parallel Tasks
- @section Using Parallel Tasks
- These are used by parallel tasks:
- @deftypefun int starpu_combined_worker_get_size (void)
- Return the size of the current combined worker, i.e. the total number of cpus
- running the same task in the case of SPMD parallel tasks, or the total number
- of threads that the task is allowed to start in the case of FORKJOIN parallel
- tasks.
- @end deftypefun
- @deftypefun int starpu_combined_worker_get_rank (void)
- Return the rank of the current thread within the combined worker. Can only be
- used in FORKJOIN parallel tasks, to know which part of the task to work on.
- @end deftypefun
- Most of these are used for schedulers which support parallel tasks.
- @deftypefun unsigned starpu_combined_worker_get_count (void)
- Return the number of different combined workers.
- @end deftypefun
- @deftypefun int starpu_combined_worker_get_id (void)
- Return the identifier of the current combined worker.
- @end deftypefun
- @deftypefun int starpu_combined_worker_assign_workerid (int @var{nworkers}, int @var{workerid_array}[])
- Register a new combined worker and get its identifier
- @end deftypefun
- @deftypefun int starpu_combined_worker_get_description (int @var{workerid}, {int *}@var{worker_size}, {int **}@var{combined_workerid})
- Get the description of a combined worker
- @end deftypefun
- @deftypefun int starpu_combined_worker_can_execute_task (unsigned @var{workerid}, {struct starpu_task *}@var{task}, unsigned @var{nimpl})
- Variant of starpu_worker_can_execute_task compatible with combined workers
- @end deftypefun
- @node Defining a new scheduling policy
- @section Defining a new scheduling policy
- TODO
- A full example showing how to define a new scheduling policy is available in
- the StarPU sources in the directory @code{examples/scheduler/}.
- @menu
- * Scheduling Policy API:: Scheduling Policy API
- * Source code::
- @end menu
- @node Scheduling Policy API
- @subsection Scheduling Policy API
- While StarPU comes with a variety of scheduling policies (@pxref{Task
- scheduling policy}), it may sometimes be desirable to implement custom
- policies to address specific problems. The API described below allows
- users to write their own scheduling policy.
- @deftp {Data Type} {struct starpu_machine_topology}
- @table @asis
- @item @code{unsigned nworkers}
- Total number of workers.
- @item @code{unsigned ncombinedworkers}
- Total number of combined workers.
- @item @code{hwloc_topology_t hwtopology}
- Topology as detected by hwloc.
- To maintain ABI compatibility when hwloc is not available, the field
- is replaced with @code{void *dummy}
- @item @code{unsigned nhwcpus}
- Total number of CPUs, as detected by the topology code. May be different from
- the actual number of CPU workers.
- @item @code{unsigned nhwcudagpus}
- Total number of CUDA devices, as detected. May be different from the actual
- number of CUDA workers.
- @item @code{unsigned nhwopenclgpus}
- Total number of OpenCL devices, as detected. May be different from the actual
- number of CUDA workers.
- @item @code{unsigned ncpus}
- Actual number of CPU workers used by StarPU.
- @item @code{unsigned ncudagpus}
- Actual number of CUDA workers used by StarPU.
- @item @code{unsigned nopenclgpus}
- Actual number of OpenCL workers used by StarPU.
- @item @code{unsigned workers_bindid[STARPU_NMAXWORKERS]}
- Indicates the successive cpu 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 round-robin policy is used to distributed the workers
- over the cpus.
- @item @code{unsigned workers_cuda_gpuid[STARPU_NMAXWORKERS]}
- Indicates the successive cpu 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. Otherwise,
- they are taken in ID order.
- @item @code{unsigned workers_opencl_gpuid[STARPU_NMAXWORKERS]}
- Indicates the successive cpu 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. Otherwise,
- they are taken in ID order.
- @end table
- @end deftp
- @deftp {Data Type} {struct starpu_sched_policy}
- This structure contains all the methods that implement a scheduling policy. An
- application may specify which scheduling strategy in the @code{sched_policy}
- field of the @code{starpu_conf} structure passed to the @code{starpu_init}
- function. The different fields are:
- @table @asis
- @item @code{void (*init_sched)(struct starpu_machine_topology *, struct starpu_sched_policy *)}
- Initialize the scheduling policy.
- @item @code{void (*deinit_sched)(struct starpu_machine_topology *, struct starpu_sched_policy *)}
- Cleanup the scheduling policy.
- @item @code{int (*push_task)(struct starpu_task *)}
- Insert a task into the scheduler.
- @item @code{void (*push_task_notify)(struct starpu_task *, int workerid)}
- Notify the scheduler that a task was pushed on a given worker. This method is
- called when a task that was explicitely assigned to a worker becomes ready and
- is about to be executed by the worker. This method therefore permits to keep
- the state of of the scheduler coherent even when StarPU bypasses the scheduling
- strategy.
- @item @code{struct starpu_task *(*pop_task)(void)} (optional)
- Get a task from the scheduler. The mutex associated to the worker is already
- taken when this method is called. If this method is defined as @code{NULL}, the
- worker will only execute tasks from its local queue. In this case, the
- @code{push_task} method should use the @code{starpu_push_local_task} method to
- assign tasks to the different workers.
- @item @code{struct starpu_task *(*pop_every_task)(void)}
- Remove all available tasks from the scheduler (tasks are chained by the means
- of the prev and next fields of the starpu_task structure). The mutex associated
- to the worker is already taken when this method is called. This is currently
- not used.
- @item @code{void (*pre_exec_hook)(struct starpu_task *)} (optional)
- This method is called every time a task is starting.
- @item @code{void (*post_exec_hook)(struct starpu_task *)} (optional)
- This method is called every time a task has been executed.
- @item @code{const char *policy_name} (optional)
- Name of the policy.
- @item @code{const char *policy_description} (optional)
- Description of the policy.
- @end table
- @end deftp
- @deftypefun void starpu_worker_set_sched_condition (int @var{workerid}, pthread_cond_t *@var{sched_cond}, pthread_mutex_t *@var{sched_mutex})
- This function specifies the condition variable associated to a worker
- When there is no available task for a worker, StarPU blocks this worker on a
- condition variable. This function specifies which condition variable (and the
- associated mutex) should be used to block (and to wake up) a worker. Note that
- multiple workers may use the same condition variable. For instance, in the case
- of a scheduling strategy with a single task queue, the same condition variable
- would be used to block and wake up all workers.
- The initialization method of a scheduling strategy (@code{init_sched}) must
- call this function once per worker.
- @end deftypefun
- @deftypefun void starpu_sched_set_min_priority (int @var{min_prio})
- Defines the minimum priority level supported by the scheduling policy. The
- default minimum priority level is the same as the default priority level which
- is 0 by convention. The application may access that value by calling the
- @code{starpu_sched_get_min_priority} function. This function should only be
- called from the initialization method of the scheduling policy, and should not
- be used directly from the application.
- @end deftypefun
- @deftypefun void starpu_sched_set_max_priority (int @var{max_prio})
- Defines the maximum priority level supported by the scheduling policy. The
- default maximum priority level is 1. The application may access that value by
- calling the @code{starpu_sched_get_max_priority} function. This function should
- only be called from the initialization method of the scheduling policy, and
- should not be used directly from the application.
- @end deftypefun
- @deftypefun int starpu_sched_get_min_priority (void)
- Returns the current minimum priority level supported by the
- scheduling policy
- @end deftypefun
- @deftypefun int starpu_sched_get_max_priority (void)
- Returns the current maximum priority level supported by the
- scheduling policy
- @end deftypefun
- @deftypefun int starpu_push_local_task (int @var{workerid}, {struct starpu_task} *@var{task}, int @var{back})
- The scheduling policy may put tasks directly into a worker's local queue so
- that it is not always necessary to create its own queue when the local queue
- is sufficient. If @var{back} not null, @var{task} is put at the back of the queue
- where the worker will pop tasks first. Setting @var{back} to 0 therefore ensures
- a FIFO ordering.
- @end deftypefun
- @deftypefun int starpu_worker_can_execute_task (unsigned @var{workerid}, {struct starpu_task *}@var{task}, unsigned {nimpl})
- Check if the worker specified by workerid can execute the codelet. Schedulers need to call it before assigning a task to a worker, otherwise the task may fail to execute.
- @end deftypefun
- @deftypefun double starpu_timing_now (void)
- Return the current date in µs
- @end deftypefun
- @deftypefun double starpu_task_expected_length ({struct starpu_task *}@var{task}, {enum starpu_perf_archtype} @var{arch}, unsigned @var{nimpl})
- Returns expected task duration in µs
- @end deftypefun
- @deftypefun double starpu_worker_get_relative_speedup ({enum starpu_perf_archtype} @var{perf_archtype})
- Returns an estimated speedup factor relative to CPU speed
- @end deftypefun
- @deftypefun double starpu_task_expected_data_transfer_time (uint32_t @var{memory_node}, {struct starpu_task *}@var{task})
- Returns expected data transfer time in µs
- @end deftypefun
- @deftypefun double starpu_data_expected_transfer_time (starpu_data_handle_t @var{handle}, unsigned @var{memory_node}, {enum starpu_access_mode} @var{mode})
- Predict the transfer time (in µs) to move a handle to a memory node
- @end deftypefun
- @deftypefun double starpu_task_expected_power ({struct starpu_task *}@var{task}, {enum starpu_perf_archtype} @var{arch}, unsigned @var{nimpl})
- Returns expected power consumption in J
- @end deftypefun
- @deftypefun double starpu_task_expected_conversion_time ({struct starpu_task *}@var{task}, {enum starpu_perf_archtype} @var{arch}, unsigned {nimpl})
- Returns expected conversion time in ms (multiformat interface only)
- @end deftypefun
- @node Source code
- @subsection Source code
- @cartouche
- @smallexample
- static struct starpu_sched_policy dummy_sched_policy = @{
- .init_sched = init_dummy_sched,
- .deinit_sched = deinit_dummy_sched,
- .push_task = push_task_dummy,
- .push_prio_task = NULL,
- .pop_task = pop_task_dummy,
- .post_exec_hook = NULL,
- .pop_every_task = NULL,
- .policy_name = "dummy",
- .policy_description = "dummy scheduling strategy"
- @};
- @end smallexample
- @end cartouche
- @node Running drivers
- @section Running drivers
- @menu
- * Driver API::
- * Example::
- @end menu
- @node Driver API
- @subsection Driver API
- @deftypefun int starpu_driver_run ({struct starpu_driver *}@var{d})
- Initialize the given driver, run it until it receives a request to terminate,
- deinitialize it and return 0 on success. It returns -EINVAL if @code{d->type}
- is not a valid StarPU device type (STARPU_CPU_WORKER, STARPU_CUDA_WORKER or
- STARPU_OPENCL_WORKER). This is the same as using the following
- functions: calling @code{starpu_driver_init()}, then calling
- @code{starpu_driver_run_once()} in a loop, and eventually
- @code{starpu_driver_deinit()}.
- @end deftypefun
- @deftypefun int starpu_driver_init (struct starpu_driver *@var{d})
- Initialize the given driver. Returns 0 on success, -EINVAL if
- @code{d->type} is not a valid StarPU device type (STARPU_CPU_WORKER,
- STARPU_CUDA_WORKER or STARPU_OPENCL_WORKER).
- @end deftypefun
- @deftypefun int starpu_driver_run_once (struct starpu_driver *@var{d})
- Run the driver once, then returns 0 on success, -EINVAL if
- @code{d->type} is not a valid StarPU device type (STARPU_CPU_WORKER,
- STARPU_CUDA_WORKER or STARPU_OPENCL_WORKER).
- @end deftypefun
- @deftypefun int starpu_driver_deinit (struct starpu_driver *@var{d})
- Deinitialize the given driver. Returns 0 on success, -EINVAL if
- @code{d->type} is not a valid StarPU device type (STARPU_CPU_WORKER,
- STARPU_CUDA_WORKER or STARPU_OPENCL_WORKER).
- @end deftypefun
- @deftypefun void starpu_drivers_request_termination (void)
- Notify all running drivers they should terminate.
- @end deftypefun
- @node Example
- @subsection Example
- @cartouche
- @smallexample
- int ret;
- struct starpu_driver = @{
- .type = STARPU_CUDA_WORKER,
- .id.cuda_id = 0
- @};
- ret = starpu_driver_init(&d);
- if (ret != 0)
- error();
- while (some_condition) @{
- ret = starpu_driver_run_once(&d);
- if (ret != 0)
- error();
- @}
- ret = starpu_driver_deinit(&d);
- if (ret != 0)
- error();
- @end smallexample
- @end cartouche
- @node Expert mode
- @section Expert mode
- @deftypefun void starpu_wake_all_blocked_workers (void)
- Wake all the workers, so they can inspect data requests and task submissions
- again.
- @end deftypefun
- @deftypefun int starpu_progression_hook_register (unsigned (*@var{func})(void *arg), void *@var{arg})
- Register a progression hook, to be called when workers are idle.
- @end deftypefun
- @deftypefun void starpu_progression_hook_deregister (int @var{hook_id})
- Unregister a given progression hook.
- @end deftypefun
|