From ccb0f7b05df3a17011f0d0f4388ddb301198871b Mon Sep 17 00:00:00 2001 From: Heng Li Date: Sat, 25 Apr 2020 22:43:29 -0400 Subject: [PATCH] added a new Makefile for simde --- Makefile | 39 +++----------------- Makefile.simde | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 12 ++++--- 3 files changed, 110 insertions(+), 38 deletions(-) create mode 100644 Makefile.simde diff --git a/Makefile b/Makefile index 7d2afc9..18622f5 100644 --- a/Makefile +++ b/Makefile @@ -1,40 +1,26 @@ CFLAGS= -g -Wall -O2 -Wc++-compat #-Wextra CPPFLAGS= -DHAVE_KALLOC INCLUDES= -OBJS= kthread.o kalloc.o misc.o bseq.o sketch.o sdust.o options.o index.o chain.o align.o hit.o map.o format.o pe.o esterr.o splitidx.o +OBJS= kthread.o kalloc.o misc.o bseq.o sketch.o sdust.o options.o index.o chain.o align.o hit.o map.o format.o pe.o esterr.o splitidx.o ksw2_ll_sse.o PROG= minimap2 PROG_EXTRA= sdust minimap2-lite LIBS= -lm -lz -lpthread - -ifeq ($(no_simd),) # if no_simd is not defined ifeq ($(arm_neon),) # if arm_neon is not defined - OBJS+=ksw2_ll_sse.o ifeq ($(sse2only),) # if sse2only is not defined OBJS+=ksw2_extz2_sse41.o ksw2_extd2_sse41.o ksw2_exts2_sse41.o ksw2_extz2_sse2.o ksw2_extd2_sse2.o ksw2_exts2_sse2.o ksw2_dispatch.o else # if sse2only is defined OBJS+=ksw2_extz2_sse.o ksw2_extd2_sse.o ksw2_exts2_sse.o endif else # if arm_neon is defined - OBJS+=ksw2_ll_neon.o ksw2_extz2_neon.o ksw2_extd2_neon.o ksw2_exts2_neon.o -ifeq ($(simde),) # arm_neon without SIMDe -> use sse2neon - INCLUDES+=-Isse2neon -endif + OBJS+=ksw2_extz2_neon.o ksw2_extd2_neon.o ksw2_exts2_neon.o + INCLUDES+=-Isse2neon ifeq ($(aarch64),) #if aarch64 is not defined CFLAGS+=-D_FILE_OFFSET_BITS=64 -mfpu=neon -fsigned-char else #if aarch64 is defined CFLAGS+=-D_FILE_OFFSET_BITS=64 -fsigned-char endif endif -else - OBJS+=ksw2_ll_nosimd.o ksw2_extz2_nosimd.o ksw2_extd2_nosimd.o ksw2_exts2_nosimd.o - simde=1 # no_simd can be used only with SIMDe -endif - -ifneq ($(simde),) # if simde is defined - CFLAGS+=-DSIMDE_ENABLE_NATIVE_ALIASES -DUSE_SIMDE - INCLUDES+=-Ilib/simde -endif ifneq ($(asan),) CFLAGS+=-fsanitize=address @@ -70,8 +56,10 @@ sdust:sdust.c kalloc.o kalloc.h kdq.h kvec.h kseq.h ketopt.h sdust.h # SSE-specific targets on x86/x86_64 +ifeq ($(arm_neon),) # if arm_neon is defined, compile this target with the default setting (i.e. no -msse2) ksw2_ll_sse.o:ksw2_ll_sse.c ksw2.h kalloc.h $(CC) -c $(CFLAGS) -msse2 $(CPPFLAGS) $(INCLUDES) $< -o $@ +endif ksw2_extz2_sse41.o:ksw2_extz2_sse.c ksw2.h kalloc.h $(CC) -c $(CFLAGS) -msse4.1 $(CPPFLAGS) -DKSW_CPU_DISPATCH $(INCLUDES) $< -o $@ @@ -96,9 +84,6 @@ ksw2_dispatch.o:ksw2_dispatch.c ksw2.h # NEON-specific targets on ARM -ksw2_ll_neon.o:ksw2_ll_sse.c ksw2.h kalloc.h - $(CC) -c $(CFLAGS) $(CPPFLAGS) $(INCLUDES) $< -o $@ - ksw2_extz2_neon.o:ksw2_extz2_sse.c ksw2.h kalloc.h $(CC) -c $(CFLAGS) $(CPPFLAGS) -DKSW_SSE2_ONLY -D__SSE2__ $(INCLUDES) $< -o $@ @@ -108,20 +93,6 @@ ksw2_extd2_neon.o:ksw2_extd2_sse.c ksw2.h kalloc.h ksw2_exts2_neon.o:ksw2_exts2_sse.c ksw2.h kalloc.h $(CC) -c $(CFLAGS) $(CPPFLAGS) -DKSW_SSE2_ONLY -D__SSE2__ $(INCLUDES) $< -o $@ -# no-SIMD version - -ksw2_ll_nosimd.o:ksw2_ll_sse.c ksw2.h kalloc.h - $(CC) -c $(CFLAGS) $(CPPFLAGS) -DSIMDE_NO_NATIVE $(INCLUDES) $< -o $@ - -ksw2_extz2_nosimd.o:ksw2_extz2_sse.c ksw2.h kalloc.h - $(CC) -c $(CFLAGS) $(CPPFLAGS) -DKSW_SSE2_ONLY -D__SSE2__ -DSIMDE_NO_NATIVE $(INCLUDES) $< -o $@ - -ksw2_extd2_nosimd.o:ksw2_extd2_sse.c ksw2.h kalloc.h - $(CC) -c $(CFLAGS) $(CPPFLAGS) -DKSW_SSE2_ONLY -D__SSE2__ -DSIMDE_NO_NATIVE $(INCLUDES) $< -o $@ - -ksw2_exts2_nosimd.o:ksw2_exts2_sse.c ksw2.h kalloc.h - $(CC) -c $(CFLAGS) $(CPPFLAGS) -DKSW_SSE2_ONLY -D__SSE2__ -DSIMDE_NO_NATIVE $(INCLUDES) $< -o $@ - # other non-file targets clean: diff --git a/Makefile.simde b/Makefile.simde new file mode 100644 index 0000000..381a668 --- /dev/null +++ b/Makefile.simde @@ -0,0 +1,97 @@ +CFLAGS= -g -Wall -O2 -Wc++-compat #-Wextra +CPPFLAGS= -DHAVE_KALLOC -DUSE_SIMDE -DSIMDE_ENABLE_NATIVE_ALIASES +INCLUDES= -Ilib/simde +OBJS= kthread.o kalloc.o misc.o bseq.o sketch.o sdust.o options.o index.o chain.o align.o hit.o map.o format.o pe.o esterr.o splitidx.o \ + ksw2_extz2_simde.o ksw2_extd2_simde.o ksw2_exts2_simde.o ksw2_ll_simde.o +PROG= minimap2 +PROG_EXTRA= sdust minimap2-lite +LIBS= -lm -lz -lpthread + + +ifneq ($(arm_neon),) # if arm_neon is defined +ifeq ($(aarch64),) #if aarch64 is not defined + CFLAGS+=-D_FILE_OFFSET_BITS=64 -mfpu=neon -fsigned-char +else #if aarch64 is defined + CFLAGS+=-D_FILE_OFFSET_BITS=64 -fsigned-char +endif +endif + +ifneq ($(asan),) + CFLAGS+=-fsanitize=address + LIBS+=-fsanitize=address +endif + +ifneq ($(tsan),) + CFLAGS+=-fsanitize=thread + LIBS+=-fsanitize=thread +endif + +.PHONY:all extra clean depend +.SUFFIXES:.c .o + +.c.o: + $(CC) -c $(CFLAGS) $(CPPFLAGS) $(INCLUDES) $< -o $@ + +all:$(PROG) + +extra:all $(PROG_EXTRA) + +minimap2:main.o libminimap2.a + $(CC) $(CFLAGS) main.o -o $@ -L. -lminimap2 $(LIBS) + +minimap2-lite:example.o libminimap2.a + $(CC) $(CFLAGS) $< -o $@ -L. -lminimap2 $(LIBS) + +libminimap2.a:$(OBJS) + $(AR) -csru $@ $(OBJS) + +sdust:sdust.c kalloc.o kalloc.h kdq.h kvec.h kseq.h ketopt.h sdust.h + $(CC) -D_SDUST_MAIN $(CFLAGS) $< kalloc.o -o $@ -lz + +ksw2_ll_simde.o:ksw2_ll_sse.c ksw2.h kalloc.h + $(CC) -c $(CFLAGS) -msse2 $(CPPFLAGS) $(INCLUDES) $< -o $@ + +ksw2_extz2_simde.o:ksw2_extz2_sse.c ksw2.h kalloc.h + $(CC) -c $(CFLAGS) -msse4.1 $(CPPFLAGS) $(INCLUDES) $< -o $@ + +ksw2_extd2_simde.o:ksw2_extd2_sse.c ksw2.h kalloc.h + $(CC) -c $(CFLAGS) -msse4.1 $(CPPFLAGS) $(INCLUDES) $< -o $@ + +ksw2_exts2_simde.o:ksw2_exts2_sse.c ksw2.h kalloc.h + $(CC) -c $(CFLAGS) -msse4.1 $(CPPFLAGS) $(INCLUDES) $< -o $@ + +# other non-file targets + +clean: + rm -fr gmon.out *.o a.out $(PROG) $(PROG_EXTRA) *~ *.a *.dSYM build dist mappy*.so mappy.c python/mappy.c mappy.egg* + +depend: + (LC_ALL=C; export LC_ALL; makedepend -Y -- $(CFLAGS) $(CPPFLAGS) -- *.c) + +# DO NOT DELETE + +align.o: minimap.h mmpriv.h bseq.h kseq.h ksw2.h kalloc.h +bseq.o: bseq.h kvec.h kalloc.h kseq.h +chain.o: minimap.h mmpriv.h bseq.h kseq.h kalloc.h +esterr.o: mmpriv.h minimap.h bseq.h kseq.h +example.o: minimap.h kseq.h +format.o: kalloc.h mmpriv.h minimap.h bseq.h kseq.h +hit.o: mmpriv.h minimap.h bseq.h kseq.h kalloc.h khash.h +index.o: kthread.h bseq.h minimap.h mmpriv.h kseq.h kvec.h kalloc.h khash.h +index.o: ksort.h +kalloc.o: kalloc.h +ksw2_extd2_sse.o: ksw2.h kalloc.h +ksw2_exts2_sse.o: ksw2.h kalloc.h +ksw2_extz2_sse.o: ksw2.h kalloc.h +ksw2_ll_sse.o: ksw2.h kalloc.h +kthread.o: kthread.h +main.o: bseq.h minimap.h mmpriv.h kseq.h ketopt.h +map.o: kthread.h kvec.h kalloc.h sdust.h mmpriv.h minimap.h bseq.h kseq.h +map.o: khash.h ksort.h +misc.o: mmpriv.h minimap.h bseq.h kseq.h ksort.h +options.o: mmpriv.h minimap.h bseq.h kseq.h +pe.o: mmpriv.h minimap.h bseq.h kseq.h kvec.h kalloc.h ksort.h +sdust.o: kalloc.h kdq.h kvec.h sdust.h +self-chain.o: minimap.h kseq.h +sketch.o: kvec.h kalloc.h mmpriv.h minimap.h bseq.h kseq.h +splitidx.o: mmpriv.h minimap.h bseq.h kseq.h diff --git a/README.md b/README.md index a62d189..4905417 100644 --- a/README.md +++ b/README.md @@ -80,11 +80,14 @@ directory to compile. If you see compilation errors, try `make sse2only=1` to disable SSE4 code, which will make minimap2 slightly slower. Minimap2 also works with ARM CPUs supporting the NEON instruction sets. To -compile for 32 bit ARM architectures (such as ARMv7), use `make arm_neon=1`. To compile for for 64 bit ARM architectures (such as ARMv8), use `make arm_neon=1 aarch64=1`. +compile for 32 bit ARM architectures (such as ARMv7), use `make arm_neon=1`. To +compile for for 64 bit ARM architectures (such as ARMv8), use `make arm_neon=1 +aarch64=1`. -Minimap2 can use [SIMD Everywhere (SIMDe)](https://github.com/nemequ/simde) library for porting implementation -to the different SIMD instruction sets. To compile using SIMDe, use `make simde=1`. To compile for ARM CPUs, add `simde=1` to the commands given above. -SIMDe also enables non-SIMD implementation using `make no_simd=1`. +Minimap2 can use [SIMD Everywhere (SIMDe)][simde] library for porting +implementation to the different SIMD instruction sets. To compile using SIMDe, +use `make -f Makefile.simde`. To compile for ARM CPUs, use `Makefile.simde` +with the ARM related command lines given above. ### General usage @@ -380,3 +383,4 @@ mappy` or [from BioConda][mappyconda] via `conda install -c bioconda mappy`. [manpage]: https://lh3.github.io/minimap2/minimap2.html [manpage-cs]: https://lh3.github.io/minimap2/minimap2.html#10 [doi]: https://doi.org/10.1093/bioinformatics/bty191 +[smide]: https://github.com/nemequ/simde