gpt4 book ai didi

c++ - 在标准类型上使用原子操作

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:41:07 28 4
gpt4 key购买 nike

目标:我要实现这个功能:

int atomicCAS(int* address, int compare, int val);

这是一个CUDA function ,但我想用 C++ 为 CPU 实现它。它必须与此 API 兼容,即我无法更改 address 的类型。

我假设通用硬件,例如amd64,和一个通用的编译器,例如GCC 或 Clang。

对应的C++ STL函数为std::atomic::compare_exchange_strong ,但是,这需要一个 std::atomic 类型,我不确定我是否可以像这样做:

((std::atomic<int>&) address)->compare_exchange_strong(...)

我还可以使用 GCC 内置函数 __atomic_compare_exchange_n但不确定是否有任何警告或什么是断言这是有效的良好检查。

最佳答案

我相信没有可移植的方法来做到这一点,主要是因为在 C++ 中 atomic s 可以用锁实现(或者通常是 sizeof(T) != sizeof(atomic<T>) )。

如您所述,您可以使用 GCC 内置函数。这些也被 libstdc++ 使用实现std::atomic<Integral> ,所以每当你需要实现一个相当于 std::atomic 的东西时方法可以看看bits/atomic_base.h .

对于 atomic::compare_exchange_strong :

_GLIBCXX_ALWAYS_INLINE bool
compare_exchange_strong(__int_type& __i1, __int_type __i2,
memory_order __m1,
memory_order __m2) volatile noexcept
{
memory_order __b2 = __m2 & __memory_order_mask;
memory_order __b1 = __m1 & __memory_order_mask;

__glibcxx_assert(__b2 != memory_order_release);
__glibcxx_assert(__b2 != memory_order_acq_rel);
__glibcxx_assert(__b2 <= __b1);

return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 0, __m1, __m2);
}

编辑:改编自之前的代码:

int atomicCAS(int* address, int *compare, int val)
{
return __atomic_compare_exchange_n(address, compare, val, 0,
__ATOMIC_SEQ_CST,
__ATOMIC_ACQUIRE);
}

注意 compare是一个 in-out 参数,失败时它将被当前值 *address 覆盖.此版本相当于 atomic<int>::compare_exchange_strong使用默认内存排序,参见 godbolt .

关于c++ - 在标准类型上使用原子操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50215312/

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