跳转至

ARM软件编译

参考

ARM平台NEON指令的编译和优化

鲲鹏软件性能调优基础知识

x86移植到鲲鹏常见编译脚本、编译选项移植、builtin函数、内联汇编函数替换汇总

鲲鹏论坛-鲲鹏HPC

鲲鹏开源应用软件移植指南-生命科学

SSE2NEON安装与配置完全指南

华为鲲鹏 920 处理器指令替换案例集

Porting architecture specific intrinsics

在GCC 9.1.0版本,支持了鲲鹏处理器所兼容的ARM v8指令集、TaiShan v110流水线。

使用方法:

在GCC for openEuler编译器、毕昇编译器、GCC编译器高于9.1.0版本上,并在CFLAGS、CPPFLAGS里增加编译选项:

-mtune=tsv110 -march=armv8-a

常见报错

  • c++: error: unrecognized command-line option ‘-mbmi2’

    `-mbmi2` 是一个 GCC 编译器的命令行选项,用于启用针对支持 BMI2(Bit Manipulation Instruction Set 2)的处理器架构的优化。BMI2 是 Intel 和 AMD 处理器的一组指令集扩展,旨在提高位操作的性能。
    
    解决:移除该编译选项
    
  • c++: error: unrecognized command-line option ‘-mpopcnt’

    `-mpopcnt` 是 GCC 编译器的一个选项,用于启用对 POPCNT 指令的支持。POPCNT 是一种位操作指令,用于快速计算一个二进制数中“1”的个数,通常可用于优化与位操作相关的算法。
    
    解决:移除该编译选项
    
  • gcc: error: unrecognized command line option ‘-m64’

    -m64是 x86 64 位应用编译选项,m64 选项设置 int 为 32bits 及 long、指针为 64 bits,为 AMD 的 x86 64 架构生成代码。在Arm64平台无法支持。

    解决:将 Arm64 平台对应的编译选项设置为 -mabi=lp64

  • warning: comparison is always false due to limitedrange of data type

    char 变量在不同 CPU 架构下默认符号不一致,在 x86 架构下为signed char,在 Arm64 平台为 unsigned char,移植时需要指定 char 变量为 signed char。

    解决:在编译选项中加入 -fsigned-char 选项,指定 Arm64 平台下的 char 为有符号数。

Augustus

项目地址:https://github.com/Gaius-Augustus/Augustus/

参考 https://github.com/Gaius-Augustus/Augustus/blob/master/docs/INSTALL.md

$ wget http://bioinf.uni-greifswald.de/augustus/binaries/augustus.current.tar.gz
$ tar -xzf augustus.current.tar.gz
$ cd augustus
修改 common.mk 文件,将 COMPGENEPRED = true 更改为 COMPGENEPRED = false,添加 MYSQL = false

编译 make augustus

如果需要编译 augustus 及其它相关工具。

$ module load arm/bamtools/2.5.2    arm/htslib/1.21
$ tar -xzf augustus.current.tar.gz
$ cd augustus
$ make

BLAT

最新版 https://hgdownload.soe.ucsc.edu/admin/,下载 jksrc.xxx.zip,BLAT 位于 kent/src/blat,不容易编译成功。

编译好的 x86 版本 https://hgdownload.soe.ucsc.edu/admin/exe/linux.x86_64/blat/

可编译版本

$ wget https://codeload.github.com/djhshih/blat/tar.gz/v35.1
$ mv v35.1 blat_35.1.tar.gz
$ tar xf blat_35.1.tar.gz
$ cd blat-35.1/
$ make
# 或编译静态库版本
$ CFLAGS="-static -static-libgcc -D_STATIC" make

blast+

下载二进制文件

可以在 https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/ 中下载编译好的版本。

$ wget https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/ncbi-blast-2.16.0+-aarch64-linux.tar.gz

cereal

https://github.com/USCiLab/cereal

unittests/CMakeLists.txt unittests/boost/CMakeLists.txt unittests/cpp17/CMakeLists.txt 中所有 -m32 删除

删除 CMakeLists.txt 中部分编译选项

add_compile_options(-Wall -Wextra -pedantic -Wshadow -Wold-style-cast) 更改为 add_compile_options(-Wall -Wextra -pedantic )

add_compile_options(-Werror) 更改为 add_compile_options()

