gpt4 book ai didi

c++ - 如何在 C++ 中自动添加和获取 128 位数字?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:43 24 4
gpt4 key购买 nike

我使用 Linux x86_64 和 clang 3.3。

这在理论上有可能吗?

std::atomic<__int128_t>不起作用(对某些函数的 undefined reference )。

__atomic_add_fetch 也不起作用(“错误:还不能编译这个原子库调用”)。

两者都是 std::atomic__atomic_add_fetch使用 64 位数字。

最佳答案

用一条指令不可能做到这一点,但你可以模拟它并且仍然是无锁的。除了最早的 AMD64 CPU,x64 支持 CMPXCHG16B 指令。通过一些多精度数学,您可以很容易地做到这一点。

恐怕我不知道 GCC 中 CMPXCHG16B 的内在函数,但希望您知道有一个 CMPXCHG16B 的自旋循环。下面是一些未经测试的 VC++ 代码:

// atomically adds 128-bit src to dst, with src getting the old dst.
void fetch_add_128b(uint64_t *dst, uint64_t* src)
{
uint64_t srclo, srchi, olddst[2], exchlo, exchhi;

srchi = src[0];
srclo = src[1];
olddst[0] = dst[0];
olddst[1] = dst[1];

do
{
exchlo = srclo + olddst[1];
exchhi = srchi + olddst[0] + (exchlo < srclo); // add and carry
}
while(!_InterlockedCompareExchange128((long long*)dst,
exchhi, exchlo,
(long long*)olddst));

src[0] = olddst[0];
src[1] = olddst[1];
}

编辑:这里有一些未经测试的代码来 self 能找到的 GCC 内在函数:

// atomically adds 128-bit src to dst, returning the old dst.
__uint128_t fetch_add_128b(__uint128_t *dst, __uint128_t src)
{
__uint128_t dstval, olddst;

dstval = *dst;

do
{
olddst = dstval;
dstval = __sync_val_compare_and_swap(dst, dstval, dstval + src);
}
while(dstval != olddst);

return dstval;
}

关于c++ - 如何在 C++ 中自动添加和获取 128 位数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18177622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com