31
Intel TSX HLE を触ってみた 追加実験 (TTAS) 2013-10-22 星野喬@サイボウズ・ラボ / @starpoz 1

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

Embed Size (px)

DESCRIPTION

HLE と TTAS (Test and Test-and-set) の組み合わせについて評価

Citation preview

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

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

2013-10-22 星野喬@サイボウズ・ラボ / @starpoz

1

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

頂いたコメント

2

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

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); } };

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

再実験

•  Expr1: simple counter(s) •  Expr5: map operations

•  詳細は元資料参照のこと – http://www.slideshare.net/starpos/intel-tsx-

hlex86opti6r2

4

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

実験環境

•  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

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

実験方法

•  スレッドを必要なだけ起動して,X 秒間クリティカルセクション (CS) を繰り返し実行

•  Spinlock を使って CS の排他を取る –  HLE 有効/無効 –  TTAS 有効/無効 – 終了判定のために CS 実行毎に atomic<bool> を load するオーバーヘッドあり

•  CS の実行回数の合計値を X で割ったものを スループットとする

•  上記実験を Y 回行い,スループットの avg, min, max を計算

6

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

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_++; }

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

Expr1: collision 100%

8 10 sec, 20 trials

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

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

Expr1: collision 0%

9 10 sec, 20 trials

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

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

Expr1 まとめ

•  そもそも競合しやすい状況では HLE は投機実行に失敗しやすいのでオーバーヘッドの分だけ損

•  競合しにくい状況では HLE はスケールするため,オイシイ

•  Expr1 だけ見ると,HLE の有無に関わらず TTAS は常に効果がある

10

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

Expr5:

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

•  手段: – Map<uint32_t, uint32_t> をひとつの spinlock で排他

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

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

11

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

Expr5: std::map

12

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

Expr5: 10K items read 0%

13 10 sec, 20 trials

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

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

Expr5: 10K items read 90%

14 10 sec, 20 trials

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

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

Expr5: 10K items read 99%

15 10 sec, 20 trials HLE の効果が見える.TTAS と組み合わせると一長一短

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

Expr5: 10K items read 100%

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

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

Expr5: 1M items read 0%

17 10 sec, 20 trials

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

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

Expr5: 1M items read 90%

18 10 sec, 20 trials

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

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

Expr5: 1M items read 99%

19 10 sec, 20 trials

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

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

Expr5: 1M items read 100%

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

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

Expr5: B-tree

21

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

Expr5: 10K items read 0%

22 10 sec, 20 trials

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

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

Expr5: 10K items read 90%

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

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

Expr5: 10K items read 99%

24 10 sec, 20 trials HLE を使った方が良い結果に(std::map は一長一短のまま) ただし並列度 1 を除く.

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

Expr5: 10K items read 100%

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

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

Expr5: 1M items read 0%

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

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

Expr5: 1M items read 90%

27 10 sec, 20 trials

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

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

Expr5: 1M items read 99%

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

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

Expr5: 1M items read 100%

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

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

Expr5: まとめ

•  HLE のない世界では TTAS は常に効果アリ •  HLE と TTAS を組み合わせると – 並列度小だと投機実行そのものを抑えられてスループットが伸び悩むデメリットあり

– 並列度大だと一度に投機実行するスレッドを少なく抑えることができるため効果あり

– 上記は今のところあまり自信のある仮説ではない

30

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

まとめ

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

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

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

31