2.11 NGS データ処理プログラム BWA の評価について
理化学研究所 情報基盤センター
野田 茂穂、須永 泰弘
2.11.1 概要：ゲノムデータを取得する NGS（NextGeneration Sequencer）では、計測結果として得られる断片的なゲノム配列を処理することにより全長配列データを得ることができる。この処理は二次解析と呼ばれており、Assemble 処理やMapping 処理が該当する。現在、NGS が大量に導入されゲノムデータの取得が頻繁に行われており、二次解析を処理する計算機も大量に必要になってきている。
2.11.2 処理及びプログラム概要：この評価では、二次解析のうち Mapping 処理に着目している。
Mapping 処理ではあらかじめ用意されているリファレンスゲノム配列を利用し、取得した断片ゲノ
ム配列から全長配列を得ることができる。断片ゲ
ノム配列の総量は求める精度により変わるがおお
よそ 30Gbp（bp : base pare 塩基対 A,T,G,C）であり、リファレンス配列は 3Gbp、出力される全長
配列も 3Gbp である。
マッピングのツールとして幾つかのソフトウェア
がリリースされているが、京コンピュータ向けに作成された NGSAnalizer が使用している BWA を対象に FX100 での動作検証及び性能評価を行った。
bwa の実行は、”bwa aln ref.fa read.fast > res1.sai”という実行する。ref.fa がリファレン
スゲノム配列であり 3.1GB のアスキーファイル。read.fast が断片ゲノム配列で 13.5GB、出力である rea1.sai が 23GB のバイナリーデータである。
プログラムは C 言語で 10K ほどのものであり、キーとなるアルゴリズムは Burrows Wheeler
Transform を使用している。
2.11.3 評価結果概要：FX10 と FX100 で単体性能（core あたり性能）はほとんど変わらない。これは SIMD 命令などの高速化の恩恵を得ることができないプログラムのためである。しかしながら、スレッド並列は良好であり、メニーコアの恩恵が得られるプログラムであることがわかる。

204 / 253

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

NGSデータ処理プログラムBWA
独立行政法人 理化学研究所
情報基盤センター
野田 茂穂

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

NGSデータ処理の流れ
NGS: Next Generation Sequencer
ヒトゲノムデータ：3Gbp ( bp : base pair塩基対A,T,G,C)
NGS装置は断片化されたゲノム配列を出力。一つのデータは100bp程度。
断片化されたゲノム配列を参照ゲノム配列を利用し一本のゲノム配列を作成。

205 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

次世代シークエンサー(ハイスループット型)

参考：
第１世代自動シークエンサー
3130xl (ABI)

Hiseq2500（イルミナ）

GSFLX+（ロシュ）

600Gb/11日

0.7Gb/23時間
リード長：700bp

リード長：2×100bp

5500xlw（ライフテクイノロジーズ）
270Gb/14日
リード長：2×60bp
bp : base pair[塩基対]次世代シークエンス解析ソフト講習会
All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

HiSeq XTM Ten（2014年4月販売開始）

NGSも並列化の時代へ！
10台のHiSeq XTM を同時に動かす

HiSeq Xシステムは、1台のシステムで最大1.8テラベース（Tb）のデータを3 日以内に産出(600Gb/day)
10台のシステムで最大320テラベース（Tb）のデータを毎週産出
引用元：イルミナ社HiseqXten データシート
206 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

断片ゲノム配列データ
ACGTACGT…..ACGTACGT : 約3Gbp[ACGT……ACGT] : 400bp[ACGT……ACGT] : 400bp[ACGT……ACGT] : 400bp[ACGT……ACGT] : 400bp

NGS

7,5000,000リード
Fastqファイル[ACGT……ACGT] : 400bp[ACGT……ACGT] : 400bp[ACGT……ACGT] : 400bp[ACGT……ACGT] : 400bp
All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

断片ゲノム配列データのアライメント
断片ゲノム配列データが参照ゲノムデータのどこに当てはまるかを探索。
正、全く同じゲノム配列ではないため、近い所を探す。
また、精度を高めるため、カバレッジを１０程度とる。
断片ゲノム配列データの総量は3Gbp×10=30Gbp。

……………….

………………. ………………. ……………….

[ACGT……ACGT][ACGT……ACGT][ACGT……ACGT][ACGT……ACGT]……………….

……………….

ACGTACGTACGTACGTACGTACGTACGTACGT….. ACGTACGTACGTACGTACGTACGTACGTACGT

参照ゲノムデータ：既に分かってるゲノム配列
207 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

NGSのフローチャート
ゲノムDNAここ
は装NGSを使って塩基配列解読
生データ（画像データ等）

置

一次解析：Base caller
生データを配列データに変換
大量の断片
配列データ

2次解析:
Assemble & Mapping

３次解析

全長
配列データ

アノテーション付配列データ

