<variablelist>
<varlistentry>
- <term><option>-N<replaceable>x</replaceable></option></term>
+ <term><option>-N<optional><replaceable>x</replaceable></optional></option></term>
<listitem>
<para><indexterm><primary><option>-N<replaceable>x</replaceable></option></primary><secondary>RTS option</secondary></indexterm>
Use <replaceable>x</replaceable> simultaneous threads when
on a dual-core machine we would probably use
<literal>+RTS -N2 -RTS</literal>.</para>
+ <para>Omitting <replaceable>x</replaceable>,
+ i.e. <literal>+RTS -N -RTS</literal>, lets the runtime
+ choose the value of <replaceable>x</replaceable> itself
+ based on how many processors are in your machine.</para>
+
+ <para>Be careful when using all the processors in your
+ machine: if some of your processors are in use by other
+ programs, this can actually harm performance rather than
+ improve it.</para>
+
<para>Setting <option>-N</option> also has the effect of
- setting <option>-g</option> (the number of OS threads to
- use for garbage collection) to the same value.</para>
+ enabling the parallel garbage collector (see
+ <xref linkend="rts-options-gc" />).</para>
<para>There is no means (currently) by which this value
may vary after the program has started.</para>
#include <ctype.h>
#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+
#include <stdlib.h>
#include <string.h>
"",
#endif /* DEBUG */
#if defined(THREADED_RTS) && !defined(NOSMP)
-" -N<n> Use <n> OS threads (default: 1)",
+" -N<n> Use <n> processors (default: 1)",
+" -N Determine the number of processors to use automatically",
" -q1 Use one OS thread for GC (turns off parallel GC)",
" -qg<n> Use parallel GC only for generations >= <n> (default: 1)",
" -qm Don't automatically migrate threads between CPUs",
#if defined(THREADED_RTS) && !defined(NOSMP)
case 'N':
THREADED_BUILD_ONLY(
- if (rts_argv[arg][2] != '\0') {
+ if (rts_argv[arg][2] == '\0') {
+#if defined(PROFILING)
+ RtsFlags.ParFlags.nNodes = 1;
+#else
+#if defined(mingw32_HOST_OS)
+ {
+ SYSTEM_INFO si;
+ GetSystemInfo(&si);
+ RtsFlags.ParFlags.nNodes = si.dwNumberOfProcessors;
+ }
+#elif defined(HAVE_SYSCONF)
+ RtsFlags.ParFlags.nNodes = sysconf(_SC_NPROCESSORS_CONF);
+#else
+ RtsFlags.ParFlags.nNodes = 1;
+#endif
+#endif
+ } else {
RtsFlags.ParFlags.nNodes
= strtol(rts_argv[arg]+2, (char **) NULL, 10);
if (RtsFlags.ParFlags.nNodes <= 0) {