我正在为我的程序编写一个小的slab分配器,但不是使用带锁定机制的列表,在阅读了IBM关于无锁堆的文章之后,我决定实现类似的东西。然而,哪个GCC内在(ffs / ffz / ctz等...)将是最有效的,为什么?
我最可能的目标是具有CLZ
硬件指令的ARMv7和ARMv6处理器。
我想出了像
这样的东西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))
答案 0 :(得分:2)
如果您有CTZ,则只需反转该值并计算尾随零:
if (x == -1ULL)
return /* failure? */;
int index = __builtin_ctz(~x);
E.g。
v
x = 0000 1111 0000 1111 0000 1111 0000 1111
~x = 1111 0000 1111 0000 1111 0000 1111 0000
index = __builtin_ctz(~x) = 4