Commit 3b5940fd authored by Simon Marlow's avatar Simon Marlow
Browse files

Add "+RTS -N" to determine the -N value automatically (see #1741)

parent 8815f0c0
...@@ -1834,7 +1834,7 @@ f "2" = 2 ...@@ -1834,7 +1834,7 @@ f "2" = 2
<variablelist> <variablelist>
<varlistentry> <varlistentry>
<term><option>-N<replaceable>x</replaceable></option></term> <term><option>-N<optional><replaceable>x</replaceable></optional></option></term>
<listitem> <listitem>
<para><indexterm><primary><option>-N<replaceable>x</replaceable></option></primary><secondary>RTS option</secondary></indexterm> <para><indexterm><primary><option>-N<replaceable>x</replaceable></option></primary><secondary>RTS option</secondary></indexterm>
Use <replaceable>x</replaceable> simultaneous threads when Use <replaceable>x</replaceable> simultaneous threads when
...@@ -1846,9 +1846,19 @@ f "2" = 2 ...@@ -1846,9 +1846,19 @@ f "2" = 2
on a dual-core machine we would probably use on a dual-core machine we would probably use
<literal>+RTS -N2 -RTS</literal>.</para> <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 <para>Setting <option>-N</option> also has the effect of
setting <option>-g</option> (the number of OS threads to enabling the parallel garbage collector (see
use for garbage collection) to the same value.</para> <xref linkend="rts-options-gc" />).</para>
<para>There is no means (currently) by which this value <para>There is no means (currently) by which this value
may vary after the program has started.</para> may vary after the program has started.</para>
......
...@@ -17,6 +17,14 @@ ...@@ -17,6 +17,14 @@
#include <ctype.h> #include <ctype.h>
#endif #endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_WINDOWS_H
#include <windows.h>
#endif
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
...@@ -454,7 +462,8 @@ usage_text[] = { ...@@ -454,7 +462,8 @@ usage_text[] = {
"", "",
#endif /* DEBUG */ #endif /* DEBUG */
#if defined(THREADED_RTS) && !defined(NOSMP) #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)", " -q1 Use one OS thread for GC (turns off parallel GC)",
" -qg<n> Use parallel GC only for generations >= <n> (default: 1)", " -qg<n> Use parallel GC only for generations >= <n> (default: 1)",
" -qm Don't automatically migrate threads between CPUs", " -qm Don't automatically migrate threads between CPUs",
...@@ -1138,7 +1147,23 @@ error = rtsTrue; ...@@ -1138,7 +1147,23 @@ error = rtsTrue;
#if defined(THREADED_RTS) && !defined(NOSMP) #if defined(THREADED_RTS) && !defined(NOSMP)
case 'N': case 'N':
THREADED_BUILD_ONLY( 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 RtsFlags.ParFlags.nNodes
= strtol(rts_argv[arg]+2, (char **) NULL, 10); = strtol(rts_argv[arg]+2, (char **) NULL, 10);
if (RtsFlags.ParFlags.nNodes <= 0) { if (RtsFlags.ParFlags.nNodes <= 0) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment