2014年2月13日木曜日

GCCでアトミックな変数操作

ARMでアトミックな変数操作をしたくてググっていたら、こちらに辿り着いた。

ほうほう。LDREX, STREXなんて命令があって、アトミックに操作できるよう自分以外を止めるのではなく、アトミックに操作できなかったらリトライするのか。普通はアトミックに操作できない方が確率的にレアだろうから、失敗した時しかやり直さないこの方法は良い性能が出そうだな。

…なんて思いながら読んでいたら、GCCには__sync_fetch_and_add()みたいな組み込み関数があるとのこと。ちょっと使ってみたら

.L3:
        ldrex   r1, [r3]
        add     r1, r1, #1
        strex   r2, r1, [r3]
        cmp     r2, #0
        bne     .L3
しっかりLDREX, STREXを吐いてくれた。ついでにx86でも試してみたら、lockプレフィックスを付けてくれていた。GCC限定だけど、こりゃいいわ。

0 件のコメント:

コメントを投稿