简介
Canu是用于第三代测序数据(PacBio或Oxford Nanopore)组装的软件,其源码主要基于C语言和C++。具体源码在GitHub获取,或者也可在Gitee镜像仓库获取: git clone https://github.com/marbl/canu.git 或 git clone https://gitee.com/mirrors/Canu.git
本实验将对Canu源码进行修改和验证,使其能够在鲲鹏架构openEuler 20.03上成功运行。
实验过程
1.申请和配置ECS
根据后续实验需求,需要8vCPUs和16GiB内存的服务器,且需要使用鲲鹏架构的openEuler操作系统。因此可以在华为云官网申请弹性云服务器(ECS)。具体申请方法和过程可参考华为云ECS文档,需要注意选择按需计费的计费方式即可。
2.安装鲲鹏代码迁移工具
具体安装和使用方法见鲲鹏代码迁移工具用户指南,本实验选择鲲鹏服务器版本下载并安装web模式。
3.其他准备工作
服务器应安装Git 2.12以上、GCC 7.1以上和Java 1.8.0以上的版本,否则在后续实验中将会出现版本过低的报错。
4.使用鲲鹏代码迁移工具初步分析
将Canu源码克隆至服务器并修改目录属组:
将目录上传至鲲鹏代码迁移工具,选择目标操作系统为openEuler 20.03,编译器为GCC 7.3.0,开始进行分析。分析报告如下:
两个与架构相关的依赖文件我们最后判断是否需要单独获取,先对源码文件进行修改。
首先查看Makefile文件,会发现CXXFLAGS += fopenmp -pthread -fPIC -m64 -Wno-format这行标红,根据建议需要将-m64更改为-mabi=lp64,这是因为鲲鹏架构作为AArch64架构,其代码格式为LP64,即long类型为64位,而int和short为32位和16位,从而不支持-m64所指定的64位目标代码。
对于其他文件,我们将在命令行进行编译尝试,对报错所在文件进行针对性修改。
5.尝试编译
尝试编译出现以下错误:
结合鲲鹏代码迁移工具分析,在cpuid.c文件中,首先添加:
在鲲鹏代码迁移工具web模式的安装目录下,进入portadv/tools/inline_asm/config/这一目录,有一个KunpengTrans.h文件,将其复制到cpuid.c所在目录。
将# include <immintrin.h>改为:
从https://gitee.com/openeuler/AvxToNeon 获取AvxToNeon项目文件,全部复制到cpuid.c所在目录。
接下来看命令行所报的3处错误。
第一个报错:
此处涉及内联汇编代码,x86汇编指令不适用于鲲鹏,因此将:
修改为:
第二个和第三个报错: 

