ARM-SVE:包装运行时大小的寄存器

Den*_*kiy 2 gcc armv8 sve

在通用 SIMD 库中,我们正在研究支持长度不可知的问题sve

但是,我们无法将sizeless寄存器包装到结构中以对其进行一些元编程。

struct foo {
  svint8_t a;
};
Run Code Online (Sandbox Code Playgroud)

有办法做到吗?要么 clang 要么 gcc。

我发现一些讨论__sizeless_struct和一些补丁到处乱飞,但我认为它没有去任何地方。我还发现了这些gcc 测试- 没有将寄存器包装在结构中。

小智 5

不,不幸的是这是不可能的(在撰写本文时)。 __sizeless_struct是 Arm 添加的一个实验性功能,作为 Clang 中 SVE ACLE 的初始下游实现的一部分。主要目的是允许元组类型svfloat32x3_t直接在<arm_sve.h>. 但该功能具有复杂的、反趋势的语义。它打破了 C++ 的基本规则之一,即所有类对象都具有恒定的大小,因此这将成为上游编译器的持续维护负担。

__sizeless_struct(或类似的东西)对于可移植的 SIMD 框架可能是不可接受的,因为无大小的结构将继承无大小的向量类型的所有限制:没有全局变量,在普通结构中不使用等。要么所有 SIMD 目标都会必须遵守这些限制,否则限制会因目标而异(限制可移植性)。

对于想要支持可变长度向量的 SIMD 框架来说,基于函数的抽象可能是比基于类的抽象更好的起点。 Google Highway就是一个例子,它非常适合 SVE。