浏览代码

Add STARPU_RAND_SEED to set the seed used for random numbers

Samuel Thibault 10 年之前
父节点
当前提交
96cadc8c62
共有 3 个文件被更改,包括 24 次插入5 次删除
  1. 2 0
      ChangeLog
  2. 10 0
      doc/doxygen/chapters/40environment_variables.doxy
  3. 12 5
      include/starpu_rand.h

+ 2 - 0
ChangeLog

@@ -152,6 +152,8 @@ New features:
 Small features:
   * Add starpu_memory_wait_available() to wait for a given size to become
     available on a given node.
+  * New environment variable STARPU_RAND_SEED to set the seed used for random
+    numbers.
 
 Changes:
   * Fix complexity of implicit task/data dependency, from quadratic to linear.

+ 10 - 0
doc/doxygen/chapters/40environment_variables.doxy

@@ -726,6 +726,16 @@ froom the measured average. This specifies the allowed variation. The default is
 average.
 </dd>
 
+<dt>STARPU_RAND_SEED</dt>
+<dd>
+\anchor STARPU_RAND_SEED
+\addindex __env__STARPU_RAND_SEED
+The random scheduler and some examples use random numbers for their own
+working. Depending on the examples, the seed is by default juste always 0 or
+the current time() (unless simgrid mode is enabled, in which case it is always
+0). STARPU_RAND_SEED allows to set the seed to a specific value.
+</dd>
+
 </dl>
 
 \section ConfiguringTheHypervisor Configuring The Hypervisor

+ 12 - 5
include/starpu_rand.h

@@ -25,25 +25,32 @@ extern "C"
 {
 #endif
 
+#ifdef STARPU_SIMGRID
+/* In simgrid mode, force using seed 0 by default to get reproducible behavior by default */
+#define starpu_seed(seed)				starpu_get_env_number_default("STARPU_RAND_SEED", 0)
+#else
+#define starpu_seed(seed)				starpu_get_env_number_default("STARPU_RAND_SEED", (seed))
+#endif
+
 #ifdef STARPU_USE_DRAND48
-#  define starpu_srand48(seed)				srand48(seed)
+#  define starpu_srand48(seed)				srand48(starpu_seed(seed))
 #  define starpu_drand48()				drand48()
 #  define starpu_erand48(xsubi)				erand48(xsubi)
 #  ifdef STARPU_USE_ERAND48_R
 typedef struct drand48_data starpu_drand48_data;
-#    define starpu_srand48_r(seed, buffer)		srand48_r(seed, buffer)
+#    define starpu_srand48_r(seed, buffer)		srand48_r(starpu_seed(seed), buffer)
 #    define starpu_erand48_r(xsubi, buffer, result)	erand48_r(xsubi, buffer, result)
 #else
 typedef int starpu_drand48_data;
-#    define starpu_srand48_r(seed, buffer)		srand48(seed)
+#    define starpu_srand48_r(seed, buffer)		srand48(starpu_seed(seed))
 #    define starpu_erand48_r(xsubi, buffer, result)	do {*(result) = erand48(xsubi); } while (0)
 #  endif
 #else
 typedef int starpu_drand48_data;
-#  define starpu_srand48(seed)				srand(seed)
+#  define starpu_srand48(seed)				srand(starpu_seed(seed))
 #  define starpu_drand48() 				(double)(rand()) / RAND_MAX
 #  define starpu_erand48(xsubi)				starpu_drand48()
-#  define starpu_srand48_r(seed, buffer) 		srand((unsigned int)seed)
+#  define starpu_srand48_r(seed, buffer) 		srand(starpu_seed(seed))
 #  define starpu_erand48_r(xsubi, buffer, result)	do {*(result) = ((double)(rand()) / RAND_MAX);} while (0)
 #endif