这两段代码应全部修改,因为原本是检查CPU是否支持AVX指令集的YMM和ZMM向量寄存器,但鲲鹏架构不使用AVX指令集,此处可以改为判断是否支持Neon和VFP特性:
修改完cpuid.c,再次尝试编译,出现了另一错误: 
实际这样缺少文件的情况有许多,均为C++的Boost库文件缺少,甚至出现多处宏定义无法识别的情况: 
因此在官方下载完整的Boost库:
将Canu中的boost目录整个替换为官方Boost库(此处/op/web/是我的鲲鹏代码迁移工具安装路径,可根据自己所安装路径修改):
再次编译,会发现Canu编译成功。
6.运行
运行实例:
yeast_filtered.20x.fastq.gz是一组有关酵母菌的基因组测序数据。如果在使用curl命令获取测序数据yeast_filtered.20x.fastq.gz时非常缓慢,可以从本地浏览器进入链接,将文件下载至本地再传到云服务器中。
运行过程较长,需要一个多小时,最终完成组装测序数据时输出如下(输出较长,只展示最后部分): 
说明运行成功,Canu已可以在鲲鹏架构正常运行。
简介
Canu是用于第三代测序数据(PacBio或Oxford Nanopore)组装的软件,其源码主要基于C语言和C++。具体源码在GitHub获取,或者也可在Gitee镜像仓库获取: git clone https://github.com/marbl/canu.git 或 git clone https://gitee.com/mirrors/Canu.git
本实验将对Canu源码进行修改和验证,使其能够在鲲鹏架构openEuler 20.03上成功运行。
实验过程
1.申请和配置ECS
根据后续实验需求,需要8vCPUs和16GiB内存的服务器,且需要使用鲲鹏架构的openEuler操作系统。因此可以在华为云官网申请弹性云服务器(ECS)。具体申请方法和过程可参考华为云ECS文档,需要注意选择按需计费的计费方式即可。
2.安装鲲鹏代码迁移工具
具体安装和使用方法见鲲鹏代码迁移工具用户指南,本实验选择鲲鹏服务器版本下载并安装web模式。
3.其他准备工作
服务器应安装Git 2.12以上、GCC 7.1以上和Java 1.8.0以上的版本,否则在后续实验中将会出现版本过低的报错。
4.使用鲲鹏代码迁移工具初步分析
将Canu源码克隆至服务器并修改目录属组:
将目录上传至鲲鹏代码迁移工具,选择目标操作系统为openEuler 20.03,编译器为GCC 7.3.0,开始进行分析。分析报告如下:
两个与架构相关的依赖文件我们最后判断是否需要单独获取,先对源码文件进行修改。
首先查看Makefile文件,会发现CXXFLAGS += fopenmp -pthread -fPIC -m64 -Wno-format这行标红,根据建议需要将-m64更改为-mabi=lp64,这是因为鲲鹏架构作为AArch64架构,其代码格式为LP64,即long类型为64位,而int和short为32位和16位,从而不支持-m64所指定的64位目标代码。
对于其他文件,我们将在命令行进行编译尝试,对报错所在文件进行针对性修改。
5.尝试编译
尝试编译出现以下错误:
结合鲲鹏代码迁移工具分析,在cpuid.c文件中,首先添加:
在鲲鹏代码迁移工具web模式的安装目录下,进入portadv/tools/inline_asm/config/这一目录,有一个KunpengTrans.h文件,将其复制到cpuid.c所在目录。
将# include <immintrin.h>改为:
从https://gitee.com/openeuler/AvxToNeon 获取AvxToNeon项目文件,全部复制到cpuid.c所在目录。
接下来看命令行所报的3处错误。
第一个报错:
此处涉及内联汇编代码,x86汇编指令不适用于鲲鹏,因此将:
修改为:
第二个和第三个报错:
这两段代码应全部修改,因为原本是检查CPU是否支持AVX指令集的YMM和ZMM向量寄存器,但鲲鹏架构不使用AVX指令集,此处可以改为判断是否支持Neon和VFP特性:
#include <stdint.h> static int check_neon_feature() { uint64_t reg; asm("mrs %0, id_aa64pfr0_el1" : "=r" (reg)); return ((reg >> 20 & 0xF) != 0xF); } static int check_vfp_feature() { uint64_t reg; asm("mrs %0, id_aa64pfr0_el1" : "=r" (reg)); return ((reg >> 16 & 0xF) != 0xF); }修改完cpuid.c,再次尝试编译,出现了另一错误:
实际这样缺少文件的情况有许多,均为C++的Boost库文件缺少,甚至出现多处宏定义无法识别的情况:
因此在官方下载完整的Boost库:
将Canu中的boost目录整个替换为官方Boost库(此处/op/web/是我的鲲鹏代码迁移工具安装路径,可根据自己所安装路径修改):
再次编译,会发现Canu编译成功。
6.运行
运行实例:
yeast_filtered.20x.fastq.gz是一组有关酵母菌的基因组测序数据。如果在使用curl命令获取测序数据yeast_filtered.20x.fastq.gz时非常缓慢,可以从本地浏览器进入链接,将文件下载至本地再传到云服务器中。
运行过程较长,需要一个多小时,最终完成组装测序数据时输出如下(输出较长,只展示最后部分):
说明运行成功,Canu已可以在鲲鹏架构正常运行。