11 个版本
使用旧的 Rust 2015
0.3.1 | 2016 年 7 月 25 日 |
---|---|
0.3.0 | 2016 年 3 月 1 日 |
0.2.4 | 2016 年 2 月 29 日 |
0.1.3 | 2016 年 2 月 23 日 |
#22 in #sequence-alignment
101 每月下载量
用于 fastq
7.5MB
171K SLoC
parasailors
parasailors 是 Rust 对 parasail 向量化双序列序列比对库的绑定。 parasail
提供了 Smith-Waterman,Needleman-Wunsch,半全局比对 算法的向量化/SIMD 版本,用于双序列 DNA/蛋白质序列比对。
原始 C 库提供了数百个用于比对的函数。尽管它们只实现了 3 种算法,但它们根据使用的 SIMD ISA、底层计算的整数宽度、是否计算比对的统计信息、是否返回动态规划矩阵的行或列等因素而有所不同。然而,该库还提供了自动 SIMD 功能检测(根据 CPU 架构动态调度函数),以及用于选择计算的正确整数宽度的溢出检测方法。为了简化 Rust 中缺乏更成熟的 SIMD 功能检测时的使用,这些调度函数目前在 parasailors
中被调用。
警告:绑定目前处于不成熟状态。如果您发现任何令人担忧的问题,请提出问题 :)。
基准测试
使用相同的 5kb 随机序列在同一台机器上(CPU 支持 AVX2)。
$ rustc --version
rustc 1.8.0-nightly (3c9442fc5 2016-02-04)
$ cat /proc/cpuinfo | grep "model name"
model name : Intel(R) Xeon(R) CPU E5-2603 v3 @ 1.60GHz
# ... other cores omitted
一个非常粗略的估计表明,在我的机器上,parasailors 相比 rust-bio 的顺序比对速度提高了 98.7% - 98.9%,显然需要调用原生 C 代码来实现加速。
rust-bio
出色的 rust-bio 库的(顺序)双序列比对。
$ git clone https://github.com/rust-bio/rust-bio
# ...
$ git checkout v0.4.0
# ...
$ multirust run nightly cargo bench
# ... other benchmarks omitted
test bench_aligner_wc_global ... bench: 992,524,365 ns/iter (+/- 12,619,674)
test bench_aligner_wc_local ... bench: 1,041,005,609 ns/iter (+/- 14,608,932)
test bench_aligner_wc_semiglobal ... bench: 990,937,047 ns/iter (+/- 7,047,941)
parasailors
$ multirust run nightly cargo bench
# ...
test bench_global_fresh_profile ... bench: 14,096,259 ns/iter (+/- 50,964)
test bench_global_reuse_profile ... bench: 12,647,865 ns/iter (+/- 55,200)
test bench_local_fresh_profile ... bench: 11,006,416 ns/iter (+/- 35,788)
test bench_local_reuse_profile ... bench: 9,543,404 ns/iter (+/- 49,748)
test bench_semiglobal_fresh_profile ... bench: 13,909,503 ns/iter (+/- 30,403)
test bench_semiglobal_reuse_profile ... bench: 12,465,250 ns/iter (+/- 52,930)
使用说明和文档
[dependencies]
parasailors = "0.3"
使用相同身份替换矩阵的简短使用示例(尽管 PAM 和 BLOSUM 也可用)
use parasailors::*;
// everything operates on &[u8] to avoid copying and reparsing
// this is the format that rust-bio provides when parsing FASTA/FASTQ
let query_sequence = b"AAAAAAAAAA";
let reference = b"AAAAAAAAAACCCCCCCCCCGGGGGGGGGGTTTTTTTTTTTNNNNNNNNN";
// the MatrixType enum allows us to type-safely select which matrix to use
let identity_matrix = Matrix::new(MatrixType::Identity);
// profiles can be reused across many alignments, saving overhead
let profile = Profile::new(query_sequence, &identity_matrix);
// parasail provides us with fast implementations for multiple alignment types
assert_eq!(10, local_alignment_score(&profile, reference, 1, 1));
assert_eq!(10, semi_global_alignment_score(&profile, reference, 1, 1));
assert_eq!(-30, global_alignment_score(&profile, reference, 1, 1));
功能/待办事项
- 重新使用配置文件比对的分数
- 多种不同替换矩阵的安全使用
- 快速一次性比对函数,可自动创建配置文件
- 间隙统计计算
- CIGAR 字符串
- 返回动态规划矩阵的行和列以进行进一步计算
- 手动选择要使用的 SIMD 功能
- 手动选择算法实现(条纹、扫描、对角线、分块)
- 手动选择整数位宽
- 编译时创建未包含的替换矩阵
需求
使用FFI绑定的子模块(parasail_sys)使用autotools构建C库(据我所知,没有关于parasail的发行版软件包),因此您需要一个兼容的工具链。建议在具有与目标机器类似SIMD指令集的系统上构建(理想情况下是目标机器本身)。parasail
C库在功能检测方面通常做得很好,但您的编译器可能会拒绝为不在其上运行的架构生成向量指令,这可能会降低一些性能。
贡献、问题和反馈
非常欢迎贡献,尤其是如果您比我更熟悉C(很可能)或生物信息学(也很可能)。我鼓励您在GitHub问题中提交任何错误报告或请求,并且我很乐意审查任何拉取请求。
如果您的问题与错误或请求的功能无关,请通过电子邮件联系我或在Rust IRC频道中找到我(通常在#rust
和#rust-beginners
,昵称与GitHub用户名相同)。
许可
这里的所有Rust代码都根据MIT许可授权。然而,位于parasail_sys/parasail_c
下的代码不属于我,其遵循Batelle BSD风格许可。
引用
如有需要,请引用parasail的原始论文。
Daily, Jeff. (2016). Parasail: SIMD C library for global, semi-global, and local pairwise sequence alignments. BMC Bioinformatics, 17(1), 1-11. doi:10.1186/s12859-016-0930-z
http://dx.doi.org/10.1186/s12859-016-0930-z
我对这些算法的良好实现不承担任何责任,并且我认为如果这个crate在学术环境中使用,原始作者应该得到奖励。