如何使用 gcc 或 clang 模拟 _mm256_loadu_epi32?

2024-01-04

英特尔的内在指南列出了内在:

_m256i _mm256_loadu_epi32 (void const* mem_addr);
/*
   Instruction: vmovdqu32 ymm, m256
   CPUID Flags: AVX512VL + AVX512F
   Description
       Load 256-bits (composed of 8 packed 32-bit integers) from memory into dst.
       mem_addr does not need to be aligned on any particular boundary.
   Operation
   a[255:0] := MEM[mem_addr+255:mem_addr]
   dst[MAX:256] := 0
*/

但 clang 和 gcc 不提供此内在函数。相反,他们提供(在文件中avx512vlintrin.h) 仅屏蔽版本

_mm256_mask_loadu_epi32 (__m256i, __mmask8, void const *);
_mm256_maskz_loadu_epi32 (__mmask8, void const *);

归结为相同的指令vmovdqu32。我的问题:我该如何模仿_mm256_loadu_epi32:

 inline _m256i _mm256_loadu_epi32(void const* mem_addr)
 {
      /* code using vmovdqu32 and compiles with gcc */
 }

不编写汇编,即仅使用可用的内在函数?


只需使用_mm256_loadu_si256像正常人一样。 AVX512 内在给您的唯一东西是一个更好的原型(const void*代替const __m256i*)这样你就不必编写难看的强制转换。

@chtz 建议您可能仍然想自己编写一个包装函数来获取void*原型。但不要称呼它_mm256_loadu_epi32;某些未来的 GCC 版本可能会添加它以与 Intel 的文档兼容并破坏您的代码。

从另一个角度来看,不幸的是编译器没有将其视为 AVX1 内在函数,但我猜不优化内在函数的编译器 https://stackoverflow.com/questions/55747789/the-effect-of-architecture-when-using-sse-avx-intrinisics,并且允许您使用尚未启用的 ISA 扩展中的内部函数,需要这种线索来知道它们何时可以使用 ymm16-31。


你甚至不希望编译器发出vmovdqu32 ymm当你不戴口罩时;vmovdqu ymm更短并且exactly一样的东西,与 EVEX 编码指令混合不会受到任何惩罚 https://stackoverflow.com/questions/46080327/what-is-the-penalty-of-mixing-evex-and-vex-encoded-scheme。编译器总是可以使用vmovdqu32 or 64如果它想加载到 ymm16..31,否则你希望它使用较短的 VEX 编码 AVX1vmovdqu.

我很确定 GCC 会对待_mm256_maskz_epi32(0xffu,ptr)完全一样_mm256_loadu_si256((const __m256i*)ptr)无论您使用哪一个,都会生成相同的汇编。它可以优化掉0xffumask 并简单地使用未屏蔽的负载,但您的源代码中不需要这种额外的复杂性。

But unfortunately GCC9 and earlier will pessimize to vmovdqu32 ymm0, [mem] when AVX512VL is enabled (e.g. -march=skylake-avx512) even when you write _mm256_loadu_si256. This was a missed-optimization, GCC Bug 89346 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89346.

只要没有屏蔽,使用哪种 256 位加载内在函数(对齐与未对齐除外)并不重要。

