SlideShare une entreprise Scribd logo
1  sur  31
Télécharger pour lire hors ligne
Intel TSX HLE を触ってみた
追加実験 (TTAS)	
2013-10-22
星野喬@サイボウズ・ラボ / @starpoz	

1
頂いたコメント	

2
TTAS (test-and-test-and-set)	
•  Test and test-and-set	
class Spinlock // TTAS and HLE support
{
private:
char &lock_;
public:
explicit SpinlockHle(char &lock) : lock_(lock) {
int flags = __ATOMIC_ACQUIRE | __ATOMIC_HLE_ACQUIRE;
while (lock_ || __atomic_exchange_n(&lock_, 1, flags))
_mm_pause();
}
~SpinlockHle() noexcept {
int flags = __ATOMIC_RELEASE | __ATOMIC_HLE_RELEASE;
__atomic_clear(&lock_, flags);
}
};	
3
再実験	
•  Expr1: simple counter(s)
•  Expr5: map operations
•  詳細は元資料参照のこと
–  http://www.slideshare.net/starpos/intel-tsxhlex86opti6r2	

4
実験環境	
•  CPU: Core i7-4770
–  4cores 8HT
–  HT 有効
–  TurboBoost 有効

•  メモリ: 16GB
•  OS: Ubuntu 13.04 x86_64 kernel 3.8.19
•  コンパイラ: GCC 4.8.1
–  最適化フラグ: -O2 のみ

5
実験方法	
•  スレッドを必要なだけ起動して,X 秒間クリティカル
セクション (CS) を繰り返し実行
•  Spinlock を使って CS の排他を取る
–  HLE 有効/無効
–  TTAS 有効/無効
–  終了判定のために CS 実行毎に atomic<bool> を load
するオーバーヘッドあり

•  CS の実行回数の合計値を X で割ったものを
スループットとする
•  上記実験を Y 回行い,スループットの avg, min,
max を計算
6
Expr1: simple counter(s)	
•  クリティカルセクションループ
while (!isEnd_.load(std::memory_order_relaxed)) {
Spinlock<useHLE, useTTAS> lk(mutex_);
counter_++;
}	

•  パラメータ
–  競合率 100%: counter を全スレッドで共有
–  競合率 0%: スレッド毎に counter を持つ
•  キャッシュラインが異なるように 64byte 毎に配置
Counter	
Thread	
競合率 100%	

Thread	
競合率 0%	

Counter	
7
Expr1: collision 100%	

投機的実行がほとんど失敗するので HLE のオーバーヘッドが
スループットに反映してしまっていると思われる
TTAS は HLE と一緒に使っても効果が見える	

10 sec, 20 trials	

8
Expr1: collision 0%	

HLE なしでは明らかに TTAS を使った方が良い
HLE と一緒に使う場合でも効果があるようだ	

10 sec, 20 trials	

9
Expr1 まとめ	
•  そもそも競合しやすい状況では HLE は投機
実行に失敗しやすいのでオーバーヘッドの分
だけ損
•  競合しにくい状況では HLE はスケールする
ため,オイシイ
•  Expr1 だけ見ると,HLE の有無に関わらず
TTAS は常に効果がある

10
Expr5: 	
•  目的:
–  実用的なデータ構造で HLE の効果を知る

•  手段:
–  Map<uint32_t, uint32_t> をひとつの spinlock
で排他
–  read 比率を変える: 0%, 90%, 99%, 100%
•  read 操作: ランダムキーで lower_bound 検索
•  write 操作: ひとつ削除,その後 insert

–  初期アイテム数: 10K (約2MB), 1M (約100MB)
11
Expr5: std::map	

12
Expr5: 10K items read 0%	

HLE なしだと TTAS の効果が大きい
このパラメータでは HLE はオーバーヘッド大	

10 sec, 20 trials	

13
Expr5: 10K items read 90%	

HLE と TTAS を一緒に使うと並列度大の領域で効果が出る
ただし,並列度小だと HLE は足をひっぱる

10 sec, 20 trials	

14
Expr5: 10K items read 99%	

10 sec, 20 trials	

HLE の効果が見える.TTAS と組み合わせると一長一短

15
Expr5: 10K items read 100%	