$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/path/to/cereal/ -DBoost_INCLUDE_DIR=/path/to/boost/include/   ..
$ make -j12
$ make install

cmake

https://cmake.org/download/

直接下载编译好的 aarch64 版本 cmake-3.30.5-linux-aarch64.sh

bowtie2

直接下载编译好的二进制文件

https://github.com/BenLangmead/bowtie2/releases

exonerate

下载二进制版本

$ wget https://anaconda.org/bioconda/exonerate/2.4.0/download/linux-aarch64/exonerate-2.4.0-he4d9ad3_8.tar.bz2

fastqc

https://anaconda.org/bioconda/fastqc

直接下载编译好的二进制文件

$ wget https://anaconda.org/bioconda/fastqc/0.12.1/download/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2

fastp

安装依赖库 isa-l,libdeflate,如果没有 libstdc++.a,也需要安装 gcc。最后使用静态库编译fastp,使用时不用另外载入依赖库。

# 设置静态库地址
$ export LIBRARY_PATH=/path/to/isa-l/lib/:/path/to/libdeflate/lib/:/path/to/gcc/lib64/
$ git clone https://github.com/OpenGene/fastp.git
$ cd fastp
$ make -j12 static

FastTree

$ wget http://meta.microbesonline.org/fasttree/FastTree.c
$ gcc -DOPENMP -DUSE_DOUBLE -fopenmp -O3 -march=armv8.2-a -mtune=tsv110 -finline-functions -funroll-loops -Wall -o FastTreePar-2.1.11 FastTree.c -lm
$ export OMP_NUM_THREADS=128

fcs-gx

https://github.com/ncbi/fcs-gx

将 src 目录中 protset_minhash.cpp vim refine_alns.cpp taxify.cpp 这3个文件中的 #include <smmintrin.h> 替换为 #include "sse2neon.h",将 CMakeLists.txt 中的

fftw

参考

https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpcindapp/prtg-osc/kunpenggromacs_02_0027.html

$ module load arm/openmpi/5.0.5
$ wget wget https://fftw.org/pub/fftw/fftw-3.3.8.tar.gz
$ tar xf fftw-3.3.8.tar.gz
$ cd fftw-3.3.8/
$ ./configure --prefix=/path/to/fftw/ --enable-single --enable-float --enable-neon --enable-shared --enable-threads --enable-openmp --enable-mpi CFLAGS="-O3 -fomit-frame-pointer -fstrict-aliasing"
$ make -j20
$ make install

GMAP

项目地址 http://research-pub.gene.com/gmap/src/

$ wget http://research-pub.gene.com/gmap/src/gmap-gsnap-2023-12-01.tar.gz
$ tar xf gmap-gsnap-2023-12-01.tar.gz
$ cd gmap-2023-12-01/
$ ./configure --prefix=/path/to/gmap/ --with-simd-level=arm

GEMMA

项目地址 https://github.com/genetics-statistics/GEMMA/

安装依赖库 gsl,openblas,如果没有 libstdc++.a,也需要安装 gcc。最后使用静态库编译 GEMMA,使用时不用另外载入依赖库。

# 使用静态链接库编译,设置环境变量
$ export LIBRARY_PATH=/path/to/gsl/lib/:/path/to/openblas/lib/:/path/to/gcc/lib64/

$ wget https://github.com/genetics-statistics/GEMMA/archive/refs/tags/v0.98.5.tar.gz
$ mv v0.98.5.tar.gz gemma-0.98.5.tar.gz
$ tar xf gemma-0.98.5.tar.gz
$ cd GEMMA-0.98.5/
$ make -j12 static

gromacs

参考

https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpcindapp/prtg-osc/kunpenggromacs_02_0027.html

module load arm/openmpi/5.0.5 arm/openblas/0.3.28
http://ftp.gromacs.org/pub/gromacs/gromacs-2019.5.tar.gz
tar xf gromacs-2019.5.tar.gz
cd gromacs-2019.5/
mkdir build && cd build/
cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/gromacs/ -DGMX_SIMD=ARM_NEON_ASIMD -DGMX_OPENMP=on -DGMX_MPI=on -DGMX_X11=off -DGMX_GPU=off -DFFTWF_LIBRARY=/path/to/lib//libfftw3f.so -DFFTWF_INCLUDE_DIR=/path/to/include
make -j20
make install

