无法使用 ARM NEON 内在函数设置 4 个 floatx32 的向量

A.n*_*chi 2 c arm simd neon

我想从表中加载一些值并将它们设置为一个向量: 在第一种情况下,将向量的四个值设置为一个:

float32x4_t dest = vdupq_n_f32(a);
Run Code Online (Sandbox Code Playgroud)

当我阅读内在手册时,这一点非常明显。

在第二种情况下,将向量的四个值设置为表中的不同值。这有点棘手,因为没有相关说明,因此我执行了以下操作:

float32x4_t dest = {a3,a2,a1,a0};
Run Code Online (Sandbox Code Playgroud)

它不是内在的,但是基于网络上的其他出版物和论坛,它是我唯一的解决方案。可悲的是,我收到此错误:

error: expected expression before ‘{’ token
Run Code Online (Sandbox Code Playgroud)

任何人都可以为此提供帮助或有其他选择吗?

Pau*_*l R 5

如果您的编译器不支持这样的直接初始化(即您使用的不是 gcc 或 clang),那么您需要显式加载值,例如

const float init[4] = {a3,a2,a1,a0};
float32x4_t dest = vld1q_f32(init);
Run Code Online (Sandbox Code Playgroud)

请注意,您的第一个示例似乎是错误的 - 如果您尝试将所有 4 个向量元素设置为相同的值(如 SSE 的_mm_set1_ps),那么您将需要使用类似vdupq_n_f32.

  • @A.nechi 最终,无论您选择如何在 C 中表达它,给定宽度固定的 32 位指令编码,您永远不会将 128 位的任意数据放入寄存器,而无需多条指令和/或内存访问。如果 `a0`、`a1` 等代表任意分散的事物,并且没有临时副本就不能连续,那么考虑通过直接用 `vld1q_lane_f32()` 加载它们来显式构建向量。 (2认同)
  • 您可能需要查看 [DirectXMath](https://github.com/Microsoft/DirectXMath) 以了解各种功能的一些并行 SSE 与 ARM-NEON 实现。对于“向量常量”,库使用类型“XMVECTORF32”并且通常将它们声明为“静态常量”。这意味着它们是从只读数据段加载的,但它是在 SSE 或 ARM-NEON 中加载任意向量的更快方法之一。如果您为所有通道设置单个值,那么“vdupq_n_f32” 是一个不错的选择(唉,SSE 没有比复合“_mm_set_ps1”更好的东西)。 (2认同)