summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2010-12-18 05:27:46 +0000
committerPádraig Brady <P@draigBrady.com>2010-12-19 00:33:45 +0000
commit0e181024c00b746a930aab6a0cfd9162d7b67ae4 (patch)
tree994336fac3c2c31ab31fa7b1b8700eb12c114243 /src
parenteea8e7530bf3c469dd7f4e598c993ff7fb4574e9 (diff)
downloadcoreutils-0e181024c00b746a930aab6a0cfd9162d7b67ae4.tar.xz
sort: use at most 8 threads by default
* src/sort.c (main): If --parallel isn't specified, restrict the number of threads to 8 by default. If the --parallel option is specified, then allow any number of threads to be set, independent of the number of processors on the system. * doc/coreutils.texi (sort invocation): Document the changes to determining the number of threads to use. Mention the memory overhead when using multiple threads. * tests/misc/sort-spinlock-abuse: Allow single core systems that support pthreads. * tests/misc/sort-stale-thread-mem: Likewise. * tests/misc/sort-unique-segv: Likewise. * NEWS: Mention the change in behaviour.
Diffstat (limited to 'src')
-rw-r--r--src/sort.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/sort.c b/src/sort.c
index 54dd81528..6cc058896 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -116,6 +116,10 @@ struct rlimit { size_t rlim_cur; };
this number has any practical effect. */
enum { SUBTHREAD_LINES_HEURISTIC = 4 };
+/* The number of threads after which there are
+ diminishing performance gains. */
+enum { DEFAULT_MAX_THREADS = 8 };
+
/* Exit statuses. */
enum
{
@@ -455,7 +459,7 @@ Other options:\n\
-t, --field-separator=SEP use SEP instead of non-blank to blank transition\n\
-T, --temporary-directory=DIR use DIR for temporaries, not $TMPDIR or %s;\n\
multiple options specify multiple directories\n\
- --parallel=N limit the number of sorts run concurrently to N\n\
+ --parallel=N change the number sorts run concurrently to N\n\
-u, --unique with -c, check for strict ordering;\n\
without -c, output only the first of an equal run\n\
"), DEFAULT_TMPDIR);
@@ -4595,14 +4599,15 @@ main (int argc, char **argv)
}
else
{
- unsigned long int np2 = num_processors (NPROC_CURRENT_OVERRIDABLE);
- if (!nthreads || nthreads > np2)
- nthreads = np2;
+ if (!nthreads)
+ {
+ nthreads = MIN (DEFAULT_MAX_THREADS,
+ num_processors (NPROC_CURRENT_OVERRIDABLE));
+ }
/* Avoid integer overflow later. */
size_t nthreads_max = SIZE_MAX / (2 * sizeof (struct merge_node));
- if (nthreads_max < nthreads)
- nthreads = nthreads_max;
+ nthreads = MIN (nthreads, nthreads_max);
sort (files, nfiles, outfile, nthreads);
}