hisat2

项目地址 https://github.com/DaehwanKimLab/hisat2

下载源码及依赖库

$ git clone https://github.com/DaehwanKimLab/hisat2.git
cd hisat2
$ wget https://raw.githubusercontent.com/lh3/ksw2/refs/heads/master/ksw2.h
$ wget https://raw.githubusercontent.com/DLTcollab/sse2neon/refs/heads/master/sse2neon.h
更改 alphabet.cpp 文件的 404 行,将 -1 , 更改为 char(-1) , 更改后为
char mask2iupac[16] = { 
        char(-1),
        'A', // 0001
        'C', // 0010
        'M', // 0011
        'G', // 0100
        'R', // 0101
        'S', // 0110
        'V', // 0111
        'T', // 1000
        'W', // 1001
        'Y', // 1010
        'H', // 1011
        'K', // 1100
        'D', // 1101
        'B', // 1110
        'N', // 1111
};
sse_util.haligner_sw.h 文件中的 #include <emmintrin.h> 替换为 #include "sse2neon.h"

Makefile 文件中的 EXTRA_FLAGS += -DPOPCNT_CAPABILITY 注释掉

Makefile 166-175 行的如下内容

BITS_FLAG =

ifeq (32,$(BITS))
    BITS_FLAG = -m32
endif

ifeq (64,$(BITS))
    BITS_FLAG = -m64
endif
SSE_FLAG=-msse2
更改为如下内容
BITS_FLAG =

BITS=64
ifeq (32,$(BITS))
        BITS_FLAG = -m32
endif

ifeq (64,$(BITS))
         ifeq (0, $(AARCH64))
        BITS_FLAG = -m64
  endif
endif
SSE_FLAG =
ifeq (0, $(AARCH64))
  SSE_FLAG=-msse2
        BITS_FLAG = -m64
endif
#SSE_FLAG=-msse2
最后 make -j12

hifiasm

项目地址 https://github.com/chhylp123/hifiasm

下载二进制文件

$ wget https://anaconda.org/bioconda/hifiasm/0.19.9/download/linux-aarch64/hifiasm-0.19.9-hf1d9491_0.tar.bz2

手动编译

下载源码及依赖库

$ git https://github.com/chhylp123/hifiasm.git
$ cd hifiasm
$ wget https://raw.githubusercontent.com/DLTcollab/sse2neon/refs/heads/master/sse2neon.h
Levenshtein_distance.h 中的 以下头文件都注释,添加 #include "sse2neon.h"
#include "emmintrin.h"
#include "nmmintrin.h"
#include "smmintrin.h"
#include <immintrin.h>
更改后的内容为
//#include "emmintrin.h"
//#include "nmmintrin.h"
//#include "smmintrin.h"
//#include <immintrin.h>
#include "sse2neon.h"
Makefile 中的

#CXXFLAGS= -g -O3 -msse4.2 -mpopcnt -fomit-frame-pointer -Wall

替换为

CXXFLAGS= -g -O3 -fomit-frame-pointer -Wall

最后 make -j12

lammps

opemmpi

$ module load  arm/openmpi/5.0.5
$ wget https://download.lammps.org/tars/lammps.tar.gz
$ #tar xf lammps.tar.gz 
$ cd lammps-29Aug2024
$ cd src
$ mkdir build
# 添加所需的包
$ make yes-manybody yes-meam yes-extra-fix yes-mc
$ make -j80 g++_openmpi

hmpi

加载bisheng编译环境

module purge
source /share/software/HPCKit/latest/setvars.sh
module use /share/software/HPCKit/latest/modulefiles
module load bisheng/compiler/bishengmodule bisheng/hmpi/hmpi
安装 fftw,样例安装目录:/path/to/FFTW
wget http://www.fftw.org/fftw-3.3.8.tar.gz
tar -xvf fftw-3.3.8.tar.gz
cd fftw-3.3.8
export CC=`which clang`
export CXX=`which clang++`
export FC=`which flang`
./configure --prefix=/path/to/FFTW --enable-shared --enable-static --enable-fma --enable-neon
make -j 96
make install

配置fftw环境变量

