1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- @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, 2013 Centre National de la Recherche Scientifique
- @c Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique
- @c See the file starpu.texi for copying conditions.
- @menu
- * Per-worker library initialization:: How to initialize a computation library once for each worker?
- * Limit memory::
- @end menu
- @node Per-worker library initialization
- @section How to initialize a computation library once for each worker?
- Some libraries need to be initialized once for each concurrent instance that
- may run on the machine. For instance, a C++ computation class which is not
- thread-safe by itself, but for which several instanciated objects of that class
- can be used concurrently. This can be used in StarPU by initializing one such
- object per worker. For instance, the libstarpufft example does the following to
- be able to use FFTW.
- Some global array stores the instanciated objects:
- @cartouche
- @smallexample
- fftw_plan plan_cpu[STARPU_NMAXWORKERS];
- @end smallexample
- @end cartouche
- At initialisation time of libstarpu, the objects are initialized:
- @cartouche
- @smallexample
- int workerid;
- for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) @{
- switch (starpu_worker_get_type(workerid)) @{
- case STARPU_CPU_WORKER:
- plan_cpu[workerid] = fftw_plan(...);
- break;
- @}
- @}
- @end smallexample
- @end cartouche
- And in the codelet body, they are used:
- @cartouche
- @smallexample
- static void fft(void *descr[], void *_args)
- @{
- int workerid = starpu_worker_get_id();
- fftw_plan plan = plan_cpu[workerid];
- ...
- fftw_execute(plan, ...);
- @}
- @end smallexample
- @end cartouche
- Another way to go which may be needed is to execute some code from the workers
- themselves thanks to @code{starpu_execute_on_each_worker}. This may be required
- by CUDA to behave properly due to threading issues. For instance, StarPU's
- @code{starpu_cublas_init} looks like the following to call
- @code{cublasInit} from the workers themselves:
- @cartouche
- @smallexample
- static void init_cublas_func(void *args STARPU_ATTRIBUTE_UNUSED)
- @{
- cublasStatus cublasst = cublasInit();
- cublasSetKernelStream(starpu_cuda_get_local_stream());
- @}
- void starpu_cublas_init(void)
- @{
- starpu_execute_on_each_worker(init_cublas_func, NULL, STARPU_CUDA);
- @}
- @end smallexample
- @end cartouche
- @node Limit memory
- @section How to limit memory per node
- TODO
- Talk about
- @code{STARPU_LIMIT_CUDA_devid_MEM}, @code{STARPU_LIMIT_CUDA_MEM},
- @code{STARPU_LIMIT_OPENCL_devid_MEM}, @code{STARPU_LIMIT_OPENCL_MEM}
- and @code{STARPU_LIMIT_CPU_MEM}
|