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:
parent
59921b4b3f
commit
367f4a4343
@ -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
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user