export PATH=/path/to/FFTW/bin:$PATH
export LD_LIBRARY_PATH=/path/to/FFTW/lib:$LD_LIBRARY_PATH
安装lammps,下载lammps源码包:https://www.lammps.org/download.html
tar -xzf lammps-stable.tar.gz
cd lammps-29Aug2024/src
打开 MAKE/Makefile.mpi 文件,修改CCFLAGSLINKFLAGSFFT_INCFFT_PATHFFT_LIB 这5行的内容:
CC = mpicxx
CCFLAGS = -g -O3 -I/path/to/BISHENG/include/c++/v1 -L/path/to/BISHENG/lib -std=c++11 -stdlib=libc++ -lc++ -lc++abi
SHFLAGS = -fPIC
DEPFLAGS = -M
LINK = mpicxx
LINKFLAGS =  -g -O -L/path/to/BISHENG/lib -std=c++11 -stdlib=libc++ -lc++ -lc++abi
LIB =
SIZE = size
……
ARCHIVE = ar
ARFLAGS = -rc
SHLIBFLAGS = -shared
FFT_INC = -DFFT_FFTW -I/path/to/FFTW/include 
FFT_PATH = -L/path/to/FFTW/lib  
FFT_LIB = -lfftw3
安装
make yes-KSPACE
make yes-MPIIO
make yes-MOLECULE
make yes-MANYBODY
make mpi -j

libdb

https://github.com/berkeleydb/libdb

$ git clone https://github.com/berkeleydb/libdb.git
$ cd libdb/build_unix
$ ../dist/configure --prefix=/path/to/libdb/ --build=arm-linux-gnueabi
$ make -j20
$ make install

megahit

项目地址 https://github.com/voutcn/megahit

下载二进制文件

https://anaconda.org/bioconda/megahit/1.2.9/download/linux-aarch64/megahit-1.2.9-hf1d9491_5.tar.bz2

手动编译

$ git clone https://github.com/voutcn/megahit.git
$ cd megahit 
$ wget https://raw.githubusercontent.com/DLTcollab/sse2neon/refs/heads/master/sse2neon.h
$ cp sse2neon.h src

src/parallel_hashmap/phmap_config.h 中 618 行的 #include <emmintrin.h> 和 623 行的 #include <tmmintrin.h> 分别替换为 #include "../sse2neon.h",如下所示。

#if PHMAP_HAVE_SSE2
    //#include <emmintrin.h>
    #include "../sse2neon.h"
#endif

#if PHMAP_HAVE_SSSE3
    //#include <tmmintrin.h>
    #include "../sse2neon.h"
