Add "+RTS -N" to determine the -N value automatically (see #1741)
authorSimon Marlow <marlowsd@gmail.com>
Fri, 13 Mar 2009 11:46:46 +0000 (11:46 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 13 Mar 2009 11:46:46 +0000 (11:46 +0000)
docs/users_guide/using.xml
rts/RtsFlags.c

index 20bb687..f769d28 100644 (file)
@@ -1834,7 +1834,7 @@ f "2"    = 2
 
       <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
@@ -1846,9 +1846,19 @@ f "2"    = 2
              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>
index 8690040..cbc2bb5 100644 (file)
 #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>
 
@@ -454,7 +462,8 @@ usage_text[] = {
 "",
 #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",
@@ -1138,7 +1147,23 @@ error = rtsTrue;
 #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) {