1

私は自分のプログラム用に小さなスラブ アロケーターを作成していますが、ロック メカニズムを備えたリストを使用する代わりに、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))
4

1 に答える 1

2

CTZ がある場合は、値を反転して末尾のゼロを数えます。

if (x == -1ULL)
    return /* failure? */;
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
于 2012-08-31T11:29:41.747 に答える