Browse Source

Add STARPU_MAIN_THREAD_BIND environment variable to easily bind main()

Samuel Thibault 6 years ago
parent
commit
6dbc420879
3 changed files with 28 additions and 2 deletions
  1. 2 0
      ChangeLog
  2. 11 1
      doc/doxygen/chapters/501_environment_variables.doxy
  3. 15 1
      src/core/workers.c

+ 2 - 0
ChangeLog

@@ -65,6 +65,8 @@ New features:
   * Add STARPU_RESERVE_NCPU environment variable and
     starpu_config::reserve_ncpus field to make StarPU use a few cores
     less.
+  * Add STARPU_MAIN_THREAD_BIND environment variable to make StarPU reserve a
+    core for the main thread.
 
 Small features:
   * Scheduling contexts may now be associated a user data pointer at creation

+ 11 - 1
doc/doxygen/chapters/501_environment_variables.doxy

@@ -228,6 +228,14 @@ set.
 
 </dd>
 
+<dt>STARPU_MAIN_THREAD_BIND</dt>
+<dd>
+\anchor STARPU_MAIN_THREAD_BIND
+\addindex __env__STARPU_MAIN_THREAD_BIND
+When defined, this make StarPU bind the thread that calls starpu_initialize() to
+a reserved CPU, subtracted from the CPU workers.
+</dd>
+
 <dt>STARPU_MAIN_THREAD_CPUID</dt>
 <dd>
 \anchor STARPU_MAIN_THREAD_CPUID
@@ -240,7 +248,9 @@ the given CPU ID.
 <dd>
 \anchor STARPU_MPI_THREAD_CPUID
 \addindex __env__STARPU_MPI_THREAD_CPUID
-When defined, this make StarPU bind its MPI thread to the given CPU ID.
+When defined, this make StarPU bind its MPI thread to the given CPU ID. Setting
+it to -1 (the default value) will use a reserved CPU, subtracted from the CPU
+workers.
 </dd>
 
 <dt>STARPU_WORKERS_CUDAID</dt>

+ 15 - 1
src/core/workers.c

@@ -982,6 +982,9 @@ int starpu_conf_init(struct starpu_conf *conf)
 	if (conf->ncpus == -1)
 		conf->ncpus = starpu_get_env_number("STARPU_NCPUS");
 	conf->reserve_ncpus = starpu_get_env_number("STARPU_RESERVE_NCPU");
+	int main_thread_bind = starpu_get_env_number_default("STARPU_MAIN_THREAD_BIND", 0);
+	if (main_thread_bind)
+		conf->reserve_ncpus++;
 	conf->ncuda = starpu_get_env_number("STARPU_NCUDA");
 	conf->nopencl = starpu_get_env_number("STARPU_NOPENCL");
 	conf->nmic = starpu_get_env_number("STARPU_NMIC");
@@ -1074,6 +1077,9 @@ void _starpu_conf_check_environment(struct starpu_conf *conf)
 	_starpu_conf_set_value_against_environment("STARPU_NCPUS", &conf->ncpus);
 	_starpu_conf_set_value_against_environment("STARPU_NCPU", &conf->ncpus);
 	_starpu_conf_set_value_against_environment("STARPU_RESERVE_NCPU", &conf->reserve_ncpus);
+	int main_thread_bind = starpu_get_env_number_default("STARPU_MAIN_THREAD_BIND", 0);
+	if (main_thread_bind)
+		conf->reserve_ncpus++;
 	_starpu_conf_set_value_against_environment("STARPU_NCUDA", &conf->ncuda);
 	_starpu_conf_set_value_against_environment("STARPU_NOPENCL", &conf->nopencl);
 	_starpu_conf_set_value_against_environment("STARPU_CALIBRATE", &conf->calibrate);
@@ -1474,8 +1480,16 @@ int starpu_initialize(struct starpu_conf *user_conf, int *argc, char ***argv)
 	STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex);
 
 	int main_thread_cpuid = starpu_get_env_number_default("STARPU_MAIN_THREAD_CPUID", -1);
+	int main_thread_bind = starpu_get_env_number_default("STARPU_MAIN_THREAD_BIND", 0);
+	int main_thread_activity = STARPU_NONACTIVETHREAD;
+	if (main_thread_bind)
+	{
+		main_thread_activity = STARPU_ACTIVETHREAD;
+		if (main_thread_cpuid == -1)
+			main_thread_cpuid = starpu_get_next_bindid(STARPU_THREAD_ACTIVE, NULL, 0);
+	}
 	if (main_thread_cpuid >= 0)
-		_starpu_bind_thread_on_cpu(main_thread_cpuid, STARPU_NONACTIVETHREAD, "main");
+		_starpu_bind_thread_on_cpu(main_thread_cpuid, main_thread_activity, "main");
 
 	_STARPU_DEBUG("Initialisation finished\n");