HLE と TTAS の組み合わせが並列度大の領域で効果アリ
10 sec, 20 trials	
 TTAS ナシの場合は test-and-set の数によって律速しているのか?

16
Expr5: 1M items read 0%	

HLE の有無よりも TTAS の有無が大きな効果
TTAS は競合が多いときに test-and-set の実行数が減り,
HLE は競合が少ないときに楽観的投機実行が成功しやすいので,
この結果と矛盾しない

10 sec, 20 trials	

17
Expr5: 1M items read 90%	

Read が増えたので,HLE の効果が相対的に大きくなった
10K items のときと同様に TTAS との組み合わせ効果は
並列度によって一長一短

10 sec, 20 trials	

18
Expr5: 1M items read 99%	

10 sec, 20 trials	

さらに Read が増えたので並列度小の領域でも
HLE の楽観的実行が成功しやすくなったと思われる

19
Expr5: 1M items read 100%	

TTAS と HLE の組み合わせが大きな効果を発揮
10 sec, 20 trials	

20
Expr5: B-tree	

21
Expr5: 10K items read 0%	

10 sec, 20 trials	

HLE は並列度小では無駄.
TTAS のみを有効にした方が余程良い結果.

22
Expr5: 10K items read 90%	

10 sec, 20 trials	

std::map と傾向は変わらないが,HLE が効きやすい?
(実際のメモリ使用量の違いのせいかも知れない)

23
Expr5: 10K items read 99%	

10 sec, 20 trials	

HLE を使った方が良い結果に(std::map は一長一短のまま)
ただし並列度 1 を除く.
24
Expr5: 10K items read 100%	

read 99% と同様の結果.最高性能は std::map に及ばず
10 sec, 20 trials	

25
Expr5: 1M items read 0%	

10K items と同様の結果.
10 sec, 20 trials	

26
Expr5: 1M items read 90%	

アイテム数 10K から 1M に増えると
HLE のオーバーヘッドが相対的に小さくなったと見て良いか.
TTAS は常に有効.
並列度大の領域では HLE の投機実行失敗のペナルティが見える.

10 sec, 20 trials	

27
Expr5: 1M items read 99%	

10 sec, 20 trials	

read 90% と同様の傾向.
投機実行が成功しやすくなり,さらにスケールする.

28
Expr5: 1M items read 100%	