変異(SNP）同定
転写物解析

ここが対象

サテライトマーカー同定

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

マッピングツール(ショートリード・ゲノム用)
名前

アルゴリズム

BWT(Burrows-Wheeler
Transform)

BWT

BWT

挿入欠失(In/Del)

検出可能

検出可能

検出不可能

処理速度

速い

とても速い

速い
メモリ消費量少ない

精度

良い

BWAより悪い

BWAより悪いpthreadSSE

GPL v3academic free binary

スレッド並列化ライセンスpthread(ｖ0.5，v0.6)
SSE2(v0.7)
GPL v3

今回はFX10と「京」で動作確認がとれている、BWAの詳細プロファイルを取得した。
208 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

NGSデータ処理の流れ(bwa)
ヒトゲノムデータ：3Gbp(G base pair塩基対A,T,G,C)
NGS装置は断片配列ゲノムデータの塩基配列を出力。一つのデータは100bp程
度。
ソフトウェアでMapping処理を行い、細切れデータを一つのヒトゲノムデータに整形。Mapping処理とは元となる参照ヒトゲノムデータに細切れデータを当てはめて行き、参照ヒトゲノムデータに近いゲノムデータを生成する。
処理はアライメントとマッピングに分けて実行される。
精度の確保の為、一つのゲノムに対して１０回程度計測を行いそのNGSデー
タを使用する。(10カバレッジ)
入力：参照ヒトゲノムデータ3Gbp、NGSデータ30Gbp
実効例：
bwa aln ref.fa read_1.fastq > 1.saibwa aln ref.fa read_2.fastq > 2.saibwa sampe ref.fa 1.sai 2.sai read_1.fastq read_2.fastq > result.sam
All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

プログラム概説• C言語、約10K。
• bwa aln : 断片ゲノム配列データを参照ゲノム配列にアライメント• bwa sampe : アライメントされたデータから一つのゲノム配列を生成（マッピング）• アルゴリズム概要(bwa aln)
Loop:断片ゲノム配列データ数(7,500,000×10)
bwtアルゴリズムを用いて探索
endloop• FX10上でマッピング処理を行う以下のファイルサイズで動作• 実効例：
bwa aln ref.fa read_1.fastq > 1.saibwa aln ref.fa read_2.fastq > 2.saibwa sampe ref.fa 1.sai 2.sai read_1.fastq read_2.fastq > result.sam （正、時間内に終了せず）• ref.fa[参照配列データ]:3.1GB(ASC), read_1.fastq[NGSのデータ]:13.5GB, read_2.fastq[NGSのデー
タ]:11.8GB, 1.sai[bwa alnの結果]:2.6GB(Bin) 2.sai[bwa alnの結果]:3.3GB(Bin), result.sam[配列データ＋スコアデータ]:3.9GB(Bin)• Bwa alnはスレッド並列、bwa sampeは非並列

209 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

Burrows Wheeler Transform(BWT)
BWA, Bowtieが使用しているアルゴリズム
ブロックソートとも呼ばれる。Bzip2など
リファレンスゲノムの配列を断片化し、インデックスを作成する。
① Suffix Arrayの作成(1)
配列A CAGGTT(1) 末尾に目印として$をつける。

CAGGTT$(2) 先頭の文字を末尾に移動する。

AGGTT$C(3) 先頭の文字を末尾に移動する。

GGTT$CA(4) 先頭の文字を末尾に移動する。

GTT$CAG(5) 先頭の文字を末尾に移動する。

TT$CAGG(6) 先頭の文字を末尾に移動する。

T$CAGGT(7) 先頭の文字を末尾に移動する。

$CAGGTTAll Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

Burrows Wheeler Transform(BWT)② Suffix Arrayの作成(2)配列A CAGGTT
番号をつける
1

CAGGTT$

2

AGGTT$C3

アルファベット順に並べ替える（辞書順にソート）

7$CAGGTT

2

AGGTT$C

GGTT$CA1

CAGGTT$

4

GTT$CAG3

GGTT$CA

5

TT$CAGG

4

GTT$CAG6

T$CAGGT

6

T$CAGGT

7$CAGGTT

5

TT$CAGG

これがSuffix Array
A[0] = 7, A[1] = 2
210 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

Burrows Wheeler Transform(BWT)③ 文字列検索

配列A CAGGTT

7$CAGGTT

2

AGGTT$C

7$1

CAGGTT$

2

A GGTT$

3

GGTT$CA1

C AGGTT$

4

GTT$CAG

3G GTT$

6

T$CAGGT

4

G TT$

5

TT$CAGG

6

T $

5

T T$

＄以下を切り捨てる

1列目から順々に文字検索するだけで、その文字の位置
Suffix Arrayも決定できる

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

BWAのマッピング
デフォルトの場合

NGSで読んだ配列

100〜200塩基

Seed length
32塩基①5’側（上流）からSeed length(32塩基)までの塩基配列をBWTを用いてゲノム上の領域を探索する。(2塩基以下のミスマッチ、ギャップを許容)②Seedがマッチした配列の残りの部分をアライメントし、最大許容ミスマッ
チ以下のアライメントを求める。
③ゲノム上の複数箇所にアライメントされるが、最もスコアの高い位置にマッピングする。

④同一スコアで複数の場合はランダムに1カ所を選ぶ

211 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

今回の計算に使用したデータ
１．参照（リファレンス）ゲノムデータ☆NCBIのBuild37.1（標準ヒトゲノム）①全ゲノム(1〜22, X, Y) （アライメント用）
2.8 GB (29億塩基対)②第1番染色体（一番長い）のみ (マッピング用)
220 MB (2億2千6百万塩基対)全ゲノムでのマッピング測定は時間切れで計測できず

2．NGSデータ
Illumina社のGAから出てきたfastqファイル
13GBと12GB (ペアーエンド)

ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/fastq/DRA000/DRA000222/
All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication

bwa-0.6.2の計算の流れ

FX-10でプロファイルを取得した。
１． ゲノムインデックスの作成(逐次計算)
２． アライメント処理(pthread)
16 threads で計算
３． マッピング処理(逐次計算)

212 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication
アライメント処理(ala)詳細プロファイルの実行時間

FX-10でプロファイルを取得した。(16 threads)
ELAPSE TIME (USE)CPU TIME (TOTAL)

PA1

01:04:48 (3888)

50746660 ms

PA2

01:05:03 (3903)

50745960 ms

PA3

01:04:31 (3871)

50656650 ms

PA4

01:04:49 (3889)

50726070 ms

PA5

01:14:13 (4453)

51262090 ms

PA6

01:04:39 (3879)

50635080 ms

PA7

01:11:15 (4275)

51204460 ms

実行時間にばらつきが生じる。
All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and CommunicationhņĬěĦĹč ~

()

ľĿ

()

$%LMBFGJ58=< 2%#%%"%

LMBFGJ58=< 2

<A5 2
LMB7H@:I58=< 2

%



!%%LMB7H@:I58=< 2 2%

 2

%%  2%

D6@? 2%CJ5 2%%/&'9E@A%

133 2%'-,*+..%







9E@A%













K;<>04%9E@A%

%'-,*+..















9E@A











ÊË%

213 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and CommunicationhņĬěĦĹč ~
メモリ・キャッシュエンジン ビジー率     







 

 

 

    

 

 

 

 





SIMD命令率  





  

    





  







    







  ÊÌ

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and CommunicationhņĬěĦĹč ~
キャッシュミス率（/ロード・ストア数）
 

































 L1Dキャッシュミス内訳（/L1Dキャッシュミス数）
 







  





 





 

L２キャッシュミス内訳（/Ｌ２キャッシュミス数）








 









  

ÊÍ

214 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and CommunicationhņĬěĦĹč ~
実行時間内訳 [概略] （/実行時間)
'#$'#$

