2015年6月30日
TSX は cmpxchg のかわりに使えるか?
ARMのldrexとstrexのコードを見て、なんとなくx86のcmpxchgより読みやすい気がしたので、x86にもll/sc相当が欲しいなと思ったのですが、よく考えたら今のx86にはTMがあったのを思い出しました。
PPCのll/scやARMでそれに相当するldrex/strexは一個のワード、一個のキャッシュラインしか値を監視できないですが、x86 の TSX は、複数キャッシュラインを監視できるわけで、TSXがあれば、ll/sc, ldrex/strex 相当のことができそうです。
問題はパフォーマンスで、衝突しないときにも無駄なオーバーヘッドがあると少し使うのは心苦しいです。
というわけで、x86 TSXを ll/sc がわりに使った場合、どのぐらいオーバーヘッドがあるか調べてみました
結果は、
arch | 命令 | cycle |
i7-5600U | TSX 1cacheline | 64 |
TSX 8cacheline | 104 | |
cmpxchg | 21 | |
load+store | 7 | |
Cortex-A53 | ldrex+strex | 12.2 |
load+store | 4.2 | |
Cortex-A15 | ldrex+strex | 26 |
load+store | 7.1 |
というようになりました。
条件完全に揃えたわけではないので、公平な比較ではないですが、TSX はやはりそれなりのオーバーヘッドがあって、
cmpxchg を捨てて全部TSXにする、というわけにはいかないようですね…