| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | 
							- @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::
 
- * Thread Binding on NetBSD::
 
- @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}
 
- @code{starpu_memory_get_available}
 
- @node Thread Binding on NetBSD
 
- @section Thread Binding on NetBSD
 
- When using StarPU on a NetBSD machine, if the topology
 
- discovery library @code{hwloc} is used, thread binding will fail. To
 
- prevent the problem, you should at least use the version 1.7 of
 
- @code{hwloc}, and also issue the following call:
 
- @example
 
- $ sysctl -w security.models.extensions.user_set_cpu_affinity=1
 
- @end example
 
- Or add the following line in the file @code{/etc/sysctl.conf}
 
- @example
 
- security.models.extensions.user_set_cpu_affinity=1
 
- @end example
 
 
  |