&#"  )!     

'#$%(  

 

 

 

 

 
 

   

     

   

 

 



 

命令内訳 (/有効総命令数)
   
 















 



  









  ÊÎ

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communication
マッピング処理(sampe)
詳細プロファイルの実行時間

FX-10でプロファイルを取得した。(1 thread)
ELAPSE TIME (USE)CPU TIME (TOTAL)

PA1

02:49:54 (10194)

10080340 ms

PA2

02:51:48 (10308)

10191260 ms

PA3

02:51:05 (10265)

10159770 ms

PA4

02:51:32 (10292)

10176190 ms

PA5

02:50:48 (10248)

10132920 ms

PA6

02:51:30 (10290)

10184520 ms

PA7

02:51:38 (10298)

10196100 ms

実行時間にばらつきはない。
215 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communicationh  ņĬěĦĹč ~

()

ľĿ

()

%

%

LMBFGJ58=< 2$%

LMBFGJ58=< 2

<A5 2

%

#%

LMB7H@:I58=< 2%

LMB7H@:I58=< 2"% 2

%

!%

 2

%  2
%%

%

D6@? 2
CJ5 2%

/&'9E@A

%

133 2%

%

9E@A%

K;<>04

%

9E@A%

%
'-,*+..









'-,*+..









9E@A











%














ÊÐ 



All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communicationh  ņĬěĦĹč ~
メモリ・キャッシュエンジン ビジー率     







 

 

 

 

    

 

 

 





SIMD命令率  





  





    





  





    







  

ÊÑ

216 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communicationh  ņĬěĦĹč ~
キャッシュミス率（/ロード・ストア数）
 






































 L1Dキャッシュミス内訳（/L1Dキャッシュミス数）
 







  





 





 

L２キャッシュミス内訳（/Ｌ２キャッシュミス数）








 









  ËÈ

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

Yokohama,, ACCC,, RIKEN
Advanced Center for Computing and Communicationh  ņĬěĦĹč ~
実行時間内訳 [概略] （/実行時間)
'#$'#$

&#"  

)!    

 

 

 

'#$%(  

 

 



 

 

 



 

命令内訳 (/有効総命令数)
   
 






 
 

   

     

  










 








  







  

ËÉ

217 / 253

All Rights Reserved, Copyright © Yokohama, ACCC, RIKEN  2013

SS研 ポストペタアプリ性能WG資料

BWAのFX10性能報告

2014年12月10日
富士通株式会社
ＴＣソリューション事業本部
Copyright 2014 FUJITSU LIMITED

目次
 目的・アプリ概要
 動作環境・実行結果
 プロファイラ結果
 関数呼び出し･ループ構造
 精密ＰＡ情報
 ソースコード分析
 まとめ

1

218 / 253

Copyright 2014 FUJITSU LIMITED目的・アプリ概要
 目的
 FX10実行でホットスポットの特定• ホットスポット特定はfipp ホットスポットの演算パターン、メモリアクセスパターン分析• 分析方法は、1．精密PA 2．ソースコード分析

 アプリ概要
 アプリ名：bwa (Burrows-Wheeler Alignment Tool)

 処理概要： ゲノムマッピングを行うツール。複数回プログラム実行が必要。
インデックスファイル作成

アライメント実行1
アライメント実行2

マッピング実行 バージョン： 0.5.10
 並列化手法: pthredによる並列化。ＭＰＩ並列は無し。
 記述言語:C

 コード行数: 8940
 入力(NGS)データ： 日本人の公開ゲノムデータ
2

Copyright 2014 FUJITSU LIMITED

動作環境・全体実行時間
 動作環境
システム

FX10

CPU

SPARC64IXfx

周波数1.85GHz

コンパイラ

fccpx
P-id: T01641-04

オプション-Kfast -Xg -Nline

並列数

1プロセス1スレッド

ラージページ -p 256MB -d 256MB -h 256MB -s
256MB -t 256MB
サイズ

 全体実行時間

分析対象

インデックス
作成時間[s]アライメント1
実行時間[s]アライメント２
実行時間[s]マッピング
実行時間[s]

9,924

56,206

37,84534,9173

219 / 253

Copyright 2014 FUJITSU LIMITED分析のためのソース変更について
 目的
 実行時間短縮により効率的に分析を行うため

 ソース変更内容
 繰り返し部(bwtaln.cのline180-２２６)の繰り返し数が３回目に入った直後に強制的にループを抜ける処理の追加
ソース変更前void bwa_aln_core(const char *prefix, const char *fn_fa, const gap_opt_t *opt)
中略while ((seqs = bwa_read_seq(ks, 0x40000, &n_seqs, opt‐>mode, opt‐>trim_qual)) != 0) {tot_seqs += n_seqs;
中略bwa_free_read_seq(n_seqs, seqs);
fprintf(stderr, "[bwa_aln_core] %d sequences have been processed.¥n", tot_seqs);}

