在通用SIMD库eve中,我们正在研究支持长度不可知的sve但是,我们不能将sizeless寄存器 Package 到结构体中,以便围绕它进行元编程。
sve
sizeless
struct foo { svint8_t a; };
有什么办法吗?要么是clang要么是gcc。我发现了一些关于__sizeless_struct的讨论和一些补丁,但我认为它没有任何进展。我还发现了这些gcc测试-在结构体中没有封装寄存器。
__sizeless_struct
hfwmuf9z1#
不,很遗憾这不可能__sizeless_struct是Arm在Clang中作为SVE阿克勒的初始下游实现的一部分添加的一个实验性特性。主要目的是允许像svfloat32x3_t这样的元组类型直接在<arm_sve.h>中定义。但是该特性具有复杂的反趋势语义。它违反了C++的一个基本规则,即所有的类对象都有一个固定的大小,所以这将成为上游编译器的持续维护负担。__sizeless_struct(或类似的类型)可能不适用于可移植SIMD框架,因为无大小结构将继承无大小向量类型的所有限制:没有全局变量,不能在普通结构中使用,等等。所有SIMD目标都必须遵守这些限制,或者这些限制会因目标而异(限制可移植性)。对于希望支持可变长度向量的SIMD框架,基于函数的抽象可能是比基于类的抽象更好的起点。Google Highway就是这样的一个例子,它对SVE工作得很好。
svfloat32x3_t
<arm_sve.h>
1条答案
按热度按时间hfwmuf9z1#
不,很遗憾这不可能
__sizeless_struct
是Arm在Clang中作为SVE阿克勒的初始下游实现的一部分添加的一个实验性特性。主要目的是允许像svfloat32x3_t
这样的元组类型直接在<arm_sve.h>
中定义。但是该特性具有复杂的反趋势语义。它违反了C++的一个基本规则,即所有的类对象都有一个固定的大小,所以这将成为上游编译器的持续维护负担。__sizeless_struct
(或类似的类型)可能不适用于可移植SIMD框架,因为无大小结构将继承无大小向量类型的所有限制:没有全局变量,不能在普通结构中使用,等等。所有SIMD目标都必须遵守这些限制,或者这些限制会因目标而异(限制可移植性)。对于希望支持可变长度向量的SIMD框架,基于函数的抽象可能是比基于类的抽象更好的起点。Google Highway就是这样的一个例子,它对SVE工作得很好。