#endif
src/xxhash/xxh3.h 中 618 行的 #include <emmintrin.h> 和 623 行的 #include <tmmintrin.h> 分别替换为 #include "../sse2neon.h",如下所示。
#if defined(__GNUC__)
#  if defined(__AVX2__)
//#    include <immintrin.h>
#include "../sse2neon.h"
#  elif defined(__SSE2__)
//#    include <emmintrin.h>
#include "../sse2neon.h"
src/main.cpp 中 包含 HasPopcnt()HasBmi2() 的行注释掉,如下所示。
 } else if (strcmp(argv[1], "checkcpu") == 0) {
//    pprintf("{}\n", HasPopcnt() && HasBmi2());
  } else if (strcmp(argv[1], "checkpopcnt") == 0) {
 //   pprintf("{}\n", HasPopcnt());
  } else if (strcmp(argv[1], "checkbmi2") == 0) {
  //  pprintf("{}\n", HasBmi2());
  } else if (strcmp(argv[1], "dumpversion") == 0) {

src/kmlib/kmrns.h 中 11 行的 #include <x86intrin.h> 注释掉,如下所示。

// #include <x86intrin.h>
CMakeLists.txt 中 76-77 两行注释掉,即禁用 -mbmi2 -DUSE_BMI2-mpopcnt 相关的编译选项,如下所示。
set_target_properties(megahit_core PROPERTIES COMPILE_FLAGS "-mbmi2 -DUSE_BMI2 -mpopcnt")
set_target_properties(megahit_core_popcnt PROPERTIES COMPILE_FLAGS "-mpopcnt")

编译

$ mkdir build
$ cd build
$ cmake ../ .. -DCMAKE_BUILD_TYPE=Release
$ make -j12
$ make install

openblas

项目地址 https://github.com/OpenMathLib/OpenBLAS

$ wget https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.28/OpenBLAS-0.3.28.tar.gz
$ tar xf OpenBLAS-0.3.28.tar.gz
$ cd OpenBLAS
$ make -j20
$ make install PREFIX=/path/to/openblas/
线程控制
export OPENBLAS_NUM_THREADS=4
export GOTO_NUM_THREADS=4
export OMP_NUM_THREADS=4

nextdenovo

$ module load arm/curl/8.10.1 arm/openssl/3.3.2
$ git clone git@github.com:Nextomics/NextDenovo.git
$ cd NextDenovo && make arm_neon=1 aarch64=1

PanGenie

编译安装 jellyfish,设置环境变量 PKG_CONFIG_PATH

$ export PKG_CONFIG_PATH=/path/to/jellyfish/lib/pkgconfig

下载 cereal,设置环境变量 CPATH

$ git clone https://github.com/USCiLab/cereal
$ export CPATH=/path/to/cereal/include/
下载 pangenie
$ git clone https://github.com/eblerjana/pangenie.git  
$ cd pangenie
tests/catch.hpp 中 所有的 SIGSTKSZ 更改为 32768 (6631行、6599行)。

编译安装

$ mkdir build
$ cd build
$ cmake ..
$ make -j12
$ ls src/
libPanGenieLib.so
PanGenie-index
PanGenie

QTLtools

编译静态文件,运行时不需要其它依赖,将

#BASE LIBRARIES
LIB_FLAGS=-lz -lgsl -lbz2 -llzma -lgslcblas -lm -lpthread -lcurl
改为
#BASE LIBRARIES
LIB_FLAGS=-Wl,-Bstatic -lz /share/software/app/arm/gsl/2.8/lib/libgsl.a -lbz2 -llzma /share/software/app/arm/gsl/2.8/lib/libgslcblas.a /share/software/app/arm/curl/8.10.1/lib/libcurl.a -Wl,-Bdynamic -lm -lpthread
最后 make -j20 即可。

rmblast

项目地址:https://www.repeatmasker.org/rmblast/

$ wget https://www.repeatmasker.org/rmblast/rmblast-2.14.0+-x64-linux.tar.gz
$ wget https://www.repeatmasker.org/rmblast/isb-2.14.1+-rmblast.patch.gz
$ tar xf rmblast-2.14.0+-x64-linux.tar.gz
$ gzip -d isb-2.14.1+-rmblast.patch.gz
$ cd ncbi-blast-2.14.1+-src/
$ patch -p1 < ../isb-2.14.1+-rmblast.patch
$ cd c++/
$ ./configure --with-mt --without-debug --without-krb5 --without-openssl --with-projects=scripts/projects/rmblastn/project.lst --prefix=/path/to/rmblast
$ make -j20
$ make install

snoscan

wget http://eddylab.org/software/snoscan/snoscan.tar.gz
tar xf snoscan.tar.gz
cd snoscan-0.9.1
cd squid-1.5.11
make clean
make
cd ..
make clean
make

sratools

sratools编译需要 libstdc++.a 静态链接库,否则编译过程中会出现报错。

/usr/bin/ld: cannot find -lstdc++
collect2: error: ld returned 1 exit status
可以使用下面的命令查看系统中是否安装。
$ find /usr/ -name "*libstdc++.a*"
如果系统中没有 libstdc++.a,可自行编译安装 gcc。

sratools 安装依赖 ncbi-vdb。

$ git clone https://github.com/ncbi/ncbi-vdb
$ cd ncbi-vdb
$ ./configure --prefix=/path/to/ncbi-vdb/
$ make -j12 && make install
编译安装 sratools。
$ git clone https://github.com/ncbi/sra-tools
$ cd sra-tools
$ ./configure --with-ncbi-vdb-prefix=/path/to/ndcbi-vdb/ --prefix=/path/to/sra-tools/
$ make -j12 && make install

STAR

项目地址 https://github.com/alexdobin/STAR

$ git clone https://github.com/alexdobin/STAR
$ cd STAR/source
Makefile 文件中 CXXFLAGS_SIMD ?= -mavx2 整行注释,如下所示。
#CXXFLAGS_SIMD ?= -mavx2

然后 make

本文阅读量  次
本站总访问量  次