2025/05/08 追記
BWA-MEM-SCALEはBWA-MEM2およびBWA-Michをベースに、ゲノム配列アライメントの全ステップにおける性能向上を実現した。Exact Match Filter (EMF)、FM-index Accelerator (FMA)、様々な最適化技術が追加されている。BWA-MEM-SCALEは、利用可能なメモリ容量が133GB以上の場合、BWA-MEM2と比較して最大3.32倍の高速化を実現する。また、性能向上を抑制したままメモリ消費量を削減する。BWA-MEM-SCALEは、MAPQスコア、XSタグ、XAタグの一部(実験では3.14%)を除き、BWA-MEM2と同じ結果を得られる。
インストール
9900X CPUでAVX2版をコンパイルした (g++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0)。5995WX CPUではAVX512版もコンパイルした。*1
git clone --recursive https://github.com/etri/bwa-mem-scale.git bwa-mem-scale
cd bwa-mem-scale
# If AVX512BW (512-bit SIMD) is supported
make clean
make -j<num_threads> scale=1 arch=avx512
# If AVX2 (256-bit SIMD) is supported
make clean
make -j<num_threads> scale=1 arch=avx2
# If SSE4.1 (128-bit SIMD) is supported (default)
make -j<num_threads> scale=1
#パスを通す
export PATH=${PWD}:$PATH
> bwa-mem2.scale.avx2
Usage: bwa-mem2.scale <command> <arguments>
Commands:
index create index
perfect-index create index for perfect match
smem-table create index for FM-index accelerator
mem alignment
load-shm load index on process shared memory
remove-shm remove index from process shared memory
version print version number
> bwa-mem2.scale.avx2 index
Usage: bwa-mem2 index [options] <in.fasta>
Options: -a STR BWT construction algorithm: bwtsw, is, rb2, mem2 or ert
-p STR prefix of the index [same as fasta name]
-t INT number of threads for ERT index building [1]
-6 index files named as <in.fasta>.64.* instead of <in.fasta>.*
Warning: `-a bwtsw' does not work for short genomes, while `-a is' and
`-a div' do not work not for long genomes.
`-a ert' to build ERT index.
> bwa-mem2.scale.avx2 perfect-index
Usage: bwa-mem2 perfect-index [-l seed_length] [-s slack] <prefix>
-s (float) ==> the hash table will have (slack) * (length of reference sequence) entries
T
> bwa-mem2.scale.avx2 smem-table
usage: bwa-mem2.scale.avx2 accel <idxbase>
build two smem tables for FM-index walking acceleration.
実行方法
十分なメモリが利用できるサーバーで実行する。
1、indexing
#1 WA-MEM2と互換性のあるFM-index
bwa-mem2.scale.avx512bw index -t 20 -p index_prefix Homo_sapiens.GRCh38.fa
#2 続いてERTを用いたインデックスを生成 (FM-index検索を高速化)メモリが少ないときはスレッド数を減らす
bwa-mem2.scale.avx512bw index -a ert -t 20 -p index_prefix Homo_sapiens.GRCh38.fa
#3 続いてFMA(FM-index Accelerator)インデックスを生成
bwa-mem2.scale.avx512bw smem-table index_prefix
#4 最後にExact Match Filter(EMF)を用いたインデックスを生成(シード長に基づいて不要な候補を事前にフィルタリング)
bwa-mem2.scale.avx512bw perfect-index -l <seed length> index_prefix
#1の出力例

#2までの出力例

#3までの出力例

#4までの出力例

2、1GBのメモリページを121枚確保させる(1GB単位の大きなメモリ領域を使いアクセスを高速化させる) *2。
echo 121 | sudo tee /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
#確認
cat /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
3、load-shmでインデックスを共有メモリに読み込む。-l 150でリード長を指定、-g 121 で使用するHugepage数(step2ので指定した値)を指定。-HでHugepageのサイズを指定(1gb)。*3 *4
bwa-mem2.scale.avx512bw load-shm -H 1gb -l 150 -g 121 Homo_sapiens.GRCh38.dna.primary_assembly.fa

4、マッピング
bwa-mem2.scale.avx512bw mem -t 20 -i 64 -l 150 -o out.sam Homo_sapiens.GRCh38.dna.primary_assembly.fa reads_R1.fq.gz reads_R2.fq.gz
5、共有メモリの削除
bwa-mem2.scale.avx512bw remove-shm
その他
- BWA-MEM-SCALEの最小メモリ要件はBWA-MEM2と同じ約20GBだが、すべての最適化メカニズムを有効にするには140GB以上のメモリが必要。総メモリ消費量は主にスレッド数に依存する。
引用
BWA-MEM-SCALE: Accelerating Genome Sequence Mapping on Commodity Servers
Changdae Kim, Kwangwon Koh, Taehoon Kim, Daegyu Han, Jiwon SeoAuthors Info & Claims
ICPP '22: Proceedings of the 51st International Conference on Parallel Processing
Article No.: 83, Pages 1 - 12
https://dl.acm.org/doi/abs/10.1145/3545008.3545033
*1
src/utils.hの52-66行目を削除

*2
https://qiita.com/plusultra/items/bcfccb8ef1de46f1b9b7
*3
管理者権限でメモリへのロードを行うと、マッピングや共有メモリの削除はsudo実行する必要がある点に注意。
*4
HugePagesを確保するには、物理メモリ上に連続した領域が必要なため、空きメモリが多数あってもメモリの断片化によって連続して1GB以上空いている領域が少ないと確保できない可能性がある。その場合はサーバーを再起動した直後に実行する。
関連