r508: use two I/O threads for mapping
-x sr applies this option by default
This commit is contained in:
parent
2801ed9b4b
commit
7c555f9b7e
5
main.c
5
main.c
|
|
@ -6,7 +6,7 @@
|
||||||
#include "mmpriv.h"
|
#include "mmpriv.h"
|
||||||
#include "getopt.h"
|
#include "getopt.h"
|
||||||
|
|
||||||
#define MM_VERSION "2.2-r507-dirty"
|
#define MM_VERSION "2.2-r508-dirty"
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
|
|
@ -65,7 +65,7 @@ static inline int64_t mm_parse_num(const char *str)
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
const char *opt_str = "aSw:k:K:t:r:f:Vv:g:G:I:d:XT:s:x:Hcp:M:n:z:A:B:O:E:m:N:Qu:R:hF:";
|
const char *opt_str = "2aSw:k:K:t:r:f:Vv:g:G:I:d:XT:s:x:Hcp:M:n:z:A:B:O:E:m:N:Qu:R:hF:";
|
||||||
mm_mapopt_t opt;
|
mm_mapopt_t opt;
|
||||||
mm_idxopt_t ipt;
|
mm_idxopt_t ipt;
|
||||||
int i, c, n_threads = 3, long_idx, max_gap_ref = 0;
|
int i, c, n_threads = 3, long_idx, max_gap_ref = 0;
|
||||||
|
|
@ -118,6 +118,7 @@ int main(int argc, char *argv[])
|
||||||
else if (c == 'K') opt.mini_batch_size = (int)mm_parse_num(optarg);
|
else if (c == 'K') opt.mini_batch_size = (int)mm_parse_num(optarg);
|
||||||
else if (c == 'R') rg = optarg;
|
else if (c == 'R') rg = optarg;
|
||||||
else if (c == 'h') fp_help = stdout;
|
else if (c == 'h') fp_help = stdout;
|
||||||
|
else if (c == '2') opt.flag |= MM_F_2_IO_THREADS;
|
||||||
else if (c == 0 && long_idx == 0) ipt.bucket_bits = atoi(optarg); // --bucket-bits
|
else if (c == 0 && long_idx == 0) ipt.bucket_bits = atoi(optarg); // --bucket-bits
|
||||||
else if (c == 0 && long_idx == 2) opt.seed = atoi(optarg); // --seed
|
else if (c == 0 && long_idx == 2) opt.seed = atoi(optarg); // --seed
|
||||||
else if (c == 0 && long_idx == 3) mm_dbg_flag |= MM_DBG_NO_KALLOC; // --no-kalloc
|
else if (c == 0 && long_idx == 3) mm_dbg_flag |= MM_DBG_NO_KALLOC; // --no-kalloc
|
||||||
|
|
|
||||||
7
map.c
7
map.c
|
|
@ -83,7 +83,7 @@ int mm_set_opt(const char *preset, mm_idxopt_t *io, mm_mapopt_t *mo)
|
||||||
mo->best_n = 50;
|
mo->best_n = 50;
|
||||||
} else if (strcmp(preset, "short") == 0 || strcmp(preset, "sr") == 0) {
|
} else if (strcmp(preset, "short") == 0 || strcmp(preset, "sr") == 0) {
|
||||||
io->is_hpc = 0, io->k = 21, io->w = 11;
|
io->is_hpc = 0, io->k = 21, io->w = 11;
|
||||||
mo->flag |= MM_F_SR | MM_F_FRAG_MODE | MM_F_NO_PRINT_2ND;
|
mo->flag |= MM_F_SR | MM_F_FRAG_MODE | MM_F_NO_PRINT_2ND | MM_F_2_IO_THREADS;
|
||||||
mo->pe_ori = 0<<1|1; // FR
|
mo->pe_ori = 0<<1|1; // FR
|
||||||
mo->a = 2, mo->b = 8, mo->q = 12, mo->e = 2, mo->q2 = 32, mo->e2 = 1;
|
mo->a = 2, mo->b = 8, mo->q = 12, mo->e = 2, mo->q2 = 32, mo->e2 = 1;
|
||||||
mo->zdrop = 100;
|
mo->zdrop = 100;
|
||||||
|
|
@ -500,7 +500,7 @@ static void *worker_pipeline(void *shared, int step, void *in)
|
||||||
|
|
||||||
int mm_map_file_frag(const mm_idx_t *idx, int n_segs, const char **fn, const mm_mapopt_t *opt, int n_threads)
|
int mm_map_file_frag(const mm_idx_t *idx, int n_segs, const char **fn, const mm_mapopt_t *opt, int n_threads)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j, pl_threads;
|
||||||
pipeline_t pl;
|
pipeline_t pl;
|
||||||
if (n_segs < 1) return -1;
|
if (n_segs < 1) return -1;
|
||||||
memset(&pl, 0, sizeof(pipeline_t));
|
memset(&pl, 0, sizeof(pipeline_t));
|
||||||
|
|
@ -520,7 +520,8 @@ int mm_map_file_frag(const mm_idx_t *idx, int n_segs, const char **fn, const mm_
|
||||||
pl.opt = opt, pl.mi = idx;
|
pl.opt = opt, pl.mi = idx;
|
||||||
pl.n_threads = n_threads > 1? n_threads : 1;
|
pl.n_threads = n_threads > 1? n_threads : 1;
|
||||||
pl.mini_batch_size = opt->mini_batch_size;
|
pl.mini_batch_size = opt->mini_batch_size;
|
||||||
kt_pipeline(n_threads == 1? 1 : 2, worker_pipeline, &pl, 3);
|
pl_threads = n_threads == 1? 1 : (opt->flag&MM_F_2_IO_THREADS)? 3 : 2;
|
||||||
|
kt_pipeline(pl_threads, worker_pipeline, &pl, 3);
|
||||||
free(pl.str.s);
|
free(pl.str.s);
|
||||||
for (i = 0; i < n_segs; ++i)
|
for (i = 0; i < n_segs; ++i)
|
||||||
mm_bseq_close(pl.fp[i]);
|
mm_bseq_close(pl.fp[i]);
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
#define MM_F_SR 0x1000
|
#define MM_F_SR 0x1000
|
||||||
#define MM_F_FRAG_MODE 0x2000
|
#define MM_F_FRAG_MODE 0x2000
|
||||||
#define MM_F_NO_PRINT_2ND 0x4000
|
#define MM_F_NO_PRINT_2ND 0x4000
|
||||||
|
#define MM_F_2_IO_THREADS 0x8000
|
||||||
|
|
||||||
#define MM_IDX_MAGIC "MMI\2"
|
#define MM_IDX_MAGIC "MMI\2"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -256,6 +256,12 @@ sequences, and uses up to
|
||||||
threads when mapping (the extra thread is for I/O, which is frequently idle and
|
threads when mapping (the extra thread is for I/O, which is frequently idle and
|
||||||
takes little CPU time).
|
takes little CPU time).
|
||||||
.TP
|
.TP
|
||||||
|
.B -2
|
||||||
|
Use two I/O threads during mapping. By default, minimap2 uses one I/O thread.
|
||||||
|
When I/O is slow (e.g. piping to gzip, or reading from a slow pipe), the I/O
|
||||||
|
thread may become the bottleneck. Apply this option to use one thread for input
|
||||||
|
and another thread for output, at the cost of increased peak RAM.
|
||||||
|
.TP
|
||||||
.BI -K \ NUM
|
.BI -K \ NUM
|
||||||
Number of bases loaded into memory to process in a mini-batch [200M].
|
Number of bases loaded into memory to process in a mini-batch [200M].
|
||||||
Similar to option
|
Similar to option
|
||||||
|
|
@ -343,7 +349,7 @@ tag ignores introns to demote hits to pseudogenes.
|
||||||
Short single-end reads without splicing
|
Short single-end reads without splicing
|
||||||
.RB ( -k21
|
.RB ( -k21
|
||||||
.B -w11 -A2 -B8 -O12,32 -E2,1 -r50 -p.5 -N20 -f1000,5000 -n2 -m20 -s40 -g200
|
.B -w11 -A2 -B8 -O12,32 -E2,1 -r50 -p.5 -N20 -f1000,5000 -n2 -m20 -s40 -g200
|
||||||
.B -K50m --frag
|
.B -2K50m --frag
|
||||||
.BR --sr ).
|
.BR --sr ).
|
||||||
.RE
|
.RE
|
||||||
.SS Miscellaneous options
|
.SS Miscellaneous options
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue