【问题标题】:Is it possible to coax std::atomic<T> to output CMPXCHG16B是否可以哄 std::atomic<T> 输出 CMPXCHG16B
【发布时间】:2015-03-24 11:52:11
【问题描述】:

对于我对在 Windows x64 上使用原子互锁操作不感兴趣的类型,是否可以哄骗 std::atomic 输出 CMPXCHG16B,或者我只需要吸干它并手动执行原子操作?我可以让 GCC/Clang 在 Linux 上执行此操作,所以我怀疑这只是 Microsoft 标准库的问题。

struct Byte16
{
    int64_t a, b;
};

std::atomic<Byte16> atm;
Byte16 a = { 1, 2 };
atm.compare_exchange_strong(...); // This has a lock on Windows, not on Linux version of code

【问题讨论】:

  • 处理器兼容性?一些较旧的 CPU 没有该指令:也许您需要针对更窄的目标进行编译?
  • @Yakk 我已经考虑过了,但是我无法确定要传递到 ICC 的标志。 .
  • 试过these options?从最“强大”的开始,看看它是否能解决你的问题?我只是在这里猜测和搜索。
  • 看起来确实是微软标准库的问题。通过标头,只有最多 8 字节原子的特化。
  • 对于未来的读者,here's pure C++ std::atomic&lt;struct&gt; code that compiles to lock cmpxchg16b 与 gcc 或 clang 与 -mcx16 以启用该指令的使用(不幸的是,这不是 x86-64 的基线:最早的 CPU 中缺少)。

标签: c++ windows visual-studio c++11 icc


【解决方案1】:

在窗口中使用 __m128

#include <emmintrin.h>
//...
  std::atomic<__m128> a, c;
  __m128 b;
  a.compare_exchange_strong(b,c);
///...

【讨论】:

  • std::atomic&lt;__m128&gt; atom; assert(atom.is_lock_free()); 失败。
  • 那么你需要使用win32 API InterlockedCompareExchange128。
  • 我知道。我在问是否有办法避免手动完成所有爵士乐。
猜你喜欢
  • 2018-11-22
  • 1970-01-01
  • 2016-08-10
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 2021-06-21
  • 1970-01-01
相关资源
最近更新 更多