read 90%, 99% と同様(ry
10 sec, 20 trials	

29
Expr5: まとめ	
•  HLE のない世界では TTAS は常に効果アリ
•  HLE と TTAS を組み合わせると
–  並列度小だと投機実行そのものを抑えられてス
ループットが伸び悩むデメリットあり
–  並列度大だと一度に投機実行するスレッドを少な
く抑えることができるため効果あり
–  上記は今のところあまり自信のある仮説ではない

30
まとめ	
•  HLE と TTAS の組み合わせは一長一短
–  デフォルトを選べと言われたら HLE + TTAS
–  競合 100% の状況では TTAS のみ使う

•  HLE を使うべき条件
–  条件1: 競合が起きにくい (read 比率が高い)
–  条件2: クリティカルセクション実行時間が短い
–  条件3: アクセス対象メモリが少ない

•  条件 2, 3 を誰か探求してください..
31

Contenu connexe

Tendances

本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と MeltdownHirotaka Kawata
 
いいかげんな人のためのTransactional Memory Primer
いいかげんな人のためのTransactional Memory Primerいいかげんな人のためのTransactional Memory Primer
いいかげんな人のためのTransactional Memory PrimerYuto Hayamizu
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementationMITSUNARI Shigeo
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介MITSUNARI Shigeo
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチKazuki Onishi
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mclMITSUNARI Shigeo
 
Project Loom + Project Panama
Project Loom + Project PanamaProject Loom + Project Panama
Project Loom + Project PanamaYuichi Sakuraba
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
Mesh tensorflow
Mesh tensorflowMesh tensorflow
Mesh tensorflowkuroko
 
TensorFlow計算グラフ最適化処理
TensorFlow計算グラフ最適化処理TensorFlow計算グラフ最適化処理
TensorFlow計算グラフ最適化処理Atsushi Nukariya
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用MITSUNARI Shigeo
 
TensorFlow Operation 作ってみた
TensorFlow Operation 作ってみたTensorFlow Operation 作ってみた
TensorFlow Operation 作ってみたTakuya Sakamoto
 
Linux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutesLinux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutesYohei Azekatsu
 

Tendances (20)

本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown
 
いいかげんな人のためのTransactional Memory Primer
いいかげんな人のためのTransactional Memory Primerいいかげんな人のためのTransactional Memory Primer
いいかげんな人のためのTransactional Memory Primer
 
From IA-32 to avx-512
From IA-32 to avx-512From IA-32 to avx-512
From IA-32 to avx-512
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
optimal Ate pairing
optimal Ate pairingoptimal Ate pairing
optimal Ate pairing
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
 
Project Loom + Project Panama
Project Loom + Project PanamaProject Loom + Project Panama
Project Loom + Project Panama
 
Cpu cache arch
Cpu cache archCpu cache arch
Cpu cache arch
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
Mesh tensorflow
Mesh tensorflowMesh tensorflow
Mesh tensorflow
 
TensorFlow計算グラフ最適化処理
TensorFlow計算グラフ最適化処理TensorFlow計算グラフ最適化処理
TensorFlow計算グラフ最適化処理
 
Code jp2015 cpuの話
Code jp2015 cpuの話Code jp2015 cpuの話
Code jp2015 cpuの話
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
 
TensorFlow Operation 作ってみた
TensorFlow Operation 作ってみたTensorFlow Operation 作ってみた
TensorFlow Operation 作ってみた
 
Linux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutesLinux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutes
 
CPUの同時実行機能
CPUの同時実行機能CPUの同時実行機能
CPUの同時実行機能
 

Plus de Takashi Hoshino

Serializabilityとは何か
Serializabilityとは何かSerializabilityとは何か
Serializabilityとは何かTakashi Hoshino
 
Isolation Level について
Isolation Level についてIsolation Level について
Isolation Level についてTakashi Hoshino
 
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3Takashi Hoshino
 
トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2Takashi Hoshino
 
トランザクションの並行処理制御
トランザクションの並行処理制御トランザクションの並行処理制御
トランザクションの並行処理制御Takashi Hoshino
 
Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ 勉強会#8 Item38Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ 勉強会#8 Item38Takashi Hoshino
 
Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#6 Item25Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#6 Item25Takashi Hoshino
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Takashi Hoshino
 
WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法Takashi Hoshino
 
メモリより大きなデータの Sufix Array 構築方法の紹介
メモリより大きなデータの Sufix Array 構築方法の紹介メモリより大きなデータの Sufix Array 構築方法の紹介
メモリより大きなデータの Sufix Array 構築方法の紹介Takashi Hoshino
 
10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーションTakashi Hoshino
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤTakashi Hoshino
 
10分で分かるデータストレージ
10分で分かるデータストレージ10分で分かるデータストレージ
10分で分かるデータストレージTakashi Hoshino
 
Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介Takashi Hoshino
 
An Efficient Backup and Replication of Storage
An Efficient Backup and Replication of StorageAn Efficient Backup and Replication of Storage
An Efficient Backup and Replication of StorageTakashi Hoshino
 
ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法Takashi Hoshino
 
WalB: Block-level WAL. Concept.
WalB: Block-level WAL. Concept.WalB: Block-level WAL. Concept.
WalB: Block-level WAL. Concept.Takashi Hoshino
 
VMware Backup in Cybozu Labs
VMware Backup in Cybozu LabsVMware Backup in Cybozu Labs
VMware Backup in Cybozu LabsTakashi Hoshino
 

Plus de Takashi Hoshino (20)

Serializabilityとは何か
Serializabilityとは何かSerializabilityとは何か
Serializabilityとは何か
 
Isolation Level について
Isolation Level についてIsolation Level について
Isolation Level について
 
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
 
WalB Driver Internals
WalB Driver InternalsWalB Driver Internals
WalB Driver Internals
 
トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2
 
トランザクションの並行処理制御
トランザクションの並行処理制御トランザクションの並行処理制御
トランザクションの並行処理制御
 
Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ 勉強会#8 Item38Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ 勉強会#8 Item38
 
Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#6 Item25Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#6 Item25
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
 
WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法
 
メモリより大きなデータの Sufix Array 構築方法の紹介
メモリより大きなデータの Sufix Array 構築方法の紹介メモリより大きなデータの Sufix Array 構築方法の紹介
メモリより大きなデータの Sufix Array 構築方法の紹介
 
WalBの紹介
WalBの紹介WalBの紹介
WalBの紹介
 
10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ
 
10分で分かるデータストレージ
10分で分かるデータストレージ10分で分かるデータストレージ
10分で分かるデータストレージ
 
Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介
 
An Efficient Backup and Replication of Storage
An Efficient Backup and Replication of StorageAn Efficient Backup and Replication of Storage
An Efficient Backup and Replication of Storage
 
ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法
 
WalB: Block-level WAL. Concept.
WalB: Block-level WAL. Concept.WalB: Block-level WAL. Concept.
WalB: Block-level WAL. Concept.
 
VMware Backup in Cybozu Labs
VMware Backup in Cybozu LabsVMware Backup in Cybozu Labs
VMware Backup in Cybozu Labs
 

Intel TSX 触ってみた 追加実験 (TTAS)

  • 1. Intel TSX HLE を触ってみた 追加実験 (TTAS) 2013-10-22 星野喬@サイボウズ・ラボ / @starpoz 1
  • 3. TTAS (test-and-test-and-set) •  Test and test-and-set class Spinlock // TTAS and HLE support { private: char &lock_; public: explicit SpinlockHle(char &lock) : lock_(lock) { int flags = __ATOMIC_ACQUIRE | __ATOMIC_HLE_ACQUIRE; while (lock_ || __atomic_exchange_n(&lock_, 1, flags)) _mm_pause(); } ~SpinlockHle() noexcept { int flags = __ATOMIC_RELEASE | __ATOMIC_HLE_RELEASE; __atomic_clear(&lock_, flags); } }; 3
  • 4. 再実験 •  Expr1: simple counter(s) •  Expr5: map operations •  詳細は元資料参照のこと –  http://www.slideshare.net/starpos/intel-tsxhlex86opti6r2 4
  • 5. 実験環境 •  CPU: Core i7-4770 –  4cores 8HT –  HT 有効 –  TurboBoost 有効 •  メモリ: 16GB •  OS: Ubuntu 13.04 x86_64 kernel 3.8.19 •  コンパイラ: GCC 4.8.1 –  最適化フラグ: -O2 のみ 5
  • 6. 実験方法 •  スレッドを必要なだけ起動して,X 秒間クリティカル セクション (CS) を繰り返し実行 •  Spinlock を使って CS の排他を取る –  HLE 有効/無効 –  TTAS 有効/無効 –  終了判定のために CS 実行毎に atomic<bool> を load するオーバーヘッドあり •  CS の実行回数の合計値を X で割ったものを スループットとする •  上記実験を Y 回行い,スループットの avg, min, max を計算 6
  • 7. Expr1: simple counter(s) •  クリティカルセクションループ while (!isEnd_.load(std::memory_order_relaxed)) { Spinlock<useHLE, useTTAS> lk(mutex_); counter_++; } •  パラメータ –  競合率 100%: counter を全スレッドで共有 –  競合率 0%: スレッド毎に counter を持つ •  キャッシュラインが異なるように 64byte 毎に配置 Counter Thread 競合率 100% Thread 競合率 0% Counter 7
  • 8. Expr1: collision 100% 投機的実行がほとんど失敗するので HLE のオーバーヘッドが スループットに反映してしまっていると思われる TTAS は HLE と一緒に使っても効果が見える 10 sec, 20 trials 8
  • 9. Expr1: collision 0% HLE なしでは明らかに TTAS を使った方が良い HLE と一緒に使う場合でも効果があるようだ 10 sec, 20 trials 9
  • 10. Expr1 まとめ •  そもそも競合しやすい状況では HLE は投機 実行に失敗しやすいのでオーバーヘッドの分 だけ損 •  競合しにくい状況では HLE はスケールする ため,オイシイ •  Expr1 だけ見ると,HLE の有無に関わらず TTAS は常に効果がある 10
  • 11. Expr5: •  目的: –  実用的なデータ構造で HLE の効果を知る •  手段: –  Map<uint32_t, uint32_t> をひとつの spinlock で排他 –  read 比率を変える: 0%, 90%, 99%, 100% •  read 操作: ランダムキーで lower_bound 検索 •  write 操作: ひとつ削除,その後 insert –  初期アイテム数: 10K (約2MB), 1M (約100MB) 11
  • 13. Expr5: 10K items read 0% HLE なしだと TTAS の効果が大きい このパラメータでは HLE はオーバーヘッド大 10 sec, 20 trials 13
  • 14. Expr5: 10K items read 90% HLE と TTAS を一緒に使うと並列度大の領域で効果が出る ただし,並列度小だと HLE は足をひっぱる 10 sec, 20 trials 14
  • 15. Expr5: 10K items read 99% 10 sec, 20 trials HLE の効果が見える.TTAS と組み合わせると一長一短 15
  • 16. Expr5: 10K items read 100% HLE と TTAS の組み合わせが並列度大の領域で効果アリ 10 sec, 20 trials TTAS ナシの場合は test-and-set の数によって律速しているのか? 16
  • 17. Expr5: 1M items read 0% HLE の有無よりも TTAS の有無が大きな効果 TTAS は競合が多いときに test-and-set の実行数が減り, HLE は競合が少ないときに楽観的投機実行が成功しやすいので, この結果と矛盾しない 10 sec, 20 trials 17
  • 18. Expr5: 1M items read 90% Read が増えたので,HLE の効果が相対的に大きくなった 10K items のときと同様に TTAS との組み合わせ効果は 並列度によって一長一短 10 sec, 20 trials 18
  • 19. Expr5: 1M items read 99% 10 sec, 20 trials さらに Read が増えたので並列度小の領域でも HLE の楽観的実行が成功しやすくなったと思われる 19
  • 20. Expr5: 1M items read 100% TTAS と HLE の組み合わせが大きな効果を発揮 10 sec, 20 trials 20
  • 22. Expr5: 10K items read 0% 10 sec, 20 trials HLE は並列度小では無駄. TTAS のみを有効にした方が余程良い結果. 22
  • 23. Expr5: 10K items read 90% 10 sec, 20 trials std::map と傾向は変わらないが,HLE が効きやすい? (実際のメモリ使用量の違いのせいかも知れない) 23
  • 24. Expr5: 10K items read 99% 10 sec, 20 trials HLE を使った方が良い結果に(std::map は一長一短のまま) ただし並列度 1 を除く. 24
  • 25. Expr5: 10K items read 100% read 99% と同様の結果.最高性能は std::map に及ばず 10 sec, 20 trials 25
  • 26. Expr5: 1M items read 0% 10K items と同様の結果. 10 sec, 20 trials 26
  • 27. Expr5: 1M items read 90% アイテム数 10K から 1M に増えると HLE のオーバーヘッドが相対的に小さくなったと見て良いか. TTAS は常に有効. 並列度大の領域では HLE の投機実行失敗のペナルティが見える. 10 sec, 20 trials 27
  • 28. Expr5: 1M items read 99% 10 sec, 20 trials read 90% と同様の傾向. 投機実行が成功しやすくなり,さらにスケールする. 28
  • 29. Expr5: 1M items read 100% read 90%, 99% と同様(ry 10 sec, 20 trials 29
  • 30. Expr5: まとめ •  HLE のない世界では TTAS は常に効果アリ •  HLE と TTAS を組み合わせると –  並列度小だと投機実行そのものを抑えられてス ループットが伸び悩むデメリットあり –  並列度大だと一度に投機実行するスレッドを少な く抑えることができるため効果あり –  上記は今のところあまり自信のある仮説ではない 30
  • 31. まとめ •  HLE と TTAS の組み合わせは一長一短 –  デフォルトを選べと言われたら HLE + TTAS –  競合 100% の状況では TTAS のみ使う •  HLE を使うべき条件 –  条件1: 競合が起きにくい (read 比率が高い) –  条件2: クリティカルセクション実行時間が短い –  条件3: アクセス対象メモリが少ない •  条件 2, 3 を誰か探求してください.. 31