开发者
资源
从x86到鲲鹏的Canu移植实验(openEuler 20.03)
从x86到鲲鹏的Canu移植实验(openEuler 20.03)
新人帖
发表于2023/04/09
1161

简介

Canu是用于第三代测序数据(PacBio或Oxford Nanopore)组装的软件,其源码主要基于C语言和C++。具体源码在GitHub获取,或者也可在Gitee镜像仓库获取: git clone https://github.com/marbl/canu.gitgit 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源码克隆至服务器并修改目录属组:

chown -R porting:porting Canu

将目录上传至鲲鹏代码迁移工具,选择目标操作系统为openEuler 20.03,编译器为GCC 7.3.0,开始进行分析。分析报告如下: true 两个与架构相关的依赖文件我们最后判断是否需要单独获取,先对源码文件进行修改。

首先查看Makefile文件,会发现CXXFLAGS += fopenmp -pthread -fPIC -m64 -Wno-format这行标红,根据建议需要将-m64更改为-mabi=lp64,这是因为鲲鹏架构作为AArch64架构,其代码格式为LP64,即long类型为64位,而int和short为32位和16位,从而不支持-m64所指定的64位目标代码。

对于其他文件,我们将在命令行进行编译尝试,对报错所在文件进行针对性修改。

5.尝试编译

尝试编译出现以下错误: true 结合鲲鹏代码迁移工具分析,在cpuid.c文件中,首先添加:

# if defined(__aarch64__)
  # include "KunpengTrans.h"
# endif

在鲲鹏代码迁移工具web模式的安装目录下,进入portadv/tools/inline_asm/config/这一目录,有一个KunpengTrans.h文件,将其复制到cpuid.c所在目录。

将# include <immintrin.h>改为:

# if defined(__x86_64__)
  # include <immintrin.h>
# elif defined(__aarch64__)
  # include "avx2neon.h"
# endif

https://gitee.com/openeuler/AvxToNeon 获取AvxToNeon项目文件,全部复制到cpuid.c所在目录。

接下来看命令行所报的3处错误。

第一个报错: true 此处涉及内联汇编代码,x86汇编指令不适用于鲲鹏,因此将:

__asm__ ( "cpuid" : "+b" (ebx), "+a" (eax), "+c" (ecx), "=d" (edx) );

修改为:

__asm__ ( "mrs %0, midr_el1" : "+r" (ebx),"+r" (eax), "+r" (ecx), "=r" (edx) : : "memory" );

第二个和第三个报错: true

true

这两段代码应全部修改,因为原本是检查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,再次尝试编译,出现了另一错误: true

实际这样缺少文件的情况有许多,均为C++的Boost库文件缺少,甚至出现多处宏定义无法识别的情况: true

因此在官方下载完整的Boost库:

wget https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.gz
tar -zxvf boost_1_80_0.tar.gz

将Canu中的boost目录整个替换为官方Boost库(此处/op/web/是我的鲲鹏代码迁移工具安装路径,可根据自己所安装路径修改):

cp -r ./boost_1_80_0/boost/. /opt/web/portadv/portasmin/sourcecode/Canu/src/utgcns/libboost/boost

再次编译,会发现Canu编译成功。

6.运行

运行实例:

cd /opt/web/portadv/portasmin/sourcecode/Canu/build/bin

curl -L -o yeast.20x.fastq.gz http://gembox.cbcb.umd.edu/mhap/raw/yeast_filtered.20x.fastq.gz

canu \
-p asm -d yeast \
genomeSize=12.1m \
correctedErrorRate=0.105 \
-pacbio yeast.20x.fastq.gz

yeast_filtered.20x.fastq.gz是一组有关酵母菌的基因组测序数据。如果在使用curl命令获取测序数据yeast_filtered.20x.fastq.gz时非常缓慢,可以从本地浏览器进入链接,将文件下载至本地再传到云服务器中。

运行过程较长,需要一个多小时,最终完成组装测序数据时输出如下(输出较长,只展示最后部分): true

说明运行成功,Canu已可以在鲲鹏架构正常运行。

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