StarPU Handbook - StarPU Basics
starpu_rand.h
Go to the documentation of this file.
1/* StarPU --- Runtime system for heterogeneous multicore architectures.
2 *
3 * Copyright (C) 2012-2022 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
4 *
5 * StarPU is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published by
7 * the Free Software Foundation; either version 2.1 of the License, or (at
8 * your option) any later version.
9 *
10 * StarPU is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 *
14 * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15 */
16
17#ifndef __STARPU_RAND_H__
18#define __STARPU_RAND_H__
19
20#include <stdlib.h>
21#include <starpu_config.h>
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
32#ifdef STARPU_SIMGRID
33/* In simgrid mode, force using seed 0 by default to get reproducible behavior by default */
34#define starpu_seed(seed) starpu_getenv_number_default("STARPU_RAND_SEED", 0)
35#else
36#define starpu_seed(seed) starpu_getenv_number_default("STARPU_RAND_SEED", (seed))
37#endif
38
39#ifdef STARPU_USE_DRAND48
40#define starpu_srand48(seed) srand48(starpu_seed(seed))
41#define starpu_drand48() drand48()
42#define starpu_lrand48() lrand48()
43#define starpu_erand48(xsubi) erand48(xsubi)
44#ifdef STARPU_USE_ERAND48_R
45typedef struct drand48_data starpu_drand48_data;
46#define starpu_srand48_r(seed, buffer) srand48_r(starpu_seed(seed), buffer)
47#define starpu_drand48_r(buffer, result) drand48_r(buffer, result)
48#define starpu_lrand48_r(buffer, result) lrand48_r(buffer, result)
49#define starpu_erand48_r(xsubi, buffer, result) erand48_r(xsubi, buffer, result)
50#else
51typedef int starpu_drand48_data;
52#define starpu_srand48_r(seed, buffer) srand48(starpu_seed(seed))
53#define starpu_drand48_r(buffer, result) \
54 do { \
55 *(result) = drand48(); \
56 } \
57 while (0)
58#define starpu_lrand48_r(buffer, result) \
59 do { \
60 *(result) = lrand48(); \
61 } \
62 while (0)
63#define starpu_erand48_r(xsubi, buffer, result) \
64 do { \
65 (void)buffer; \
66 *(result) = erand48(xsubi); \
67 } \
68 while (0)
69#endif
70#else
71typedef int starpu_drand48_data;
72#define starpu_srand48(seed) srand(starpu_seed(seed))
73#define starpu_drand48() (double)(rand()) / RAND_MAX
74#define starpu_lrand48() rand()
75#define starpu_erand48(xsubi) starpu_drand48()
76#define starpu_srand48_r(seed, buffer) srand(starpu_seed(seed))
77#define starpu_erand48_r(xsubi, buffer, result) \
78 do { \
79 (void)xsubi; \
80 (void)buffer; \
81 *(result) = ((double)(rand()) / RAND_MAX); \
82 } \
83 while (0)
84#endif
85
88#ifdef __cplusplus
89}
90#endif
91
92#endif /* __STARPU_RAND_H__ */