Related:

  • 错误:“_mm512_loadu_epi64”未在此范围内声明 https://stackoverflow.com/questions/53604986/error-mm512-loadu-epi64-was-not-declared-in-this-scope
  • _mm512_load_epi32 和 _mm512_load_si512 有什么区别? https://stackoverflow.com/questions/53905757/what-is-the-difference-between-mm512-load-epi32-and-mm512-load-si512
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 gcc 或 clang 模拟 _mm256_loadu_epi32? 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 为什么libc++的shared_ptr实现使用完整内存屏障而不是宽松内存屏障?

    在boost的实现中shared ptr 它用放松内存排序以增加其引用计数 https github com boostorg smart ptr blob master include boost smart ptr detail sp
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • 如何使用 PIL 优化调色板图像大小?

    我的目标是在黑色图像上绘制一些多边形 以使所得图像的总尺寸尽可能小 所以我在维基上读了一篇关于索引颜色的文章 link https en wikipedia org wiki Indexed color 并且这对我来说似乎是一个不错的选择
  • MSSQL/dblib 的 PDO 日期时间格式

    MSSQL 2005 数据库具有排序规则 German Phonebook BIN 但这并不重要 与数据库的连接是通过 PDO 和 FreeTDS 完成的 在 Debian Squeeze 下使用 PHP 当我尝试从表中选择日期时间值时 我
  • 如何注释掉 XML 元素(使用 minidom DOM 实现)

    我想注释掉 xml 文件中的特定 XML 元素 我可以删除该元素 但我更愿意将其注释掉 以备以后需要 我目前使用的删除元素的代码如下所示 from xml dom import minidom doc minidom parse myXml
  • Django 编辑用户配置文件

    我正在尝试在前面创建一个 编辑个人资料 表单 发生的情况是我的表单 我不是 100 确定 尝试创建一个用户 而不是查找当前用户并更新他的个人资料 所以我认为这就是问题所在 在这里检查了很多问题 但没有一个足够清楚 我尝试编辑的字段是电子邮件
  • 此处不允许使用列 Oracle SQL 处理多个列

    我正在尝试将记录插入表中 但当我插入此记录时 我的 项目评级列 下例中的 PG 上出现 此处不允许列 错误 INSERT INTO ITEM VALUES item s1 NEXTVAL 786936161878 SELECT common
  • Rails 反跳延迟作业后台任务?删除重复项

    去抖是推迟函数 作业执行直到经过一定时间之后的常用方法 用例 来自多个用户的活跃聊天对话 他们不应该收到每条键入消息的电子邮件通知 但很可能在几分钟的静默后 如果消息未读 用户应该会看到一条通知 延迟作业 没有解决方案 有相关问题 http
  • 互斥查询

    Question 您如何将产生互斥结果的 IF ELSE 分配到产生相同结果的查询中 Use Case 作为主体 当前登录的用户 我可以获得组织中的用户列表 如果我被分配到任何部门 那么用户列表是分配到相同部门的较小的集合 Example
  • OpenCV C++ 转换为 Java 以解决形状检测问题

    我们对 openCV Java 开发有点陌生 遇到了一个问题 我们正在努力转型这段代码 https github com bsdnoobz opencv code blob master shape detect cpp到 Android
  • Python3 - Sympy:展开三角函数的乘积

    我找不到让 SymPy 扩展产品的方法 例如cos a cos b 转化为角度和的三角函数之和 from sympy import init printing wrf wlo t symbols omega RF omega LO t c
  • 如果我的状态没有改变,还需要 OTP 吗?

    我有一个 erlang 项目 其状态完全是只读的 由 ets 表和编译模块 https stackoverflow com questions 5130382 erlang gen server with a large state 代码启
  • 多处理中的共享内存对象

    假设我有一个内存很大的 numpy 数组 我有一个函数func它将这个巨大的数组作为输入 以及一些其他参数 func不同参数可以并行运行 例如 def func arr param do stuff to arr param build a
  • 命名参数的 Groovy 用法

    我有一个像这样的绝妙方法 def createMyObj id instanceId isValid def myObj new SomeObj myObj setId id myObj setInstanceId instanceId m
  • 聚合静态库

    我尝试将多个 a 文件聚合为一个文件 命令如下 TARGET libnumpy a DIR build lib linux x86 64 2 6 numpy FILES DIR core sort a DIR core multiarray
  • Safari AJAX 错误 - 无法加载资源

    从今天开始 我正在开发的网络应用程序中出现了一个非常奇怪的错误 我没有对代码做任何事情 但日复一日地出现了这个错误 我向运行 MAMP PRO 的本地服务器执行 AJAX 请求 不是使用 jquery 而是使用普通 js 在 Chrome
  • JSF 转换器导致验证器被忽略

    这是该字段
  • 基于总和的 Hibernate 属性

    我发现我可以使用 hibernate 来使用 HQL 获取多个实体的总和 如下所示 public Long getEnvelopeTotal AbstractEnvelope envelope String query select sum
  • ISO 8601:2004 中的 C 预处理器 __TIMESTAMP__

    我怎样才能拥有一个 TIMESTAMP ISO 8601 2004 中的替代品 TIMESTAMP Sat Jul 6 02 50 06 2013 vs TIMESTAMP ISO 2013 07 06T00 50 06Z 噢 乐观主义者
  • 如何在iOS中永远重复动画? [复制]

    这个问题在这里已经有答案了 在我看来 我想永远重复一个动画 下面是我的代码 UIView animateWithDuration 0 5f delay 0 49f options UIViewAnimationOptionCurveEase
  • XML 架构 - 只有一个元素应将属性设置为 true

    我如何定义一个只能在一个元素中设置为 true 的布尔属性 以下代码段必须无效
  • 如何使用 gcc 或 clang 模拟 _mm256_loadu_epi32?

    英特尔的内在指南列出了内在 m256i mm256 loadu epi32 void const mem addr Instruction vmovdqu32 ymm m256 CPUID Flags AVX512VL AVX512F De