在通用 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。
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |