threaded delta search: specify number of threads at run time

This adds a --threads=<n> parameter to 'git pack-objects' with
documentation.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nicolas Pitre 2007-09-10 00:06:11 -04:00 committed by Junio C Hamano
parent 59921b4b3f
commit 367f4a4343
2 changed files with 29 additions and 5 deletions

View File

@ -173,6 +173,14 @@ base-name::
length, this option typically shrinks the resulting length, this option typically shrinks the resulting
packfile by 3-5 per-cent. packfile by 3-5 per-cent.
--threads=<n>::
Specifies the number of threads to spawn when searching for best
delta matches. This requires that pack-objects be compiled with
pthreads otherwise this option is ignored with a warning.
This is meant to reduce packing time on multiprocessor machines.
The required amount of memory for the delta search window is
however multiplied by the number of threads.
--index-version=<version>[,<offset>]:: --index-version=<version>[,<offset>]::
This is intended to be used by the test suite only. It allows This is intended to be used by the test suite only. It allows
to force the version for the generated pack index, and to force to force the version for the generated pack index, and to force

View File

@ -24,7 +24,7 @@ git-pack-objects [{ -q | --progress | --all-progress }] \n\
[--max-pack-size=N] [--local] [--incremental] \n\ [--max-pack-size=N] [--local] [--incremental] \n\
[--window=N] [--window-memory=N] [--depth=N] \n\ [--window=N] [--window-memory=N] [--depth=N] \n\
[--no-reuse-delta] [--no-reuse-object] [--delta-base-offset] \n\ [--no-reuse-delta] [--no-reuse-object] [--delta-base-offset] \n\
[--non-empty] [--revs [--unpacked | --all]*] [--reflog] \n\ [--threads=N] [--non-empty] [--revs [--unpacked | --all]*] [--reflog] \n\
[--stdout | base-name] [<ref-list | <object-list]"; [--stdout | base-name] [<ref-list | <object-list]";
struct object_entry { struct object_entry {
@ -72,6 +72,7 @@ static int progress = 1;
static int window = 10; static int window = 10;
static uint32_t pack_size_limit; static uint32_t pack_size_limit;
static int depth = 50; static int depth = 50;
static int delta_search_threads = 1;
static int pack_to_stdout; static int pack_to_stdout;
static int num_preferred_base; static int num_preferred_base;
static struct progress progress_state; static struct progress progress_state;
@ -1605,19 +1606,22 @@ static void *threaded_find_deltas(void *arg)
} }
} }
#define NR_THREADS 4
static void ll_find_deltas(struct object_entry **list, unsigned list_size, static void ll_find_deltas(struct object_entry **list, unsigned list_size,
int window, int depth, unsigned *processed) int window, int depth, unsigned *processed)
{ {
struct thread_params p[NR_THREADS]; struct thread_params p[delta_search_threads];
int i, ret; int i, ret;
unsigned chunk_size; unsigned chunk_size;
if (delta_search_threads <= 1) {
find_deltas(list, list_size, window, depth, processed);
return;
}
pthread_mutex_lock(&data_provider); pthread_mutex_lock(&data_provider);
pthread_mutex_lock(&data_ready); pthread_mutex_lock(&data_ready);
for (i = 0; i < NR_THREADS; i++) { for (i = 0; i < delta_search_threads; i++) {
p[i].window = window; p[i].window = window;
p[i].depth = depth; p[i].depth = depth;
p[i].processed = processed; p[i].processed = processed;
@ -1900,6 +1904,18 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
usage(pack_usage); usage(pack_usage);
continue; continue;
} }
if (!prefixcmp(arg, "--threads=")) {
char *end;
delta_search_threads = strtoul(arg+10, &end, 0);
if (!arg[10] || *end || delta_search_threads < 1)
usage(pack_usage);
#ifndef THREADED_DELTA_SEARCH
if (delta_search_threads > 1)
warning("no threads support, "
"ignoring %s", arg);
#endif
continue;
}
if (!prefixcmp(arg, "--depth=")) { if (!prefixcmp(arg, "--depth=")) {
char *end; char *end;
depth = strtoul(arg+8, &end, 0); depth = strtoul(arg+8, &end, 0);