ソース変更後void bwa_aln_core(const char *prefix, const char *fn_fa, const gap_opt_t *opt){
int fj_iter=0;
中略
while ((seqs = bwa_read_seq(ks, 0x40000, &n_seqs, opt‐>mode, opt‐>trim_qual)) != 0) {tot_seqs += n_seqs;//fj >
fj_iter++;
if (fj_iter ==3 ) break;//fj <
中略bwa_free_read_seq(n_seqs, seqs);
fprintf(stderr, "[bwa_aln_core] %d sequences have been processed.¥n", tot_seqs);
}

変更前
変更後

4

繰り返し数
252
2

Copyright 2014 FUJITSU LIMITED

プロファイラ結果
 アライメント１
 サンプリング間隔は10msec
全体実行
時間[s]
512.01

MFlops
0.12

Flops
ピーク比
0.00%

ＭＩＰＳ
1,616.94

コスト分布(関数単位)
関数名__GI_memcpy
bwt_match_gap
bwt_2occ4
bwt_match_exact_alt
bwt_2occ
合計

MIPS
ピーク比
21.87%

Memスループット(MB/s)
347.82

Mem
ピーク比
0.41%

コスト分布(ループ単位)

開始行 終了行 実行時間[s] 割合(%)--129.61 26.08
104
264121.22 24.39
177
214
120.69 24.29
235
250
86.28 17.36
116
151
29.55
5.95
487.35 98.07

関数名
開始行
終了行 実行時間[s] 割合(%)
bwt_2occ4 (*1)
170
171
30.84
6.21
bwt_2occ4
202
203
27.05
5.44
bwt_match_exact_alt (*1)
105
106
23.72
4.77
bwt_match_exact_alt (*1)
137
138
15.08
3.03
bwt_match_gap
129
147
12.45
2.51
bwt_2occ
105
106
8.96
1.80
bwt_match_gap
246
252
6.73
1.35
bwt_2occ4
208
208
5.86
1.18
合計
130.69 26.30• 高コスト関数にＩＯは含まれない。
したがって、IOは2%未満。
*1 インライン展開された関数からの呼び出し• 浮動小数点演算はほぼ零• 関数単位で見るとコストは集中しているが、ループ単位では分散→ ループ以外の処理もコストが高い• __GI_memcpyの99%以上はbwt_match_gapからの呼び出し。
5

220 / 253

Copyright 2014 FUJITSU LIMITEDプロファイラ結果 アライメント2
 サンプリング間隔は10msec
全体実行
時間[s]
312.52

MFlops

Flops
ピーク比

0.16

0.00%

ＭＩＰＳ

MIPS
ピーク比

1,304.24

コスト分布(関数単位)
関数名
bwt_match_exact_alt__GI_memcpy
bwt_match_gap
bwt_2occ4
bwt_2occ
合計

17.64%

Memスループット(MB/s)
434.20

Mem
ピーク比
0.51%

コスト分布(ループ単位)

開始行 終了行 実行時間[s] 割合(%)
235250
144.31 47.96--50.45 16.77
104
264
49.40 16.42
177
214
33.57 11.16
116
151
14.72
4.89
292.45 97.19

関数名
開始行
終了行 実行時間[s] 割合(%)
bwt_match_exact_alt(*1)
137
138
32.16 10.69
bwt_match_exact_alt(*1)
105
106
31.17 10.36
bwt_2occ4 (*1)
170
171
13.39
4.45
bwt_match_gap
129
147
4.82
1.60
bwt_2occ4
202
203
4.50
1.49
bwt_match_gap
246
252
4.40
1.46
bwt_2occ
105
106
3.93
1.31
bwt_match_exact_alt
240
247
3.87
1.29
合計
98.25 32.65• アライメント１とほぼ同じ傾向• 高コスト関数にＩＯは含まれない。
*1 インライン展開された関数からの呼び出ししたがって、ＩＯは3%未満。
• アライメント１との違いは、関数･ループ単位共にbwt_match_exact_altのコストが上昇している点。アライメント2では1よりもbwt_match_exact_altの呼び出し回数が多い。詳細は次ページ参照。
6

Copyright 2014 FUJITSU LIMITED

関数呼び出し・ループ構造
 関数呼び出し構造

精密ＰＡ測定区間

0 main1 +-- bwa_aln
2 +--bwa_aln_corewhile(回転数:2)(*1)
3+-- bwa_cal_sa_reg_gap
for(回転数:262,144)4+-- bwt_match_gap
while(回転数:平均730.49)
5+-- bwt_match_exact_alt
for(回転数：平均4.78)
6+-- bwt_2occ(*2)
for(回転数:平均6.86)
7+-- bwt_occ(*2)
for(回転数:平均2.98)
5+-- bwt_2occ4
for(回転数：平均3.13)
6+-- bwt_occ4(*2)
for(回転数：平均6.89)
後略

呼び出し回数 呼び出し回数
アライメント１ アライメント２
main1
1
bwa_aln1
1
bwa_aln_core
11
bwa_cal_sa_reg_gap
2(*1)
2(*1)
bwt_math_gap
524,288524,288bwt_2occ4
875,091,049 215,852,571
bwt_occ4 (*2)
310,014,082 128,954,096
bwt_mathc_exact_alt
62,030,259 151,061,822
bwt_2occ (*2)
316,942,742 548,009,172
bwt_occ (*2)
118,684,080 162,986,465
関数名*1 ソース変更による変更あり。オリジナルでは252回。
*2 インライン展開対象

 呼び出し回数の多い関数の一部はasisでインライン展開済み→ソース修正でbwt_2occ4, bwt_mathc_exact_altのインライン展開を試行したが性能向上無し
 呼び出し回数の多い関数のループは回転数が小さく1回あたりの実行時間が短いため精密ＰＡ採取不可。
7221 / 253

Copyright 2014 FUJITSU LIMITED精密ＰＡ情報
 測定区間 bwt_match_exact_altおよびbwt_occ4呼び出しを含むループ
start_collection("bwt_match_gap");
while (stack‐>n_entries) {中略
if (i == 0) hit_found = 1;
else if (m == 0 && (e.state == STATE_M || (opt‐>mode&BWA_MODE_GAPE) || e.n_gape == opt‐>max_gape)) {if (bwt_match_exact_alt(bwt, i, str, &k, &l)) hit_found = 1;
else continue; // no hit, skip}
中略bwt_2occ4(bwt, k ‐ 1, l, cnt_k, cnt_l); // retrieve Occ values}
stop_collection("bwt_match_gap");*_n_aln = n_aln;

実行時間 (sec)
420.98[秒]
4.5E+02
4.0E+02
3.5E+02
3.0E+02

MFLOPS

MIPS
0

1829

ロードストア 浮動小数点演算
命令数
命令数
1.74293E+11
0.00E+00

その他
命令数
5.25E+11

有効総命令数7.70E+11

L1D ミス dm率 L2 ミス dm 率(/L1D ミス数)(/L2 ミス数)
92.91%
84.66%

2.5E+02
2.0E+02
1.5E+02
1.0E+02
5.0E+01
0.0E+00
bwt_match_gap

・整数演算比率が高い
・アクセス待ちが多いがバンド幅
ネックではない・プリフェッチが効いていない8

Copyright 2014 FUJITSU LIMITED

ソースコード分析 bwt_match_exact_alt

赤字:インライン展開対象
青字：Define文

int bwt_match_exact_alt(const bwt_t *bwt, int len, const ubyte_t *str, bwtint_t *k0,
bwtint_t *l0){
int i;
bwtint_t k, l, ok, ol;
k = *k0; l = *l0;for (i = len ‐ 1; i >= 0; ‐‐i) {ubyte_t c = str[i];if (c > 3) return 0; // there is an N here. no match
bwt_2occ(bwt, k ‐ 1, l, c, &ok, &ol);k = bwt‐>L2[c] + ok + 1;
l = bwt‐>L2[c] + ol;
if (k > l) return 0; // no match}*k0 = k; *l0 = l;return l ‐ k + 1;}

コスト8位ループ(1.35%, 平均4.78回)

Ｌ２はリストアクセス(要素数5)

inline void bwt_2occ(const bwt_t *bwt, bwtint_t k, bwtint_t l, ubyte_t c, bwtint_t *ok,bwtint_t *ol){bwtint_t _k, _l;if (k == l) {*ok = *ol = bwt_occ(bwt, k, c);return;}_k = (k >= bwt‐>primary)? k‐1 : k;_l = (l >= bwt‐>primary)? l‐1 : l;if (_l/OCC_INTERVAL != _k/OCC_INTERVAL || k == (bwtint_t)(‐1) || l == (bwtint_t)(‐1)) {*ok = bwt_occ(bwt, k, c);*ol = bwt_occ(bwt, l, c);} else {bwtint_t m, n, i, j;
uint32_t *p;
if (k >= bwt‐>primary) ‐‐k;if (l >= bwt‐>primary) ‐‐l;n = (p = bwt_occ_intv(bwt, k))[c];続く9222 / 253

Copyright 2014 FUJITSU LIMITEDソースコード分析 bwt_match_exact_alt

赤字:インライン展開対象
青字：Define文

p += 4;// calculate *ok
j = k >> 5 << 5;
for (i = k/OCC_INTERVAL*OCC_INTERVAL; i < j; i += 32, p += 2)n += __occ_aux((uint64_t)p[0]<<32 | p[1], c);m = n;

コスト4位ループ(3.03%, 平均6.86回)
ビット演算2回、整数演算1回、連続アクセス(p)n += __occ_aux(((uint64_t)p[0]<<32 | p[1]) & ~((1ull<<((~k&31)<<1)) ‐ 1), c);
if (c == 0) n ‐= ~k&31; // corrected for the masked bits *ok = n;// calculate *ol
j = l >> 5 << 5;
for (; i < j; i += 32, p += 2)
m += __occ_aux((uint64_t)p[0]<<32 | p[1], c);}}

ビット演算8回、整数演算１回
コスト19位ループ(0.02%、回転数未調査)
ビット演算2回、整数演算1回、連続アクセス(p)m += __occ_aux(((uint64_t)p[0]<<32 | p[1]) & ~((1ull<<((~l&31)<<1)) ‐ 1), c);
if (c == 0) m ‐= ~l&31; // corrected for the masked bits
*ol = m;

ビット演算8回、整数演算１回

static inline int __occ_aux(uint64_t y, int c){
y = ((c&2)? y : ~y) >> 1 & ((c&1)? y : ~y) & 0x5555555555555555ull;
y = (y & 0x3333333333333333ull) + (y >> 2 & 0x3333333333333333ull);
return ((y + (y >> 4)) & 0xf0f0f0f0f0f0f0full) * 0x101010101010101ull >> 56;}

最内ループから呼び出し。
ビット演算13回、整数演算3回

inline bwtint_t bwt_occ(const bwt_t *bwt, bwtint_t k, ubyte_t c){bwtint_t n, l, j;
uint32_t *p;
if (k == bwt‐>seq_len) return bwt‐>L2[c+1] ‐ bwt‐>L2[c];if (k == (bwtint_t)(‐1)) return 0;
if (k >= bwt‐>primary) ‐‐k; // because $ is not in bwt// retrieve Occ at k/OCC_INTERVAL
n = (p = bwt_occ_intv(bwt, k))[c];続く10

Copyright 2014 FUJITSU LIMITED

ソースコード分析 bwt_match_exact_alt

赤字:インライン展開対象
青字：Define文

p += 4; // jump to the start of the first BWT cellj = k >> 5 << 5;
for (l = k/OCC_INTERVAL*OCC_INTERVAL; l < j; l += 32, p += 2)n += __occ_aux((uint64_t)p[0]<<32 | p[1], c);// calculate Occ
n += __occ_aux(((uint64_t)p[0]<<32 | p[1]) & ~((1ull<<((~k&31)<<1)) ‐ 1), c);
if (c == 0) n ‐= ~k&31; // corrected for the masked bits}

コスト3位ループ(4.77%, 平均2.98回)
ビット演算2回、整数演算1回、連続アクセス(p)ビット演算8回、整数演算1回

return n;#define bwt_occ_intv(b, k) ((b)‐>bwt + (k)/OCC_INTERVAL*12)

 最内ループのメモリアクセスは連続アクセス。
 最内ループの1回転辺りの演算数は、一定。
• 64バイト型のビット演算15回(and 7, or 1, not 2, 右シフト 4, 左シフト 1)、
整数演算4回(和算3回、積算1回)、ループ制御変数インクメント

 最内ループは演算数19に対してストリーム数1。

11

223 / 253

Copyright 2014 FUJITSU LIMITEDソースコード分析 bwt_2occ4
inline void bwt_2occ4(const bwt_t *bwt, bwtint_t k, bwtint_t l, bwtint_t cntk[4],bwtint_t cntl[4]){bwtint_t _k, _l;if (k == l) {bwt_occ4(bwt, k, cntk);
memcpy(cntl, cntk, 4 * sizeof(bwtint_t));
return;}_k = (k >= bwt‐>primary)? k‐1 : k;_l = (l >= bwt‐>primary)? l‐1 : l;if (_l/OCC_INTERVAL != _k/OCC_INTERVAL || k == (bwtint_t)(‐1) || l == (bwtint_t)(‐1)) {bwt_occ4(bwt, k, cntk);
bwt_occ4(bwt, l, cntl);} else {bwtint_t i, j, x, y;
uint32_t *p;
int cl[4];if (k >= bwt‐>primary) ‐‐k; // because $ is not in bwt
if (l >= bwt‐>primary) ‐‐l;cl[0] = cl[1] = cl[2] = cl[3] = 0;p = bwt_occ_intv(bwt, k);memcpy(cntk, p, 4 * sizeof(bwtint_t));p += 4;// prepare cntk[]
j = k >> 4 << 4;
for (i = k / OCC_INTERVAL * OCC_INTERVAL, x = 0; i < j; i += 16, ++p)x += __occ_aux4(bwt, *p);y = x;
x += __occ_aux4(bwt, *p & ~((1U<<((~k&15)<<1)) ‐ 1)) ‐ (~k&15);// calculate cntl[] and finalize cntk[]
j = l >> 4 << 4;
for (; i < j; i += 16, ++p) y += __occ_aux4(bwt, *p);y += __occ_aux4(bwt, *p & ~((1U<<((~l&15)<<1)) ‐ 1)) ‐ (~l&15);
memcpy(cntl, cntk, 16);
cntk[0] += x&0xff; cntk[1] += x>>8&0xff; cntk[2] += x>>16&0xff; cntk[3] += x>>24;
cntl[0] += y&0xff; cntl[1] += y>>8&0xff; cntl[2] += y>>16&0xff; cntl[3] += y>>24;}}

赤字:インライン展開対象
青字：Define文コスト2位ループ(5.44%, 平均3.13回)
整数演算1回、連続アクセス(p)コスト9位ループ(1.17%, 回転数未調査)
ビット演算7回、整数演算3回続く
12

Copyright 2014 FUJITSU LIMITED

ソースコード分析 bwt_2occ4
inline void bwt_occ4(const bwt_t *bwt, bwtint_t k, bwtint_t cnt[4]){bwtint_t l, j, x;
uint32_t *p;
if (k == (bwtint_t)(‐1)) {memset(cnt, 0, 4 * sizeof(bwtint_t));
return;}if (k >= bwt‐>primary) ‐‐k; // because $ is not in bwt
p = bwt_occ_intv(bwt, k);memcpy(cnt, p, 16);
p += 4;
j = k >> 4 << 4;
for (l = k / OCC_INTERVAL * OCC_INTERVAL, x = 0; l < j; l += 16, ++p)x += __occ_aux4(bwt, *p);x += __occ_aux4(bwt, *p & ~((1U<<((~k&15)<<1)) ‐ 1)) ‐ (~k&15);
cnt[0] += x&0xff; cnt[1] += x>>8&0xff; cnt[2] += x>>16&0xff; cnt[3] += x>>24;}#define bwt_occ_intv(b, k) ((b)‐>bwt + (k)/OCC_INTERVAL*12)#define __occ_aux4(bwt, b)¥((bwt)‐>cnt_table[(b)&0xff] + (bwt)‐>cnt_table[(b)>>8&0xff]¥+ (bwt)‐>cnt_table[(b)>>16&0xff] + (bwt)‐>cnt_table[(b)>>24])

赤字:インライン展開対象
青字：Define文コスト1位ループ(6.21%, 平均6.86)
整数演算1回、連続アクセス(p)ビット演算7回、整数演算3回最内ループから呼び出し。ビット演算
6回、整数演算3回、cnt_tableはリストアクセス(要素数256）

 最内ループで4回リストアクセス(bwt->cnt_table)あり。要素数は256でＬ１キャッシュに収まるサイズ。
 最内ループの1回転辺りの演算数は、一定。
• 64バイト型のビット演算6回(and 3, 右シフト 3)、整数演算4回(和算4回)、ループ制御変数インクメント

 最内ループは演算数10に対して、ストリーム数4。
13

224 / 253

Copyright 2014 FUJITSU LIMITEDソースコード分析 bwt_match_gap(__GI_memcpy関連処理)

赤字:__GI_memcpy関連処理

bwt_aln1_t *bwt_match_gap(bwt_t *const bwts[2], int len, const ubyte_t *seq[2],bwt_width_t *w[2],bwt_width_t *seed_w[2], const gap_opt_t *opt, int *_n_aln, gap_stack_t*stack){int best_score = aln_score(opt‐>max_diff+1, opt‐>max_gapo+1, opt‐>max_gape+1, opt);
int best_diff = opt‐>max_diff + 1, max_diff = opt‐>max_diff;
int best_cnt = 0;
int max_entries = 0, j, _j, n_aln, m_aln;bwt_aln1_t *aln;m_aln = 4; n_aln = 0;aln = (bwt_aln1_t*)calloc(m_aln, sizeof(bwt_aln1_t));
中略while (stack‐>n_entries) {中略
if (do_add) { // append
bwt_aln1_t *p;
gap_shadow(l ‐ k + 1, len, bwt‐>seq_len, e.last_diff
if (n_aln == m_aln) {m_aln <<= 1;
aln = (bwt_aln1_t*)realloc(aln, m_aln * sizeof(bwt_aln1_t));memset(aln + m_aln/2, 0, m_aln/2*sizeof(bwt_aln1_t));}p = aln + n_aln;p‐>n_mm = e.n_mm; p‐>n_gapo = e.n_gapo; p‐>n_gape = e.n_gape; p‐>a = a;p‐>k = k; p‐>l = l;p‐>score = score;++n_aln;}中略}}*_n_aln = n_aln;//fprintf(stderr, "max_entries = %d¥n", max_entries);
return aln;

初めに4要素の構造体(bwt_aln1_t)で領域確保および0で初期化。構造体のサイズは16バイト。

領域が足りなくなったら、2倍の領域をreallocで再確保。拡大領域をmemcpyで0初期化。

構造体の必要要素数が1増加

確保した領域の先頭アドレスが戻り値

14

Copyright 2014 FUJITSU LIMITED

ソースコード分析 bwt_match_gap(__GI_memcpy関連処理)
 __GI_memcpy関連の呼び出し回数を調査
コピーサイズ 呼び出し回数 呼び出し回数[byte]
アライメント1 アライメント2
calloc64524,288524,288
128
42,66259,379256
36,39552,211
512
23,18635,272
1,024
13,21020,420realloc
memset
2,048
5,549
8,653
4,096
1,120
1,438
8,192
48
56
16,38401

関数名

 約9割のケースで初めに確保(calloc)した領域から拡張無し。
 初めに確保する領域を大きく(2048バイト)する高速化を試行したが性能向上無し。 callocの呼び出し回数を減らす必要あり。

15

225 / 253

Copyright 2014 FUJITSU LIMITED

まとめ 関数単位ではコスト集中
 ユーザ定義の４関数で97％。
 高コスト関数にＩＯは含まれないためIOは3%未満。

 ループ単位ではコスト分散
 上位8ループで約30%。

 整数演算がメイン
 精密ＰＡ結果より70%が整数演算関連の命令。浮動小数点演算は零。
 精密ＰＡ結果よりプリフェッチ効果なし。
 ソースコード分析により高コストループは以下の2パターン。
1. ビット演算15 + 整数演算４に対してメモリアクセスは連続でストリーム数1
2. ビット演算6 + 整数演算4に対してリストアクセスでストリーム数4

 calloc,reallocによる初期化･領域拡張のコストが高い。
 bmt_match_gapから呼び出し。
アライメント1では26%、アライメント2では11%16

Copyright 2014 FUJITSU LIMITED

17

Copyright 2014 FUJITSU LIMITED

226 / 253

SS研 ポストペタアプリ性能WG資料

BWAのFX100性能報告

2015年12月3日
富士通株式会社
ＴＣソリューション事業本部
TCフロンティアセンター
Copyright 2015 FUJITSU LIMITED

目次
 アプリ概要
 評価動作環境、実行結果
 プロファイラ結果
 スレッド数による性能、使用メモリ量の変化
 ＦＸ１００精密ＰＡ情報 プリフェッチが効かない理由
 手動プリフェッチの可能性
 まとめ

1

227 / 253

Copyright 2015 FUJITSU LIMITEDアプリ概要 アプリ概要
 アプリ名：bwa (Burrows-Wheeler Alignment Tool)

 処理概要： ゲノムマッピングを行うツール。複数回プログラム実行が必要。
インデックスファイル作成

アライメント実行1
アライメント実行2

マッピング実行 バージョン： 0.5.10 (最新版は0.7.12)
 並列化手法: pthredによる並列化。ＭＰＩ並列は無し。
 記述言語:本報告で評価C

 コード行数: 8940
 入力(NGS)データ： 日本人の公開ゲノムデータ

2

Copyright 2015 FUJITSU LIMITED

評価動作環境・全体実行時間
 評価動作環境

 評価条件

システム

FX10

FX100

実行コマンド./bwa aln

周波数1.85GHz

1.975GＨＺ

入力ファイル

Simd幅

2

4

DRR000606_1.fa
stq

評価繰り返し数

オプション-Kfast -Xg Nline-Kfast -Xg Nline

100(コスト分布,
スケーラビリティ)
2(精密PA）

並列数

1コア

1コア

IO量

8625.1 MB

ただし並列性能調査時
は8,16,32コアも評価

 実行時間
システム

FX10

FX100

性能
向上率

実行時間[s]16885.48(Elapse)17576.08

0.96

実行時間[s]16801.84(User)

17176.89

0.98

3228 / 253

・FX10と比較してFX100では(ElapseUser)時間(=IO時間)が大きい。
・IO時間を除いてもFX10→FX100で0.98倍性能劣化

Copyright 2015 FUJITSU LIMITED

関数呼び出し・ループ構造
 呼び出し構造
精密ＰＡ測定区間

0 main1 +-- bwa_aln
2 +--bwa_aln_corewhile(回転数:2 or 100)
3+-- bwa_cal_sa_reg_gap
for(回転数:262,144)4+-- bwt_match_gap
while(回転数:平均730.49)
5+-- bwt_match_exact_alt
for(回転数：平均4.78)
6+-- bwt_2occ
for(回転数:平均6.86)
7+-- bwt_occ
for(回転数:平均2.98)
5+-- bwt_2occ4
for(回転数：平均3.13)
6+-- bwt_occ4
for(回転数：平均6.89)
後略

２回： 精密PA、プリフェッチ調査
100回：コスト分布、並列性能調査

インライン展開対象

4

Copyright 2015 FUJITSU LIMITED

プロファイラ結果
 FX10コスト分布(関数単位)関数名
bwt_2occ4
bwt_match_gap
bwt_match_exact_alt
bwt_2occ
合計

開始行
182
104
254
116
-

コスト分布(ライン単位)
終了行
233
264
269
151
-

実行時間[s]割合(%)

7200.04 42.85
4430.56 26.37
3811.79 22.69
1005.05
5.98
16447.44 97.89

 FX100

コスト分布(関数単位)関数名
bwt_2occ4
bwt_match_gap
bwt_match_exact_alt
bwt_2occ
合計

開始行
182
104
177
116
-

関数名
bwt_2occ4
bwt_2occ4
bwt_2occ4
bwt_2occ4
bwt_match_exact_alt
bwt_match_gap
bwt_match_exact_alt
合計

開始行 実行時間[s] 割合(%)
170
1526.18 9.08
211
1318.41 7.85
1761033.61 6.15
218
960.20 5.71
105
780.96 4.65
51
663.56 3.95
137
548.96 3.27
6831.87 40.66

コスト分布(ライン単位)
終了行
233
266
214
151
-

割合
実行時間[s](%)
7647.314173.703982.811089.7116893.52

関数名

44.49
24.28
23.17
6.34
98.28

 結果

bwt_2occ4
bwt_2occ4
bwt_match_exact_alt
bwt_2occ4
bwt_2occ4
bwt_match_exact_alt
bwt_match_gap
合計

開始行
170
211
105
176
218
137
51
-

割合
(%)
2264.77 13.18
1973.11 11.48
1558.28 9.07
985.76 5.73
722.84 4.21
576.79 3.36
517.34 3.01
8598.89 50.03

実行時間[s] FX10, FX100ともに上位4関数でほぼ100%
 ライン単位では上位7処理で約50%
5229 / 253

Copyright 2015 FUJITSU LIMITEDFX100スレッド並列性能・メモリ使用量
 実行結果 並列性能 1スレッド実行→32スレッド実行で13.79倍性能向上
 16スレッド実行→32スレッド実行で1.44倍性能向上→理想値より性能向上率は低いが並列性は高い

 メモリ使用量
 1スレッド実行→３２スレッド実行で1.34倍増加
6

Copyright 2015 FUJITSU LIMITED

精密ＰＡ比較
 評価区間はbwt_match_gap
環境[秒]
4.5E+02

FX100
FX10

4.0E+02

メモリビジー L2エンジン L1エンジン L1D ミス dm率 L2 ミス dm 率率
ビジー率
ビジー率 (/L1D ミス数) (/L2 ミス数)
0.55%
0.31%
17.91%
95.98%
90.83%
0.55%
0.45%
21.75%
92.98%
80.69%

3.5E+02
3.0E+02

命令コミット

2.5E+02

整数レジスタ書き込み制約

2.0E+02

整数ロードＬ１Ｄアクセス待ち

1.5E+02

ミスの大半がdmミス→プリフェッチが効いていない

整数ロードL2アクセス待ち

1.0E+02

整数ロードキャッシュアクセス待ち

5.0E+01
整数ロードメモリアクセス待ち

0.0E+00
FX100

FX10

 メモリ、キャッシュビジー率が低い
 メモリアクセス待ち、キャッシュアクセス待ちの割合が高い→プリフェッチが効いていない
7

230 / 253

Copyright 2015 FUJITSU LIMITEDプリフェッチが効かない理由 ポインタ変数が指すアドレスが連続でないため(インダイレクト)#define OCC_INTERVAL 0x80
#define bwt_occ_intv(b, k) ((b)->bwt + (k)/OCC_INTERVAL*12)中略
157 inline void bwt_occ4(const bwt_t *bwt, bwtint_t k, bwtint_t cnt[4])158 {159 bwtint_t l, j, x;
160 uint32_t *p;
161 int i;
162 if (k == (bwtint_t)(-1)) {163 memset(cnt, 0, 4 * sizeof(bwtint_t));
164 return;165 }166 if (k >= bwt->primary) --k; // because $ is not in bwt
167 p = bwt_occ_intv(bwt, k);
168 // memcpy(cnt, p, 16);169 for(i=0;i<4;i++){
170 cnt[i]=*p;
171 p++;
172 }

コスト分布1位の処理

前回呼び出しから2.7GB離れたアドレス参照

 最大で2.7ＧＢはなれたアドレスを参照
 ポインタ変数p移動距離に規則性がないように見える 繰り返し毎にどのアドレスを参照するか事前にわかれば手動でプリフェッチ発
行可能
8Copyright 2015 FUJITSU LIMITED

手動プリフェッチの可能性について ポインタpの参照先を事前に把握可能か？
 ポインタｐの参照先更新がいつ行われるか調査
ポインタpの参照先更新の概略
bwt_match_gap
while{
gap_pop(stack, &e);

構造体eの値更新

k = e.k;k=構造体eのローカル変数

bwt_2occ4(bwt, k - 1, l, cnt_k, cnt_l);pの参照先更新
更新先は変数kによって決定
構造体stackの値更新

中略
gap_push(stack, a, i + 1, k, l, ･･･);}

 ポインタpの参照先を決定する変数kはpの参照先更新の直前に定義
 kの定義する構造体eはその直前に値更新。e=構造体stackのローカル構造体。
 構造体stackは前の繰り返し最後に値更新。

ポインタpの参照先を事前に把握は不可!!
→手動プリフェッチ設定は不可
9231 / 253

Copyright 2015 FUJITSU LIMITEDまとめ bwa単体性能
 ＦＸ１０と比較してＦＸ１００において性能向上しない→ボトルネックはメモリ、キャッシュアクセスのレイテンシ→ポインタ変数がインダイレクトアクセスでプリフェッチが効かないことが原因→プログラム構造上プリフェッチを効かせる事は難しい。

 bwa並列性能
 並列実行によるメモリ使用量は微増、並列性能は比較的良好→メニーコアによる並列実行に適性あり。

10

Copyright 2015 FUJITSU LIMITED

11

Copyright 2015 FUJITSU LIMITED

232 / 253