2013-08-02 79 views
1

我使用GCC's atomic builtins來增加一個共享的volatile int。我想要做的就是增加價值,我不關心返回值。我應該更喜歡fetch_and_add還是add_and_fetch?我沒有看到文檔中的任何內容,表明其中一方會有性能優勢。這真的不重要嗎?更喜歡fetch_and_add或add_and_fetch?

另外,因爲我實際上並不需要自動讀取值,有沒有更好的方法來增加volatile int,因爲我實際上沒有讀取返回值?

這顯然是與架構相關的,因此您可以假定我使用的是x64。如果這有所幫助,我特別使用AMD Opteron CPU。

+0

它只是一種預感,但它可能是依賴於硬件。 ..測量它。 –

+0

@KolyolyHorvath - 是的,的確如此。我更新了這個問題,使其更清楚地表明我在一個相當標準的x64系統上。 – DaoWen

回答

2

它取決於您的硬件,取決於變量的大小,增量值和編譯器選項。

要檢查它,請將一個小C程序翻譯爲程序集。

volatile int init; 
void foo(void) { 
    __sync_fetch_and_add(&init,1); 
    __sync_add_and_fetch(&init,1); 
} 

將'gcc -S x.c'翻譯成文件x.s. 在x.s最有意思的是

lock addl  $1, init(%rip) 
    lock addl  $1, init(%rip) 

這表明這兩個內部函數轉換成相同的彙編代碼(這裏在Intel X64)。

你也可以用-march =本地和/或-O3或自己喜歡的選項嘗試只是爲了看看它是永遠不變的...