abort した時のフラグを見てみる。 immintrin と -mrtm を使うのがラクそうだったので、インラインアセンブリをやめてみました。まぁ等価な関数を書くのも簡単そうではあります。
https://github.com/shinh/test/blob/master/tsx_abort.cc
実行結果は
xabort_explict: 1 42 xabort_capacity_sleep: 0 xabort_capacity_loop: 0 xabort_capacity_copy4096: 8 0 xabort_capacity_copy32768: 8 0 xabort_recursive0: 20 0 xabort_recursive7: 20 0 xabort_recursive8: 20 0 xabort_conflict0: 6 xabort_conflict30: 6 xabort_conflict40: 6 xabort_conflict63: 6
など。結構よく変わりますが。マニュアルとかしっかり読んでませんが、それぞれのステータスのざっくりと大雑把な感覚を
- _XABORT_EXPLICIT: _xabort したら来る。 _xabort ってパラメータ渡せるけど、そもそも、どういう時 _xabort が欲しいのかよくわかってない…
- _XABORT_RETRY|_XABORT_CONFLICT: conflict 単体で来たことはないので、必ずセットなのかなという感があるけど。 conflict は cache line 単位つまり 64 bytes の領域ごとぽい。
- _XABORT_CAPACITY: すっごいざっくりと、1000命令とかそういうオーダーの命令実行すると限界が来る。
- _XABORT_DEBUG: breakpoint 仕込むとこれ出る。どうやってデバッグするんだろう…
- _XABORT_NESTED: 8回nestしたら怒られた。