2012-08-31 50 views
1

我正在爲我的程序編寫一個小的slab分配器,但不是使用帶鎖定機制的列表,而是在IBM讀取無鎖堆上的一篇文章後,我決定實施類似的東西。然而,哪些GCC內在(ffs/ffz/ctz等)將是最有效的,爲什麼?從右邊的一個單詞中找到第一個零位(LSB)

我最有可能的目標將是ARMv7和ARMv6處理器與CLZ硬件指令。

我的東西像川方

uint32_t tmp; 
uint32_t new_bits; 
uint32_t old_bits; 

do { 
    old_bits = slab->bitmap; 
    tmp = <function>(old_bitmap); 
    new_bits = old_bits | (1 << tmp); 
} while(cpu_atomic_cmpxchg(&slab->bitmap, old_bits, new_bits) != OS_OKAY); 

return ((void *) slab->start + (tmp * slab->blksize)) 

回答

2

如果你有CTZ那麼就顛倒值並計算尾隨零:

int index = __builtin_ctz(~x); 

例如

         v 
x = 0000 1111 0000 1111 0000 1111 0000 1111 
~x = 1111 0000 1111 0000 1111 0000 1111 0000 
index = __builtin_ctz(~x) = 4 
+0

但不會計數倒置位圖的「前導」零給我第一個從左邊的未置位? OOPS,我錯誤的想從正確的角度改變問題。 – sgupta

+0

行 - 已更新。 –

+0

謝謝,但是有沒有什麼危害我應該知道,比如位圖是零還是未定義的情況? – sgupta

相關問題