可以原子地进行提取与运算的最大数据类型?

2023-12-06

我想尝试使用如下方式自动重置 256 位:

#include <x86intrin.h>
#include <iostream>
#include <array>
#include <atomic>

int main(){

    std::array<std::atomic<__m256i>, 10> updateArray;

    __m256i allZeros = _mm256_setzero_si256();

    updateArray[0].fetch_and(allZeros);
}

但我收到有关该元素没有的编译器错误fetch_and()。这是否不可能,因为 256 位类型太大而无法保证原子性?

我还有其他方法可以实现这个吗?我正在使用海湾合作委员会。

如果不是,我可以自动重置的最大类型是什么 - 64 位?

编辑:任何 AVX 指令都可以原子地执行 fetch-AND 吗?


因此,有几个不同的问题需要解决:

  1. 处理器能做什么?
  2. 原子性是什么意思?
  3. 你能让编译器生成处理器能做的事情的代码吗?
  4. C++11/14 标准支持吗?

对于#1 和#2:

在 x86 中,有执行 8、16、32、64、128、256 和 512 位操作的指令。一个处理器将[至少如果数据与其自身的大小对齐]以原子方式执行该操作。然而,为了使操作成为“真正的原子”,它还需要防止数据更新中的竞争条件[换句话说,防止其他处理器读取、修改和写回同一位置]。除了少量的“隐含锁定”指令之外,这是通过向特定指令添加“锁定前缀”来完成的 - 这将对系统中的其他处理器执行正确类型的缓存对话[技术术语],以确保只有该处理器才能更新该数据。

我们不能使用带有 LOCK 前缀的 VEX 指令(来自 Intel 手册)

任何在 VEX 之前带有 LOCK 前缀的 VEX 编码指令都将 #UD

使用 AVX 指令需要 VEX 前缀,#UD 表示“未定义指令”——换句话说,如果我们尝试执行该代码,就会导致处理器异常。

因此,100% 确定处理器不能一次对 256 位执行原子操作。这个答案讨论了 SSE 指令原子性:SSE指令:哪些CPU可以进行原子16B内存操作?

如果指令无效,#3 就毫无意义。

#4 - 好吧,标准支持std::atomic<uintmax_t>, 而如果uintmax_t恰好是 128 或 256 位,那么你当然可以这样做。我不知道有任何处理器支持 128 或更高位uintmax_t,但语言并不能阻止它。

如果“原子”的要求不如“需要 100% 确保没有其他处理器同时更新它”那么强烈,那么使用常规 SSE、AVX 或 AVX512 指令就足够了 - 但会出现竞争条件如果您有两个处理器(核心)同时对同一位内存执行读/修改/写操作。

x86 上最大的原子操作是 CMPXCHG16B,如果其他两个寄存器中的值与内存中的值匹配,它将用内存中的内容交换两个 64 位整数寄存器。因此,您可以想出一些方法来读取一个 128 位值,并输出一些位,然后如果没有其他内容首先进入其中,则自动将新值存储回来 - 如果发生这种情况,您必须重复该操作,当然,它也不是单个原子与操作。

当然,在 Intel 和 AMD 之外的其他平台上,行为可能会有所不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可以原子地进行提取与运算的最大数据类型? 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern

随机推荐