Upload
takashi-hoshino
View
3.430
Download
0
Embed Size (px)
DESCRIPTION
HLE と TTAS (Test and Test-and-set) の組み合わせについて評価
Citation preview
Intel TSX HLE を触ってみた 追加実験 (TTAS)
2013-10-22 星野喬@サイボウズ・ラボ / @starpoz
1
頂いたコメント
2
TTAS (test-and-test-and-set)
• Test and test-and-set
3
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); } };
再実験
• Expr1: simple counter(s) • Expr5: map operations
• 詳細は元資料参照のこと – http://www.slideshare.net/starpos/intel-tsx-
hlex86opti6r2
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
Counter
Expr1: simple counter(s)
• クリティカルセクションループ
• パラメータ – 競合率 100%: counter を全スレッドで共有 – 競合率 0%: スレッド毎に counter を持つ
• キャッシュラインが異なるように 64byte 毎に配置
7
Counter
競合率 100% 競合率 0%
Thread Thread
while (!isEnd_.load(std::memory_order_relaxed)) { Spinlock<useHLE, useTTAS> lk(mutex_); counter_++; }
Expr1: collision 100%
8 10 sec, 20 trials
投機的実行がほとんど失敗するので HLE のオーバーヘッドが スループットに反映してしまっていると思われる TTAS は HLE と一緒に使っても効果が見える
Expr1: collision 0%
9 10 sec, 20 trials
HLE なしでは明らかに TTAS を使った方が良い HLE と一緒に使う場合でも効果があるようだ
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%
13 10 sec, 20 trials
HLE なしだと TTAS の効果が大きい このパラメータでは HLE はオーバーヘッド大
Expr5: 10K items read 90%
14 10 sec, 20 trials
HLE と TTAS を一緒に使うと並列度大の領域で効果が出る ただし,並列度小だと HLE は足をひっぱる
Expr5: 10K items read 99%
15 10 sec, 20 trials HLE の効果が見える.TTAS と組み合わせると一長一短
Expr5: 10K items read 100%
16 10 sec, 20 trials HLE と TTAS の組み合わせが並列度大の領域で効果アリ TTAS ナシの場合は test-and-set の数によって律速しているのか?
Expr5: 1M items read 0%
17 10 sec, 20 trials
HLE の有無よりも TTAS の有無が大きな効果 TTAS は競合が多いときに test-and-set の実行数が減り, HLE は競合が少ないときに楽観的投機実行が成功しやすいので, この結果と矛盾しない
Expr5: 1M items read 90%
18 10 sec, 20 trials
Read が増えたので,HLE の効果が相対的に大きくなった 10K items のときと同様に TTAS との組み合わせ効果は 並列度によって一長一短
Expr5: 1M items read 99%
19 10 sec, 20 trials
さらに Read が増えたので並列度小の領域でも HLE の楽観的実行が成功しやすくなったと思われる
Expr5: 1M items read 100%
20 10 sec, 20 trials TTAS と HLE の組み合わせが大きな効果を発揮
Expr5: B-tree
21
Expr5: 10K items read 0%
22 10 sec, 20 trials
HLE は並列度小では無駄. TTAS のみを有効にした方が余程良い結果.
Expr5: 10K items read 90%
23 10 sec, 20 trials std::map と傾向は変わらないが,HLE が効きやすい? (実際のメモリ使用量の違いのせいかも知れない)
Expr5: 10K items read 99%
24 10 sec, 20 trials HLE を使った方が良い結果に(std::map は一長一短のまま) ただし並列度 1 を除く.
Expr5: 10K items read 100%
25 10 sec, 20 trials read 99% と同様の結果.最高性能は std::map に及ばず
Expr5: 1M items read 0%
26 10 sec, 20 trials 10K items と同様の結果.
Expr5: 1M items read 90%
27 10 sec, 20 trials
アイテム数 10K から 1M に増えると HLE のオーバーヘッドが相対的に小さくなったと見て良いか. TTAS は常に有効. 並列度大の領域では HLE の投機実行失敗のペナルティが見える.
Expr5: 1M items read 99%
28 10 sec, 20 trials read 90% と同様の傾向. 投機実行が成功しやすくなり,さらにスケールする.
Expr5: 1M items read 100%
29 10 sec, 20 trials read 90%, 99% と同様(ry
Expr5: まとめ
• HLE のない世界では TTAS は常に効果アリ • HLE と TTAS を組み合わせると – 並列度小だと投機実行そのものを抑えられてスループットが伸び悩むデメリットあり
– 並列度大だと一度に投機実行するスレッドを少なく抑えることができるため効果あり
– 上記は今のところあまり自信のある仮説ではない
30
まとめ
• HLE と TTAS の組み合わせは一長一短 – デフォルトを選べと言われたら HLE + TTAS – 競合 100% の状況では TTAS のみ使う
• HLE を使うべき条件 – 条件1: 競合が起きにくい (read 比率が高い) – 条件2: クリティカルセクション実行時間が短い – 条件3: アクセス対象メモリが少ない
• 条件 2, 3 を誰か探求してください..
31